【发布时间】:2018-06-21 09:02:37
【问题描述】:
我的应用程序在 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) {}
条件总是失败,身份验证也是如此。我该怎么办?
【问题讨论】:
-
与
$postpassword比较时,您不应该使用$dbsaltpwd而不是$dbpassword吗? -
base64_decode('postpassword');在你的第一个 PHP 块中做什么? (为什么要解码常量?) -
你也不应该在 PHP 中对你的 salt 进行 base64 解码,因为你在 Java 中对一个 base64 编码的 salt 进行哈希处理。
-
@John 您应该更具体地了解您想要的编码/合并/哈希步骤的过程。 Java 和 PHP 之间显然存在不匹配,我们只能猜测哪个进程是预期的。
-
@RobbyCornelissen 你是对的“使用 $dbsaltpwd 而不是 $dbpassword”。但是在这里发布问题时这是一个错字。在代码中就像你提到的那样。