【问题标题】:Java SHA1 for unicode?用于unicode的Java SHA1?
【发布时间】:2012-03-15 19:49:31
【问题描述】:

我试图为一个 unicode 字符串获取一个 SHA1 哈希,一些中文字符串 在 Eclipse 中的 Android Java 代码中。我使用了通常的 MessageDigest 类 和一些来自网络的十六进制转换代码。

我想知道如何验证哈希及其十六进制转换是否正确? 我将该中文字符串插入了许多在线哈希转换器,但是 他们都产生了不同的哈希值。相同的转换器可以正常工作 ascii 字符串。

我是这方面的新手,所以一些指针将不胜感激!

br,佩尔萨

【问题讨论】:

    标签: java android unicode hash localization


    【解决方案1】:

    什么算“正确”?诸如 SHA-1 之类的散列处理的是 二进制 数据,而不是文本......并且有多种不同的方式将文本转换为二进制。

    这里的目的是什么?您是否必须使散列与某些 other 代码产生的匹配?如果是这样,请找出其他代码用于将文本转换为二进制的编码。如果它只需要匹配 您的 代码,那么您可以随意使用 - 我建议使用 UTF-8 或 UTF-16,它们都保证在 Java 中存在,通常在其他平台供未来选择,并涵盖整个 Unicode 字符库。

    【讨论】:

    • 想法是将哈希码存储到服务器,当用户从不同的手机登录时,只将哈希传递给服务器。因此,应该在不同的操作系统上产生相同的哈希值。请原谅我的新手,但似乎这只适用于纯ascii,是真的吗?因此我假设我需要转换例如先base64,然后SHA才能兼容平台?
    • @perza:不,绝对不是。您只需要某种将文本始终如一地转换为二进制的方法,然后使用 UTF-8 或 UTF-16 就可以了。只要您可以确保所有手机(和服务器)上的代码使用相同的编码,就可以了。
    • 所以我假设在线哈希生成器无法正确处理 unicode 字符串,从而产生不同的结果。好的,我相信这是一个足够好的答案:)
    • @perza:根据我的第一句话,这里没有“正确”,所以没有“正确”的意义。有些人可能使用了适当的编码,但其他人可能没有。任何能够可靠地编码所有 Unicode 字符的编码都是合理的 - 因此两种不同的方案都可以同样有效,但会给出不同的结果。
    【解决方案2】:

    “在线哈希转换器”是什么意思?

    如果您计算了某个 Unicode 字符串的 SHA1 哈希,则不可能从哈希中取回字符串。这是 Hash-Function 的关键,它的“单向”。

    您可以使用另一个 SHA 实现并检查是否得到与结果相同的哈希。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 2018-03-11
    • 2013-06-25
    • 2017-09-25
    相关资源
    最近更新 更多