PW_HASH_ITERATION_COUNT迭代sha512 + salt来散列密码吗?
在伪码中:
hash = sha512(concat(pw,salt));for (i = 1;i其中z = concat(x,y)是x和y的级联。
也许用MessageDigest?PW_HASH_ITERATION_COUNT是什么?有多少次迭代是最大的,这样甚至可以在一些旧设备(2.1+)上运行。更新更新
由于有充分的理由,我们将使用bcrypt加密我们的密码。我们使用jBCrypt实现。
不管怎样..。回答这个问题..。以上问题的代码是在MessageDigest中使用SHA-512的代码:
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import de.seduceme.utils.Base64;
public class PwStorage {
public static int PW_HASH_ITERATION_COUNT = 5000;
private static MessageDigest md;
public static void main(String[] args) {
String pw = "teüöäßÖst1";
String salt = "e33ptcbnto8wo8c4o48kwws0g8ksck0";
try {
md = MessageDigest.getInstance("SHA-512");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
throw new RuntimeException("No Such Algorithm");
}
String result = PwStorage.hashPw(pw, salt);
System.out.println(result);
// result: 2SzT+ikuO9FBq7KJWulZy2uZYujLjFkSpcOwlfBhi6VvajJMr6gxuRo5WvilrMlcM/44u2q8Y1smUlidZQrLCQ==
}
private static String hashPw(String pw, String salt) {
byte[] bSalt;
byte[] bPw;
try {
bSalt = salt.getBytes("UTF-8");
bPw = pw.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("Unsupported Encoding", e);
}
byte[] digest = run(bPw, bSalt);
for (int i = 0; i < PW_HASH_ITERATION_COUNT - 1; i++) {
digest = run(digest, bSalt);
}
return Base64.encodeBytes(digest);
}
private static byte[] run(byte[] input, byte[] salt) {
md.update(input);
return md.digest(salt);
}
}用这个Base64库。
发布于 2011-06-18 01:38:22
在这里阅读我的职位,特别是我链接到的关于密码散列的文章。
是的,您可以将MessageDigest用于SHA-512。每次调用digest时,对象的状态都会自动重置,这非常方便--您可以立即开始更新下一次迭代。
但我还是觉得你应该用bcrypt或者still来代替。为了你自己的利益和你的用户的利益。:-)
发布于 2011-06-18 02:14:34
发现一个HMAC足以完成您想要做的事情,并且它只执行两次迭代。
归结为
hash = sha512(concat(xor(salt,nonce2),sha512(concat(xor(salt,nonce1),pw)));https://stackoverflow.com/questions/6393292
复制相似问题