首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法获得Spring4D加密示例的预期结果

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

Stack Overflow用户
提问于 2014-12-01 05:32:00
回答 3查看 417关注 0票数 3

Spring4D库有加密类,但是我不能让它们按预期的方式工作。我可能不正确地使用它们,但是缺少任何示例会使它变得很困难。

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

代码语言:javascript
复制
9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08

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

代码语言:javascript
复制
CreateSHA256.ComputeHash('test').ToString;

在以下方面的成果:

代码语言:javascript
复制
9EFEA1AEAC9EDA04A892885A65FDAE0E6D9BE8C9FC96DA76D31B929262E12B1D

撇开大小写不谈,它是一个完全不同的散列。我知道一定是做错了什么,但同样没有使用的例子,所以我被困在如何做这件事。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-12-01 08:13:36

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

不幸的是,您所使用的两种资源都提供了散列文本的能力。为了散列文本,首先需要将文本转换为二进制文件。要做到这一点,需要选择编码。但这两种方法都不清楚这种选择是什么。

当我使用这个Delphi代码时:

代码语言:javascript
复制
LowerCase(CreateSHA256.ComputeHash(TEncoding.UTF8.GetBytes('test')).ToString)

我得到的散列和你问题中出现的一样。

我敦促您不要试图加密/散列文本,而是将这些操作视为二进制操作。始终使用显式编码,然后加密/散列编码产生的字节数组。

我在这里选择了UTF-8编码,因为它是一个完整的Unicode编码,而且在空间上是高效的。然而,我不认为你的在线编码器使用UTF-8。事实上,我不知道它使用的是什么编码,在这个问题上还不清楚。当然,这也是一个老问题,即文本不同于二进制。

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

票数 9
EN

Stack Overflow用户

发布于 2014-12-01 07:59:17

在内部没有进行转换,所以它对UnicodeString进行散列,每个字符至少有2个字节。

如果您希望获得与页面上相同的结果,则必须使用UTF8Encode或直接作为AnsiString传递。

但是,我尝试了一些包含不同unicode字符的字符串,页面返回了不同的结果。所以我不太清楚他们是如何对待那里的字符串的。我想这是个代码页的问题。

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

票数 4
EN

Stack Overflow用户

发布于 2014-12-01 06:20:43

您使用哪种类型的字符串?您是使用AnsiString还是WideString (Unicode字符串)。Delphi2009及更高版本默认使用WideString。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27222242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档