Seit Java Version 1.4 gibt es den SHA-512 Hash-Algorithmus im java.security-Package. Damit ist es möglich, sehr sichere Verschlüsselungen mit 512-Bit zu erzeugen. Wie man einen SHA-512 Hashwert bildet, zeigt der folgende Code:
Beispiel:
CreatePassword.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | import java.io.UnsupportedEncodingException; import java.security.NoSuchAlgorithmException; public class CreatePassword { public static void main(String argv[]) { try { String strTest = EncryptPassword.SHA512("Das hier ist eine SHA-Verschlüsselung mit 512 Bit."); System.out.println(strTest); // 128 Zeichen String strTest2 = EncryptPassword.SHA512("...und das hier auch!"); System.out.println(strTest2); // 128 Zeichen } catch (NoSuchAlgorithmException ex) { System.out.println(ex.getMessage()); } catch (UnsupportedEncodingException ex) { System.out.println(ex.getMessage()); } } } |
EncryptPassword.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class EncryptPassword { private static String convertToHex(byte[] data) { StringBuffer buf = new StringBuffer(); for (int i = 0; i < data.length; i++) { int halfbyte = (data[i] >>> 4) & 0x0F; int two_halfs = 0; do { if ((0 <= halfbyte) && (halfbyte <= 9)) buf.append((char) ('0' + halfbyte)); else buf.append((char) ('a' + (halfbyte - 10))); halfbyte = data[i] & 0x0F; } while(two_halfs++ < 1); } return buf.toString(); } public static String SHA512(String text) throws NoSuchAlgorithmException, UnsupportedEncodingException { MessageDigest md; md = MessageDigest.getInstance("SHA-512"); byte[] sha1hash = new byte[40]; md.update(text.getBytes("UTF-8"), 0, text.length()); sha1hash = md.digest(); return convertToHex(sha1hash); } } |
statt convertToHex reich auch einfach bigint
BigInteger number = new BigInteger(1,hash);
return number.toString(16);
Vielen Dank für die Info!
Um kompatibel mit der MySQL-Funktion SHA1() zu sein, eignet sich übrigens:
md = MessageDigest.getInstance("SHA-1");
md = MessageDigest.getInstance(„MD5“);
funktioniert auch tadellos.
Ja, genauso wie die anderen „Standard Algorithm Names„.
Das klingt jetzt ein wenig neunmal klug aber…
SHA-512 ist ein Hash-Algorithmus, kein Verschlüsselungsalgorithmus. Es ist nämlich unmöglich, aus dem Hash das Original wiederherzustellen, was bei einer Verschlüsselung aber (mit dem richtigen Schlüssel) möglich sein sollte. Verschlüsselungen sind über die Crypto-Api (angesprochen über javax.crypto.Cipher) möglich.
siehe da:
http://download.oracle.com/javase/1.4.2/docs/api/javax/crypto/Cipher.html
Vielen Dank Daniel. Dein Vorschlag wurde angenommen und umgesetzt! 🙂
Du hast ein kleines Problem… (warum nur haben Java-Programmierer immer so ein Problem mit Encodings ?)
md.update(text.getBytes(„UTF-8“), 0, text.length());
Wenn Dein Text Zeichen enthält, die in UTF-8 durch mehrere bytes dargestellt werden, hashst Du einen Teil des Passwords nicht …
einfacher und korrekter:
md.update(text.getBytes(„UTF-8“));