7

我目前正在开展一个项目,该项目将涉及基于数据库行的信用卡刷卡录取。与遗嘱呼叫系统一样,CC 编号的 SHA-256 哈希必须与 DB 行中的哈希匹配,才能被视为“正确的取货”。

但是,由于票房系统是基于浏览器的,所以取货时的CC号码必须在客户端使用Javascript进行哈希处理,然后与之前下载的会调用数据进行比较。

但是,当尝试对数字进行哈希处理时,哈希值总是与创建 DB 行时的哈希值不同(使用 VB.NET 和 SQL Server 2008 R2)。例如,如果数据库中的 CC 编号恰好是4444333322221111,那么来自 .NET 的结果哈希将变为xU6sVelMEme0N8aEcCKlNl5cG25kl8Mo5pzTowExenM=

但是,当我可以找到任何 SHA-256 哈希库用于 Javascript 时,生成的哈希将始终为NbjuSagE7lHVQzKSZG096bHtQoMLscYAXyuCXX0Wtw0=

我假设这是某种 Unicode/UTF-8 问题,但无论我尝试什么,我都无法得到相同的哈希值,它开始让我发疯。任何人都可以提供任何建议吗?

这里有一些可以提供一些见解的东西。请访问http://www.insidepro.com/hashes.php?lang=eng并在密码框中插入不带引号的“4444333322221111”。然后,向下滚动到 SHA-256 部分。

您可以看到有四个结果,其中两个是我发布的哈希码(从上数第二个是 Javascript 哈希,底部一个是 SQL 哈希)。根据该页面,底部哈希结果是使用 base 64 字符串生成的,并将密码转换为 unicode 格式。

我已经对此进行了调查,并尝试了许多不同的函数将密码编码为 un​​icode 格式,但无论我尝试进行什么小调整或进行其他功能,我都无法让它与我需要的哈希码相匹配。

我目前正在研究在服务器端调用 SHA-256 函数时使用的参数。

更新:

因此,为了确保我没有发疯,我在调试时在即时窗口中运行了用于 CC 编号的 Hash 方法。同样,结果与以前相同。你可以在这里看到截图:http: //i.imgur.com/raEyX.png

4

3 回答 3

2

根据在线 SHA-256 哈希计算器base-64 到十六进制解码器,是 .NET 实现没有正确计算哈希。您可能需要仔细检查传递给散列函数的参数。

当您处理两个不受信任的实现时,最好找到另一个独立的实现,并选择与第三个匹配的那个是正确的。要么,要么找到一些测试向量,并单独验证实现。


编辑:

一个快速实验表明,您从 .NET 获得的 SHA-256 哈希与十六进制字符串3400340034003400330033003300330032003200320032003100310031003100(小端 16 位字符)匹配。确保传入 ASCII。

于 2012-05-11T22:08:30.477 回答
2

当 Adam Liss提到 .NET/SQL Server 中字符串之间的字节数组与 Javascript 中的字符串不同时,他说得对。.NET 中字符串4444333322221111的数组看起来像 [52 0 52 0 52 0 52 0 51 0 51 0... 等],而 Javascript 中的同样的东西看起来像 [52 52 52 52 51 51 51 51 ...]。因此,使用不同的字节数组,会生成不同的哈希值。

我可以通过从这里修改 base 64 SHA-256 散列算法来为我的应用程序解决这个问题,其中每个字符一次从字符串中提取一个以生成散列。

我没有这样做,而是首先将字符串转换为类似 unicode 的字节数组(如上面的 .NET 示例,5​​2 0 52 0 等),将该数组提供给散列算法而不是字符串,然后一些非常小的调整,以便它抓取每个数组成员以生成哈希。瞧,它工作了,现在我有一种非常方便的方法来散列 CC 编号,其方式与 .NET 框架相同,可以快速轻松地查找订单。

于 2012-05-14T16:44:24.973 回答
0

你确定你的 JavaScript SHA256 函数吗?


你第一次生成的哈希?

SHA-256("4444333322221111"); // 35b8ee49a804ee51d5433292646d3de9b1ed42830bb1c6005f2b825d7d16b70d

hex: 35b8ee49a804ee51d5433292646d3de9b1ed42830bb1c6005f2b825d7d16b70d
HEX: 35B8EE49A804EE51D5433292646D3DE9B1ED42830BB1C6005F2B825D7D16B70D
h:e:x: 35:b8:ee:49:a8:04:ee:51:d5:43:32:92:64:6d:3d:e9:b1:ed:42:83:0b:b1:c6:00:5f:2b:82:5d:7d:16:b7:0d
base64: NbjuSagE7lHVQzKSZG096bHtQoMLscYAXyuCXX0Wtw0=
于 2012-05-11T22:02:53.037 回答