delphi – 无法获得Spring4D加密示例的预期结果
Spring4D库有加密类,但我无法按预期工作.我可能错误地使用它们,但是缺少任何示例都会让它变得困难.
例如,在网站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参数. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |