java - 你能在 PHP 中获得同样的 Java SHA-1 吗?

标签 java php hash passwords sha

我发现自己需要将网站平台从 Java 更改为 PHP,但我想保留所有用户的密码...

在将散列值作为网站密码写入之前,我让这段代码对密码进行散列处理:

MessageDigest md = null;
md = MessageDigest.getInstance("SHA");
md.update(plaintext.getBytes("UTF-8"));
byte raw[] = md.digest();
hash = new Base64().encodeToString(raw).replaceAll("\n", "").replaceAll("\r", "");

我认为 Java 代码对密码进行了 SHA-1 哈希处理,但在此之前它被字节编码为 UTF-8,之后是 Base64 编码。

我想让 PHP 代码执行相同的操作,即为相同的密码返回与 Java 中相同的哈希值,只是看起来执行 SHA-1 哈希的 PHP 代码我不会返回与散列的 Java Base64 解码值相比,相同的 SHA(-1,不是 Base64 编码,我认为?)值...这可能与我在 PHP 中的密码不是 UTF-8 字节这一事实有关请先编码(我怎样才能在 PHP 中做到这一点)?

附注

另一个奇怪的事情...我的 Java 密码都是 28 个字符长(通常是这样的 rnwn4zTNgH30l4pP8V05lRVGmF4=)...但是 Base64().decode(hash) 这些密码哈希值的长度为 10 个字符(示例 [B@14e1f2b)。

我认为 Base64 对每 3 个字符(28 或 27,不包括 padding = 字符,比这 10 个字符大三分之一)做了额外的 1 个字符,所以我可能在某种程度上做错了解码调用? ?

最重要的是,PHP 中的 SHA-1 密码哈希值是 40 个字符长(在 UTF-8 mysql 数据库中),就像这样 dd94709528bb1c83d08f3088d4043f4742891f4f?

最佳答案

[B@14e1f2b 绝对不是哈希。这是从 byte[]String 的隐式转换的结果。

看起来你在做这样的事情:

String decodedHash = Base64().decode(hash); // Produces [B@14e1f2b

然而,哈希的正确表示是一个字节数组:

byte[] decodedHash = Base64().decode(hash); 

关于java - 你能在 PHP 中获得同样的 Java SHA-1 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4769007/

相关文章:

sql - 对除主键之外的所有列定义 UNIQUE 约束是一个好主意吗?

python - 根据内容相似性在网格中排列文档

Java Swing 计时器中断

javascript - 聊天应用程序如何在没有重复 ajax 调用的情况下工作?

PHP:自动生成的 XML 回车实体出现 w/SimpleXML 和 xpath

php - 使用 php 和 mysql 更新 html 表格

ruby - 纯 Ruby 并发哈希

java - 使用 Point 类的示例?

java - 我怎样才能延长2节课

java - 为什么指令重新排序的 volatile 发生前顺序失败?