Хэширование паролей 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
- это соль, уникальная (и известная) строка, добавленная к вашему паролю перед хэшированием, для победы над радужными таблицами. Или это должно быть, по крайней мере. Ваш код просто берет его с самого пароля, что является бессмысленным. Это должна быть длинная случайная строка, которая хранится вместе с паролем.