Хэширование паролей 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)

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

Ответ 1

Во-первых, вам нужно четко понимать, что вы хотите делать. Вы говорите, что хотите хешировать пароль, но код, который вы используете, предназначен для MAC (Message Authentication Code), в частности 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;
}

Ответ 2

Я немного модифицировал код 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;
}

Ответ 3

вы можете рассмотреть возможность использования commons-codec

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

Ответ 4

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