php sha1 does not match .Net sha1Managed

本文关键字:Net sha1Managed match not sha1 does php | 更新日期: 2023-09-27 18:11:51

我在匹配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

同样的话题已经回答了很多次,但在这种情况下没有一个是有用的。任何人的帮助都是值得感激的。

php sha1 does not match .Net sha1Managed

这里AMPHP

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

C#中的PM

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

正因为如此,不同的结果出现了。

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

有几个问题:

  1. 正如@Yogesh所指出的,字符串是不同的(AMPM)
  2. c#代码使用UTF-16, php代码使用ASCII或一些遗留编码
  3. 你的MAC结构被破坏了。SHA-1(密钥|消息)容易受到长度扩展攻击。

既然代码被破坏了,你需要在两边都修改它。我建议使用UTF-8编码的消息切换到HMAC-SHA-2