SHA2 хеширование паролей в Java - PullRequest
11 голосов
/ 27 июля 2011

Я пытаюсь хэшировать некоторые пароли с SHA2.

Где я могу получить фрагмент кода java для make?

Я видел этот пост, но мне чего-то не хватает: Хранение пароля SHA2 с 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);
 }

Фраза - это строка, которую я хочу кодировать, верно?А что за ключ (строка 2)

Заранее спасибо

Ответы [ 4 ]

25 голосов
/ 27 июля 2011

Во-первых, вам нужно четко понимать, что вы хотите сделать.Вы говорите, что хотите хешировать пароль, но код, который вы используете, предназначен для MAC ( Код аутентификации сообщения ), в частности, HMAC .

Хэши и MACэто разные вещи для разных целей (хотя HMAC предполагает использование хэша).Вы должны быть уверены, что используете именно то, что вам нужно.

Причина, по которой вас просят предоставить ключ, заключается в том, что MAC нужен ключ.Хэши не:

public byte[] hash(String password) throws NoSuchAlgorithmException {
    MessageDigest sha256 = MessageDigest.getInstance("SHA-256");        
    byte[] passBytes = password.getBytes();
    byte[] passHash = sha256.digest(passBytes);
    return passHash;
}
14 голосов
/ 21 августа 2014

Я немного изменил код Россума, добавил соль и преобразовал возвращаемый тип в String, добавил try / catch, возможно, это кому-нибудь поможет:

    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;
}
10 голосов
/ 27 июля 2011

вы можете рассмотреть возможность использования реализации общего кодека

String hash = org.apache.commons.codec.digest.DigestUtils.sha256Hex(password +"salt");
0 голосов
/ 27 июля 2011

Фраза - это пароль, который вы пытаетесь защитить.key - это соль, уникальная (и известная) строка, добавленная к вашему паролю перед хэшированием, чтобы победить радужные таблицыИли так должно быть, по крайней мере.Ваш код просто берет его из самого пароля, что бессмысленно.Это должна быть длинная случайная строка, которая хранится вместе с дайджестом пароля.

...