0

PHP と C# .Net で SHA1 アルゴリズムを一致させるのに問題があります。.Net 値と一致するように PHP コードを変更する必要があります。

.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

同じトピックが何度も回答されていますが、この場合はどれも役に立ちません. 誰の助けもかなりのものです。

4

2 に答える 2

1

いくつかの問題があります。

  1. @Yogesh が指摘しているように、文字列は異なります ( AMvs. PM)
  2. C# コードは、UTF-16、PHP コード ASCII、またはいくつかのレガシー エンコーディングを使用します。
  3. MAC 構造が壊れています。SHA-1(key||message) は、長さ拡張攻撃に対して脆弱です。

コードが壊れているので、両側で変更する必要があります。HMAC-SHA-2UTF-8 でエンコードされたメッセージに切り替えることをお勧めします。

于 2013-05-02T07:46:16.657 に答える