gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:46:08 26 4
gpt4 key购买 nike

我的应用程序在 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);

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com