无论您使用哪种语言(Java、vb.net ...)以及无论您使用什么操作系统,是否都可以确保始终以相同的方式对字符串进行哈希处理?
sha-1 哈希总是一样的吗?
信息安全
哈希
沙
2021-08-21 13:52:29
4个回答
哈希函数是确定性的:相同的输入产生相同的输出。给定哈希函数的任何实现,无论它是用什么语言实现的,都必须执行相同的操作。
但是,请注意,散列函数将位序列作为输入。当我们“对字符串进行哈希处理”时,我们实际上是将一个字符序列转换为一个位序列,然后对其进行哈希处理。麻烦就开始了。考虑 string "café"
:在所有可能的位转换中,以下所有都是常见的:
63 61 66 e9 ISO-8859-1 ("latin-1")
63 61 66 ca a9 UTF-8
63 61 66 65 cc 81 UTF-8 (NFD)
ef bb bf 63 61 66 ca a9 UTF-8 (with BOM)
ef bb bf 63 61 66 65 cc 81 UTF-8 (NFD with BOM)
63 00 61 00 66 00 e9 00 UTF-16 little-endian
00 63 00 61 00 66 00 e9 UTF-16 big-endian
ff fe 63 00 61 00 66 00 e9 00 UTF-16 little-endian (with BOM)
fe ff 00 63 00 61 00 66 00 e9 UTF-16 big-endian (with BOM)
63 00 61 00 66 00 65 00 01 03 UTF-16 little-endian (NFD)
00 63 00 61 00 66 00 65 03 01 UTF-16 big-endian (NFD)
ff fe 63 00 61 00 66 00 65 00 01 03 UTF-16 little-endian (NFD with BOM)
fe ff 00 63 00 61 00 66 00 65 03 01 UTF-16 big-endian (NFD with BOM)
当使用给定的散列函数处理时,所有这些都会产生非常不同的散列值。在处理加密函数时,您必须非常精确地了解您所做的事情;每一点都很重要。
我不完全确定你的意思,但是是的。无论语言如何,正确编写的哈希函数的输出都应该是相同的。
不同编程语言库和不同平台上的哈希值之间的唯一区别是速度。尽管在正确编写的库中 - 差异将是微不足道的。
是的,无论实现如何,完全相同的“字节序列”总是会产生完全相同的摘要值(假设它是正确的实现!)
关键字是“字节序列”总是如此,但正如你所写的那样,“字符串”并不总是如此。取决于很多事情,字符串可以在不同的系统上以不同的方式生成。可能存在大量空白或行尾差异,或 ASCII 与 Unicode UTF-16 编码问题。
另外,请注意,当您显示摘要值时,您会遇到类似的问题。不同的实现可能用大写或小写值表示十六进制数字,因此字符串相等性测试可能会失败。
如果你不使用盐,它总是一样的。如果您使用的是盐,那么如果您更换盐,情况会有所不同。