java - Java 和 PHP 之间带盐的 SHA-512 不匹配

标签 java php hash sha512

我的应用程序在 Java 中使用加盐哈希。首先生成随机盐。然后将此盐添加到输入密码的 SHA-512 前缀,组合后的字符串再次为 SHA-512。实现如下:-

String password = testpwd.getText().toString();
SecureRandom rand = new SecureRandom();
byte[] randbytes = new byte[16];
rand.nextBytes(randbytes);
String encodedSalt = Base64.encodeToString(randbytes, Base64.DEFAULT);

MessageDigest digest = MessageDigest.getInstance("SHA-512");
digest.reset();
digest.update(password.getBytes("utf-8"));
byte[] pwdhash = digest.digest();
String encodedPwd = Base64.encodeToString(pwdhash, Base64.DEFAULT);

String saltedPassword = encodedSalt+encodedPwd ;

digest.reset();
digest.update(saltedPassword.getBytes("utf-8"));
byte[] pwdhash1 = digest.digest();
String encodedPwdSalt = Base64.encodeToString(pwdhash1, Base64.DEFAULT);

然后字符串encodedSalt和encodedPwdSalt被发送到Web服务器进行身份验证。 PHP加密如下:

$postpassword = $_POST['password'];
$postsalt = $_POST['salt'];
$salt = base64_decode($postsalt);
$password = base64_decode('postpassword');

密码“Ditglt@785”的 SHA-512 哈希值存储在数据库中。它的检索和处理如下:-

$getsaltpwd = $salt.$dbpassword ;
$dbsaltpwd = hash('sha512', $getsaltpwd);
if($dbpassword == $postpassword) {}

条件总是失败,身份验证也是如此。我该怎么办?

最佳答案

PHP 版本对原始 字节进行哈希处理,而 Java 版本对base64 编码 字符串进行哈希处理。

这是与您的 PHP 代码的功能相匹配的 Java 版本:

digest.reset();
digest.update(randbytes);
digest.update(pwdhash);
byte[] pwdhash1 = digest.digest();
String encodedPwdSalt = Base64.encodeToString(pwdhash1, Base64.DEFAULT);

话虽如此,将加盐加盐密码存储在数据库中并至少使用一些 key derivation function 会更安全。 (多次迭代哈希函数)以抵消对存储的哈希值的任何潜在的暴力破解。

关于java - Java 和 PHP 之间带盐的 SHA-512 不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50964534/

相关文章:

java - 拦截客户端与spring的断开连接?

java - Java红黑树中的空 child

php - Genesis 子主题的自定义帖子类型分页

php - 多个图像插入在每次插入后额外占用一行

c# - 在 C# 中获取字符串的 16 位哈希值

python - 如何对字典中的所有值求和?

java - 为什么 Java Step Return 会遇到断点

php - Mysql - 查找具有相同id的字段

PHP 仅对数字和字符进行字符串编码/解码

java - 测量特定监视器上的线程争用