我发现自己需要将网站平台从 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/