无法获得Spring4D加密示例的预期结果

时间:2014-12-01 05:32:01

标签: delphi hash cryptography spring4d

Spring4D库有加密类,但我无法按预期工作。我可能错误地使用它们,但是缺少任何例子都会让它变得困难。

例如在网站https://quickhash.com/hash-sha256-online上,我可以散列“test”这个词来生成以下哈希:

9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08

使用Spring4D库,以下代码生成不同的哈希:

CreateSHA256.ComputeHash('test').ToString;

结果:

9EFEA1AEAC9EDA04A892885A65FDAE0E6D9BE8C9FC96DA76D31B929262E12B1D

除了大小写之外,它完全是一个不同的哈希。我知道一定是做错了,但是再没有使用的例子,所以我不知道怎么做。

3 个答案:

答案 0 :(得分:9)

哈希算法对二进制数据进行操作,通常使用字节数组表示。

不幸的是,您使用的两种资源都提供了散列文本的功能。为了散列文本,首先需要将文本转换为二进制。为此,需要选择编码。这两种方法都没有说清楚这个选择是什么。

当我使用这个Delphi代码时:

LowerCase(CreateSHA256.ComputeHash(TEncoding.UTF8.GetBytes('test')).ToString)

我得到了你问题中出现的相同哈希值。

我强烈建议您永远不要尝试加密/散列文本,而应将这些操作视为二进制操作。始终使用显式编码,然后加密/散列编码生成的字节数组。

我在这里选择了UTF-8编码,因为它是一个完整的Unicode编码,并且在空间方面往往是高效的。但是,我不认为您的在线编码器使用UTF-8。事实上我不知道它使用什么编码,在这个问题上还不清楚。这当然是与二进制文本不同的旧文本问题。

在我看来,这是Delphi库的一个设计缺陷,它允许您在没有明确选择编码的情况下散列文本。如果此库必须提供散列文本的函数,则应该要求调用者提供额外的TEncoding参数。

答案 1 :(得分:4)

内部没有转换,因此它会散列UnicodeString,每个字符至少有2个字节。

如果你想要与页面上相同的结果,你必须使用UTF8Encode或直接传递为AnsiString。

但是我尝试了一些包含不同unicode字符的字符串,并且页面返回了不同的结果。所以我不太确定他们如何对待那里的琴弦。我想这是代码页的事情。

编辑:如果您使用此页面http://www.xorbin.com/tools/sha256-hash-calculator,它将使用UTF8Encode生成与TSHA256相同的哈希。

答案 2 :(得分:0)

您使用的是哪种类型的字符串?您是使用AnsiString还是WideString(Unicode字符串)。 Delphi 2009和Newer默认使用WideString。

为什么字符串类型很重要?所有哈希算法都对原始字节数据进行操作,因此如果字符串的每个字符都存储在一个字节的内存(AnsiString)或多个字节的内存(WideString)中,那么它就很重要。