【问题标题】:php sha1 does not match .Net sha1Managedphp sha1 与 .Net sha1Managed 不匹配
【发布时间】:2013-05-02 07:35:28
【问题描述】:

我在匹配 PHP 和 C# .Net 中的 SHA1 算法时遇到问题。我需要修改 PHP 代码以匹配 .Net 值。

.Net中的代码如下:

DateTime dtNow = DateTime.parse("4/29/2013 11:50:18 PM");
//Create the site token header
var siteTokenMessageHeader = new SiteTokenMessageHeader
{
    MessageId = "0289ED53-D69B-451C-BCBB-C7412D07AFFE",
    //Unquie Id per message, use for auditing
    TimeStamp = dtNow,
    //Current Time
    SiteId = _siteId,
};
//Construct Token 
var token = string.Format(
    "{0}:\"MessageId\":\"{1}\"\"SiteId\":\"{2}\"\"TimeStamp\":\"{3}\"",
    _siteKey,
    siteTokenMessageHeader.MessageId,
    siteTokenMessageHeader.SiteId,
    siteTokenMessageHeader.TimeStamp.ToString(new CultureInfo("en-US"))); //1/1/2000 12:00:00 AM
//Construct signature from token
var shaProvider = new SHA1Managed();
var rawKey = Encoding.Unicode.GetBytes(token);
var rawHash = shaProvider.ComputeHash(rawKey);
var signature = BitConverter.ToString(rawHash).Replace("-", "").ToLower();

siteTokenMessageHeader.SiteSignature = signature;

签名变量值:8cf9000e9b1a6da0e898bada5bf6dd8f6d17d72a

PHP代码如下:

$str = $SiteKey.':"MessageId":"0289ED53-D69B-451C-BCBB-C7412D07AFFE""SiteId":"'.$SiteId.'""TimeStamp":"4/29/2013 11:50:18 AM"';
$hash = sha1($str);

$hash 变量值:1d2fb85fd63a14de0b5e0a95be253eac1a625128

同样的话题已经回答了很多次,但在这种情况下,这些都没有帮助。 任何人的帮助都将不胜感激。

【问题讨论】:

    标签: c# php sha1 mismatch


    【解决方案1】:

    在这里查看它的AMPHP

    ""TimeStamp":"4/29/2013 11:50:18 AM"'
                                     ^^
    

    PMC#

    parse("4/29/2013 11:50:18 PM");
                              ^^
    

    正因为如此,不同的结果即将到来。

    将两者都设为AMPM,您将获得相同的哈希值。

    【讨论】:

    • 非常感谢您指出这一点。其实我写错了。在这两种情况下我都使用“AM”。
    【解决方案2】:

    有几个问题:

    1. 正如@Yogesh 所说,字符串不同(AMPM
    2. C# 代码使用 UTF-16、php 代码 ASCII 或一些传统编码
    3. 您的 MAC 结构已损坏。 SHA-1(key||message) 容易受到长度扩展攻击。

    由于代码坏了,需要两边都改。我建议使用 UTF-8 编码的消息切换到 HMAC-SHA-2

    【讨论】:

    • 谢谢,但为了使用 HMAC-SHA2,我需要一个未提供的密钥。这就是为什么我无法使用 HMAC。我试过: $str = mb_convert_encoding($str, 'utf-8');回声 $hash = sha1($str);但它给出的值与不编码时相同。
    • 您正在使用名为 SiteKey 的东西。这不应该是消息的前缀,而是正确的 MAC 密钥。 C# 代码很烂,不要复制它。修理它。如果您不安全地使用加密货币,为什么还要使用它?
    • 如果您在 php 中使用 utf-16,您将获得与当前 C# 代码相同的结果。
    • 再次感谢您的努力!但这里的 C# 代码能够连接到远程服务器,这意味着它与服务器产生的结果相同,这是必需的。还尝试将编码转换为 UTF-16,但可惜,没有运气!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    • 2013-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多