Barra de senhas SHA2 em java
Estou a tentar usar palavras-passe com o SHA2.
Onde posso arranjar um pedaço de código java para fazer isso?
Já vi esse post, mas falta-me uma coisa.:
O armazenamento de senhas SHA2 com 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);
}
a frase é o texto que quero codificar, certo? E qual é a chave (Linha 2)
obrigado antecipadamente
11
4 answers
Primeiro, tens de ser claro o que queres fazer. Você diz que quer usar uma senha, mas o código que está a usar é para um MAC (Código de autenticação de Mensagens), especificamente, HMAC .
As erupções cutâneas e os MACs são coisas diferentes para fins diferentes (embora o HMAC envolva o uso de um hash). Você precisa ter certeza de que você está usando o certo para a sua exigência.
A razão pela qual lhe pedem para fornecer uma chave é porque os MACs precisam de uma chave. As erupções cutâneas fazem não:
public byte[] hash(String password) throws NoSuchAlgorithmException {
MessageDigest sha256 = MessageDigest.getInstance("SHA-256");
byte[] passBytes = password.getBytes();
byte[] passHash = sha256.digest(passBytes);
return passHash;
}
25
Author: rossum, 2011-07-27 11:12:57
Modifiquei um pequeno código da rossum, adicionei sal e converti o tipo de retorno ao texto, adicionei tentativa/ captura, talvez ajude a alguém:
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;
}
14
Author: thorin86, 2014-08-21 12:29:26
Você pode considerar usar a implementação do commons-codec
String hash = org.apache.commons.codec.digest.DigestUtils.sha256Hex(password +"salt");
10
Author: Dapeng, 2011-07-27 09:10:22
A frase seria a senha que estás a tentar proteger. {[[0]} é o sal, uma cadeia única (e conhecida) anexada à sua senha antes de atacar, para derrotar as mesas arco-íris. Ou devia ser, pelo menos. O seu código está a tirar da própria senha, o que é inútil. Deve ser uma cadeia aleatória longa que é armazenada junto com a senha digest.