2013-05-02 4 views
0

PHP와 C# .Net에서 SHA1 알고리즘을 일치시키는 데 문제가 있습니다. .Net 값과 일치하도록 PHP 코드를 수정해야합니다.PHP sha1이 일치하지 않습니다 .Net sha1Managed

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; 

서명 변수 값 :

.NET의 코드는 다음과 같다 8cf9000e9b1a6da0e898bada5bf6dd8f6d17d72a

PHP 코드는 다음과 같다 :

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

은 $ 해시 변수 값 : 1d2fb85fd63a14de0b5e0a95be253eac1a625128

동일한 주제가 몇 번이나 대답되었지만이 중 어느 것도 도움이되지 않습니다. 아무도 도움이 될 것입니다.

답변

1

는이 때문에 C#

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

PHP

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

그리고 PM 여기의 AM 참조, 다른 결과가오고있다.

모두 AM 또는 PM으로 설정하면 동일한 해시를 얻게됩니다.

+0

감사합니다. 사실 나는 그것을 잘못 작성했다. 두 경우 모두 "AM"을 사용하고 있습니다. – Saikat

1

은 몇 가지 문제가 있습니다 @Yogesh 노트로

  1. , 문자열이 다른 (AMPM)
  2. C# 코드는 UTF-16, PHP 코드를 ASCII 또는 일부 레거시 인코딩
  3. 을 사용합니다
  4. MAC 구성이 손상되었습니다. SHA-1 (key || 메시지)은 길이 확장 공격에 취약합니다.

코드가 깨 졌으므로 양쪽에서 코드를 변경해야합니다. UTF-8로 인코딩 된 메시지로 HMAC-SHA-2으로 전환하는 것이 좋습니다.

+0

감사하지만 HMAC-SHA2를 사용하려면 제공되지 않는 비밀 키가 필요합니다. 그게 내가 HMAC를 사용할 수없는 이유입니다. 나는 시도했다 : $ str = mb_convert_encoding ($ str, 'utf-8'); echo $ hash = sha1 ($ str); 이지만 인코딩없이 동일한 값을 제공합니다. – Saikat

+0

당신은'SiteKey'라는 것을 사용하고 있습니다. 이것은 메시지의 접두어가 아니며 적절한 MAC 키입니다. C# 코드는 싫증나 지 않습니다. 고쳐. 암호화를 안전하게 사용하지 않는 이유는 무엇입니까? – CodesInChaos

+0

PHP에서 utf-16을 사용하면 현재 C# 코드와 동일한 결과를 얻을 수 있습니다. – CodesInChaos