gpt4 book ai didi

java - Java 和 PHP 中的 SHA1 具有不同的结果

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:09:42 25 4
gpt4 key购买 nike

我知道有几个这样的问题,但我尝试了我在 stackoverflow 上找到的每一个解决方案,但我仍然没有得到预期的结果。

我试图在 Java 和 PHP 中将字符串转换为 sha1,但我得到了不同的结果。字符串是随机生成的。我检查了两端的字符串,它们是相同的(甚至尝试了在线比较工具)。

这是我在另一个应用程序中使用的相同代码,它在那里工作,但在本例中不是。

我尝试用 sha1 散列的一个字符串是:UgJaDVYEClRUD1cAAVUBVwRTB1MDAA9SBgcDBwNXAwNZBQdUAAACBA==

Java 结果:72c9bbe7eed0efe5e82ea9568136d8f52347259e

PHP 结果:f720d73d18a7bb9cf36808af17ce40621ebfb405

Java 代码

public static String sha1(String toHash)
{
String hash = null;
try
{
MessageDigest digest = MessageDigest.getInstance("SHA-1");
byte[] bytes = toHash.getBytes("ASCII"); //I tried UTF-8, ISO-8859-1...
digest.update(bytes, 0, bytes.length);
bytes = digest.digest();
StringBuilder sb = new StringBuilder();
for(byte b : bytes)
{
sb.append(String.format("%02X", b));
}
hash = sb.toString();
}
catch(NoSuchAlgorithmException e)
{
e.printStackTrace();
}
catch(UnsupportedEncodingException e)
{
e.printStackTrace();
}
return hash.toLowerCase(Locale.ENGLISH);
}

PHP代码

sha1("UgJaDVYEClRUD1cAAVUBVwRTB1MDAA9SBgcDBwNXAwNZBQdUAAACBA==");

任何帮助将不胜感激

更新

在 Java 和 PHP 中我做了以下事情:

Java

String toHash = "qwerty";
String hash = sha1(toHash); //Prints: b1b3773a05c0ed0176787a4f1574ff0075f7521e

toHash = Base64.encodeToString(toHash.getBytes("ASCII"), Base64.DEFAULT);
hash = sha1(toHash); //Prints: 88bfb2d77c3b42823bab820c1737f03c97d87c1b

PHP

$toHash = "qwerty";
sha1($toHash); //Prints: b1b3773a05c0ed0176787a4f1574ff0075f7521e

sha1(base64_encode($toHash)); //Prints: 278aa0e8dde2af58a4eed613467da219a35c5278

我猜 Base64 编码对 PHP 和 Java 上的字符串有所不同,有什么想法吗?

更新 2

我应该说得更清楚一些,抱歉,我的意思是:

的输出Java

sha1(Base64.encodeToString("qwerty".getBytes("ASCII"), Base64.DEFAULT));

的输出不同PHP

sha1(base64_encode("qwerty"));

更新 3

尽管两个 base64 编码的字符串是相等的 cXdlcnR5

基本上:

- sha1("qwerty") == sha1("qwerty")
- Base64.encodeToString("qwerty".getBytes(), Base64.DEFAULT) == base64_encode("qwerty")
- sha1(Base64.encodeToString("qwerty".getBytes(), Base64.DEFAULT)) != sha1(base64_encode("qwerty"))

我已经在散列的字符串上删除了 base64 编码,但我仍然想知道我可以做些什么来让它工作。

最佳答案

编辑

您在 encodeToString 方法中两次使用了 toHash 变量,使您的第二行代码变得多余。

这段代码

String toHash = "qwerty";
String hash = sha1(toHash); //Prints: b1b3773a05c0ed0176787a4f1574ff0075f7521e

toHash = Base64.encodeToString(toHash.getBytes("ASCII"), Base64.DEFAULT);
hash = sha1(toHash); //Prints: 88bfb2d77c3b42823bab820c1737f03c97d87c1b

等同于这段代码

String toHash = "qwerty";
toHash = Base64.encodeToString(toHash.getBytes("ASCII"), Base64.DEFAULT);
hash = sha1(toHash); //Prints: 88bfb2d77c3b42823bab820c1737f03c97d87c1b

所以本质上你是在 java 中

  • 为“qwerty”获取 Base64
  • 获取该结果的 sha1

在使用 PHP 时,您是

  • 获取“qwerty”的 sha1
  • 获取该结果的 Base64

我猜你打错了

关于java - Java 和 PHP 中的 SHA1 具有不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20034561/

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