【问题标题】:Will the SHA256Managed Class return different results when run on different machines?SHA256Managed Class 在不同机器上运行时会返回不同的结果吗?
【发布时间】:2012-03-14 01:57:36
【问题描述】:

我正在尝试构建一种使用 API 密钥进行访问的身份验证机制。

作为对中继攻击的预防措施,我正在使用当前的 DateTime 对 API 密钥进行哈希处理,并在服务器端进行检查。

使用相同的代码在客户端和服务器上进行散列,我从两个调用中得到不同的结果。

IE:客户端对其 API 密钥进行哈希处理,并将哈希处理后的密钥和日期时间“salt”发送到服务器。

服务器获取预期的 api 密钥并使用客户端发送的日期时间进行哈希处理。

我的哈希永远不匹配(客户端哈希!= 服务器哈希)。

仅当我在不同的机器上运行客户端和服务器时才会发生这种情况(实际上另一个开发人员正在尝试编写客户端部分)

当我在本地机器上测试时一切正常(同时运行客户端和服务器部分并尝试身份验证)。

问题 给定相同的输入,.NET SHA256Managed 类的 ComputeHash 方法在不同的计算机上运行时会返回不同的结果吗?

【问题讨论】:

  • 你能提供一个可重现的例子吗?
  • 创建一个随机盐(作为字节)并将其发送到服务器。如果您需要文本,请将盐编码为十六进制字符串。
  • SHA256Managed 不是线程安全的,所以如果你从不同的线程调用同一个实例,它可能会产生不同的结果

标签: c# .net hash cryptography


【解决方案1】:

给定相同的输入,.NET SHA256Managed 类 ComputeHash 方法在不同计算机上运行时会返回不同的结果吗?

没有。如果确实如此,那么实现就会被破坏(不太可能),或者输入不同。

【讨论】:

    【解决方案2】:

    如果您使用string,请小心,因为不同计算机之间的编码、当前文化...可能会有所不同,这会给您带来不同的结果(因为输入在字节方面是不同的)。

    【讨论】:

    • 感谢您的提示。您可能为我们省去了一些麻烦。现在测试一些理论......
    【解决方案3】:

    哈希值应该始终相同。您的问题可能是因为您使用日期的字符串表示作为盐,并且由于语言环境设置,每台机器上的字符串表示不同。

    【讨论】:

    • 即使在同一时区/国家内,日期时间的字符串表示是否也不同。即我们俩都在美国东部(虽然不同的州)
    • 机器在哪里物理上并不重要——重要的是它们认为自己在哪里。验证系统范围的区域设置。
    猜你喜欢
    • 1970-01-01
    • 2021-10-07
    • 2019-07-08
    • 2021-08-21
    • 2011-09-28
    • 2016-09-05
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多