Spring4D库有加密类,但我无法按预期工作.我可能错误地使用它们,但是缺少任何示例都会让它变得困难. 例如,在网站https://quickhash.com/hash-sha256-online上,我可以散列单词“test”来生成以下哈
例如,在网站https://quickhash.com/hash-sha256-online上,我可以散列单词“test”来生成以下哈希:
9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
使用Spring4D库,以下代码生成不同的哈希:
CreateSHA256.ComputeHash('test').ToString;
结果是:
9EFEA1AEAC9EDA04A892885A65FDAE0E6D9BE8C9FC96DA76D31B929262E12B1D
抛开大/小写,它完全是一个不同的哈希.我知道一定是做错了,但是再没有使用的例子,所以我一直坚持如何做到这一点.
散列算法对二进制数据进行操作,通常使用字节数组表示.不幸的是,您使用的两种资源都提供了散列文本的能力.为了散列文本,首先需要将文本转换为二进制.为此,需要选择编码.这两种方法都没有说清楚这个选择是什么.
当我使用这个Delphi代码时:
LowerCase(CreateSHA256.ComputeHash(TEncoding.UTF8.GetBytes('test')).ToString)
我得到了你问题中出现的相同哈希值.
我敦促你永远不要尝试加密/散列文本,而是将这些操作视为二进制操作.始终使用显式编码,然后加密/散列编码生成的字节数组.
我在这里选择了UTF-8编码,因为它是一个完整的Unicode编码,并且在空间方面往往是高效的.但是,我不认为您的在线编码器使用UTF-8.事实上我不知道它使用什么编码,在这个问题上还不清楚.这当然是与二进制文本不同的旧文本问题.
在我看来,这是您使用的Delphi库的设计缺陷,它允许您在没有明确选择编码的情况下散列文本.如果此库必须提供散列文本的函数,则它应该要求调用者提供额外的TEncoding参数.