Java - 有没有一种方法可以确认一个字符串是否为sha256哈希值?

3
我想要验证一个字符串是否是另一个字符串的sha256表示,而无需解密它。这是否可能?

4
哈希不是加密。目前您的问题非常不清楚。基本上验证哈希的方法是重新对字符串进行哈希,看看是否得到相同的哈希值。 - Jon Skeet
3个回答

4

是和不是。

你可以很容易地测试一个字符串是否为十六进制。然后,你可以测试它是否包含一个在统计意义上合理的数字和字母数量。这将排除一些常见的非sha256字符串。

但是,如果有人创建了一个旨在看起来像sha256的随机字符串,我认为通过任何数学测试都无法将其与真正的sha256区分开来。该算法被设计为对此具有强健性。


3
一个sha-256值只是一个256位(32字节)的值,你通常可以在Java中表示为Stringbyte[]
作为一个独立的值是没有意义的,如果你想知道一个特定的String是否是哈希值,那么任何32字节的数字都是无限未知明文的哈希值。但这就像问"我怎样知道一个32字节的数字是数字?",你会发现这个问题没有头绪。
它只有在与一个明文匹配时才有用,以便您可以将其与从明文计算出的哈希值进行比较以验证它们是否匹配。

任何32字节的数字都是无限未知明文的哈希值” => SHA256 确实有 2^32 种可能的值吗? - assylias
http://crypto.stackexchange.com/questions/2670/is-every-output-of-a-hash-function-possible - assylias
@assylias:可能你指的是2^(32*8)个SHA256值,但总的来说,你的问题没有一个确定的答案,因为它取决于所涉及的哈希函数。假设有无限数量的任意长度的明文,则哈希函数的值域可以完整覆盖,前提是该函数本身适合。但证明这一点是另外一回事。 - Jack
当然是2的256次方。我的意思是,没有(实际的)方法可以确定一个随机的32字节值是否可以通过sha256加密某个字符串得到。这就是我认为所问的问题。 - assylias

1
我认为你可以哈希另一个字符串,然后将这两个字符串相互比较。不知道这是否对你有帮助,但我读到,在创建彩虹表以破解密码尝试时,这是常用的做法。
编辑:哦,忘了这也是在php中比较密码的方法,当您登录网页时,我想起来了。至少我在大学里是这样做的。

1
这是行不通的,因为你不知道这两个值使用的哈希是否相同。 - CLR45
1
请纠正我如果我错了,但是由于OP说它是一个sha2哈希,应该有一个标准的哈希函数可以使用,就像php中的md5函数一样。 - clockw0rk

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