使用Java中的Bouncy Castle使用SHA-256哈希和AES进行密码存储

时间:2014-10-02 12:14:33

标签: java encryption bouncycastle

我是密码存储和Bouncy Castle的新手。

这是我的java代码:

// salt
java.security.SecureRandom rgen = new SecureRandom();
byte[] salt = rgen.generateSeed(20);
// add Bouncy Castle
java.security.Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
// aes secret key
javax.crypto.KeyGenerator kgen = KeyGenerator.getInstance("AES", "BC");
Key cleSecrete = kgen.generateKey();
// aes
javax.crypto.Cipher cipher = Cipher.getInstance("AES", "BC");
// sha-256
java.security.MessageDigest sha256 = MessageDigest.getInstance("SHA-256","BC");

// hash the clear password with the salt to avoid collisions
byte[] motDePasseHash = hasherSaler(motDePasseClair.getBytes("UTF-8"),salt);
// Encrypt the hash with the salt to get the salt back
byte[] chiffreBDD = chiffrerSalerHash(salt,motDePasseHash,cleSecrete );
// Store the cipher in DB
...

// Get back the hash and the salt from DB
byte[] deChiffreBDD = deChiffrer(chiffreBDD,cleSecrete );
byte[] saltBDD = extraireOctets(deChiffreBDD,0,19);
byte[] hashBDD = extraireOctets(deChiffreBDD,20,deChiffreBDD.length-1);
// hash the user intput
byte[] motDePasseHashCandidat = hasherSaler(motDePasseClairCandidat.getBytes("UTF-8"),saltBDD);
// Compare hased user input with DB hash 
boolean isMotDePasseOK = Arrays.equals(hashBDD,motDePasseHashCandidat);

private final byte[] hasherSaler(byte[] clair,byte[] salt) {
    byte[] concat = concatenerOctets(clair,salt);
    return sha256.digest(concat);
}
private final byte[] chiffrerSalerHash(byte[] salt,byte[] hash, Key cle) {
    cipher.init(true,cle);
    return cipher.doFinal(concatenerOctets(salt,hash));
}
private final byte[] deChiffrer(byte[] chiffre, Key cle) {
    cipher.init(false,cle);
    return cipher.doFinal(chiffre);
}

谢谢。

1 个答案:

答案 0 :(得分:0)

如果您只想验证密码,则只应使用PBKDF2(或bcrypt / scrypt)。不需要密码。盐可以不加密地存储。您可能希望使用额外的秘密附加到您保存的盐中,例如,源代码。不要忘记使用您的密码存储协议编号,否则以后无法升级。

至于您的代码,您不应该使用generateSeed来表示盐。您应该再使用update"AES"默认使用ECB模式,因此请指定其他模式。不要依赖违约。使用(可能衍生的)IV。在没有必要时,不要明确使用提供者。

好的,我可以坚持一段时间,但现在必须这样做。