Хеширование паролей SHA2 в java

Я пытаюсь хешировать пароли с помощью SHA2.

Где я могу взять фрагмент кода Java для этого?

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

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


person Encripterrr    schedule 27.07.2011    source источник
comment
К вашему сведению: вы можете прочитать несколько вопросов о хешировании паролей. Хешировать пароли - это хорошо, но сделать это правильно - нетривиально. На этот вопрос есть несколько хороших ответов: Предложения для библиотеки по хешированию паролей в Java < / а>   -  person Adam Paynter    schedule 27.07.2011


Ответы (4)


Во-первых, вам нужно четко понимать, что вы хотите делать. Вы говорите, что хотите хешировать пароль, но код, который вы используете, предназначен для 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;
}
person rossum    schedule 27.07.2011

Я немного изменил код rossum, добавил соль и преобразовал возвращаемый тип в 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;
}
person thorin86    schedule 21.08.2014

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

String hash = org.apache.commons.codec.digest.DigestUtils.sha256Hex(password +"salt");
person Dapeng    schedule 27.07.2011
comment
Этого нет в Java SE - person Ky Leggiero; 19.02.2014

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

person Community    schedule 27.07.2011