Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# php sha1与.Net sha1管理不匹配_C#_Php_Sha1_Mismatch - Fatal编程技术网

C# php sha1与.Net sha1管理不匹配

C# php sha1与.Net sha1管理不匹配,c#,php,sha1,mismatch,C#,Php,Sha1,Mismatch,我在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-C741

我在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;
$str = $SiteKey.':"MessageId":"0289ED53-D69B-451C-BCBB-C7412D07AFFE""SiteId":"'.$SiteId.'""TimeStamp":"4/29/2013 11:50:18 AM"';
$hash = sha1($str);
签名变量值:8cf9000e9b1a6da0e898bada5bf6dd8f6d17d72a

PHP代码如下所示:

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;
$str = $SiteKey.':"MessageId":"0289ED53-D69B-451C-BCBB-C7412D07AFFE""SiteId":"'.$SiteId.'""TimeStamp":"4/29/2013 11:50:18 AM"';
$hash = sha1($str);
$hash变量值:1D2FB85FD63A14DE00B5E0A95BE253EAC1A65128

同样的话题已经被回答了好几次,但在这种情况下,这些都没有帮助。
任何人的帮助都是可观的。

请参见
PHP中的
AM

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

正因为如此,不同的结果正在到来


将两者设置为
AM
PM
,您将得到相同的哈希值。

有几个问题:

  • 正如@Yogesh所指出的,字符串是不同的(
    AM
    PM
  • C代码使用UTF-16、php代码ASCII或一些传统编码
  • 你的MAC结构坏了。SHA-1(密钥| |消息)易受长度扩展攻击

  • 由于代码已损坏,您需要在两侧对其进行更改。我建议切换到带有UTF-8编码消息的
    HMAC-SHA-2

    非常感谢您指出这一点。其实我写错了。我在这两种情况下都使用“am”。谢谢,但为了使用HMAC-SHA2,我需要一个未提供的密钥。这就是我无法使用HMAC的原因。我尝试过:$str=mb_convert_编码($str,'utf-8');echo$hash=sha1($str);但是它给出的值与未编码的值相同。您使用的是一种称为
    SiteKey
    。这不应该是消息的前缀,而是正确的MAC密钥。C代码很烂,不要复制它。修好它。如果你不安全地使用密码,为什么要使用它?如果你在php中使用
    utf-16
    ,你会得到与当前C代码相同的结果。再次感谢你的努力!但在这里,C#代码能够连接到远程服务器,这意味着它正在生成与服务器相同的代码,这是必需的。还尝试将编码转换为UTF-16,但可惜没有成功!