检查一个字符串是否为 xxx 位哈希值。

4

我该如何检查一个字符串是否被哈希为特定位数?我想对我的方法进行单元测试(使用SHA512),我想编写一个测试来检查返回的字符串是否经过512位哈希处理。


1
尝试使用密钥解密它;如果可以,那么它很可能是加密的...?请注意,大多数加密数据是二进制而不是文本;试图将其视为“字符串”可能会导致数据丢失。 - Marc Gravell
@Marc Gravell 这是一种单向密码哈希。它必须是一个字符串。 - Dawdie
1
@Dawdie的哈希函数产生二进制结果,而不是字符串。此外,我强烈建议您编辑您的问题并重新定义您所指的加密方式--SHA512是哈希算法,而不是加密算法。您是否使用其他加密方式?如果没有,为什么要让读者产生困惑呢? - Eugene Mayevski 'Callback
@dawdie - 重申上面的观点 - 大多数哈希都是二进制的。如果你想要一个字符串,可以将二进制通过base-64运行。 - Marc Gravell
@Eugene - SHA512 应该生成一个字节数组,而不是一个二进制结果... 但从某种意义上说,字节数组就是二进制数组的数组... - Matten
@Matten 这是一个术语问题。在密码学中,通常假定“字符串”是人类可读的,并且属于某些可读字符子集,而二进制则是完整的字节集[0..255]。 - Eugene Mayevski 'Callback
3个回答

2

仅凭字符串本身无法确定字符串是否加密。有人可以输入数据,其类似于您的SHA512哈希函数的结果,但实际上并未进行哈希处理。

如果您知道它是经过哈希处理的,并且想知道是否使用了SHA512,则唯一可以验证的是字符串是否为512位长,但这并不能百分之百地告诉您它是否是SHA512。


如何检查字符串是否为512位? - Dawdie
一个char具有256个有效值,因此一个char是8位长。如果字符串长度*8为512,则其长度为512位。 - Matten
@Matten 在C#中,char类型长度为16位。 - mgronber
@mgronber -- 很好知道,我以为它是8位编码.. 谢谢 :) - Matten
@mgronber,所以我只需要进行如下检查:`Assert.IsEqual(512,(hash.Length * 16)); - Dawdie
@Dawdie,我无法回答你的问题,因为你的原始问题太模糊了。在.NET中,哈希结果应该是一个字节数组。如果它是一个字符串,我假设已经使用某种编码将二进制数据转换为有效的字符串。没有了解详情,就不可能给出任何好的答案。 - mgronber

2
如果这是单向哈希(你没有明确说明,但你使用SHA512暗示了它),那么它就无法被解密。实际上,测试它的唯一方法是:

  • 取已知输入(即已知明文字符串)。
  • 通过其他可信的方式计算预期的加密输出。
  • 确保你的程序或例程为该字符串生成该输出。

重复使用不同的输入,直到你满意为止。


0
请跟着我重复一遍:哈希不是加密。您的哈希算法输入数据已丢失,无法恢复。

SHA-512输出512位, 因此有人向您展示512位并说这是SHA-512算法的输出可能是正确的。据我所知,SHA算法的输出没有明显可识别的模式,因此他们可能只是向您展示了512位纯随机噪声。

您能解释一下为什么要确定用于生成特定哈希的算法吗?


现在我看到其他人已经先我一步说了这个。 - user111013

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接