SHA-256哈希值在C#和Javascript之间有所不同

Wil*_*mas 7 javascript sql-server hash sha256

我目前正在开发一个项目,该项目将涉及基于数据库行的入学信用卡刷卡.与遗嘱调用系统一样,CC号的SHA-256哈希必须与数据库行中的哈希匹配才能被视为"正确的提取".

但是,由于票房系统是基于浏览器的,因此必须使用Javascript对客户端进行散列的CC号码,然后与先前下载的将调用数据进行比较.

但是,在尝试对数字进行散列时,散列总是与创建数据库行时使用的散列不同(使用VB.NET和SQL Server 2008 R2).例如,如果数据库中的CC编号恰好是4444333322221111,则.NET生成的哈希值将变为xU6sVelMEme0N8aEcCKlNl5cG25kl8Mo5pzTowExenM =.

但是,当我找到Javascript使用任何SHA-256哈希库时,产生的哈希将始终为NbjuSagE7lHVQzKSZG096bHtQoMLscYAXyuCXX0Wtw0 =.

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

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

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

我已经对此进行了调查并尝试了许多不同的函数来将密码编码为unicode格式,但无论我尝试什么小调整或我做的其他函数,我都无法得到它来匹配我需要的哈希码.

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

更新:

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

Wil*_*mas 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 ...]。因此,使用不同的字节数组,会生成不同的哈希值。

我能够通过修改此处的基本 64 SHA-256 哈希算法来为我的应用程序解决此问题,其中每个字符一次从字符串中提取一个以生成哈希。

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