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

Author: Community, 2011-07-27

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.
 0
Author: , 2011-07-27 06:36:55