2011-07-27 12 views
10

Próbuję hash kilka haseł z SHA2.Hasło hash SHA2 w java

Gdzie mogę uzyskać fragment kodu java, aby to zrobić?

Widziałem to stanowisko, ale mam coś brakujące: SHA2 password storage with Java

Mac mac = Mac.getInstance("HmacSha256"); 
SecretKeySpec secret = new SecretKeySpec(key.getBytes(), "HmacSha256"); 
mac.init(secret); 
byte[] shaDigest = mac.doFinal(phrase.getBytes()); 
String hash = ""; 
for(byte b:shaDigest) { 
    hash += String.format("%02x",b); 
} 

Wyrażenie to ciąg chcę zakodować prawda? A jaki jest klucz (linia 2)

góry dzięki

+0

FYI: można przeczytać kilka pytań dotyczących haszowania hasła. Chociaż dobrze jest hash haseł, nietrywialne jest robienie tego poprawnie. To pytanie ma kilka dobrych odpowiedzi: [Sugestie dotyczące biblioteki do mieszania haseł w Javie] (http://stackoverflow.com/questions/2860943/suggestions-for-library-to-hash-passwords-in-java) –

Odpowiedz

0

wyrażenie byłoby hasło, które starasz się chronić. key to sól, unikalny (i znany) ciąg dołączany do hasła przed haszowaniem, aby pokonać tabele tęczowe. A przynajmniej powinno być. Twój kod właśnie bierze go z samego hasła, co jest bezsensowne. Powinien to być długi losowy ciąg przechowywany razem z skrótem hasła.

8

można rozważyć użycie realizację Commons kodeki

String hash = org.apache.commons.codec.digest.DigestUtils.sha256Hex(password +"salt"); 
+0

To nie jest w Java SE – Supuhstar

22

Po pierwsze, trzeba być jasne, co to chcesz robić. Mówisz, że chcesz hash hasłem, ale kod, którego używasz, jest dla MAC (Message Authentication Code), konkretnie, HMAC.

Hashe i MAC to różne rzeczy do różnych celów (chociaż HMAC nie wymaga użycia skrótu). Musisz mieć pewność, że używasz właściwego dla swoich wymagań.

Powód, dla którego żądano podania klucza, jest taki, że komputery MAC wymagają klucza. Mieszań nie:

public byte[] hash(String password) throws NoSuchAlgorithmException { 
    MessageDigest sha256 = MessageDigest.getInstance("SHA-256");   
    byte[] passBytes = password.getBytes(); 
    byte[] passHash = sha256.digest(passBytes); 
    return passHash; 
} 
10

I zmodyfikowany kod danego małego Rossum, w dodatku soli i przekształcić powrocie typu String, dodać try/catch, może to pomoże komuś:

public String hash(String password) { 
    try { 
     MessageDigest sha256 = MessageDigest.getInstance("SHA-256"); 
     String salt = "some_random_salt"; 
     String passWithSalt = password + salt; 
     byte[] passBytes = passWithSalt.getBytes(); 
     byte[] passHash = sha256.digest(passBytes);    
     StringBuilder sb = new StringBuilder(); 
     for(int i=0; i< passHash.length ;i++) { 
      sb.append(Integer.toString((passHash[i] & 0xff) + 0x100, 16).substring(1));   
     } 
     String generatedPassword = sb.toString(); 
     return generatedPassword; 
    } catch (NoSuchAlgorithmException e) { e.printStackTrace(); }  
    return null; 
}