1

関数 P_SHA1 は PHP を意味します。Pythonで書かれた関数のパターン。しかし、残念ながら、何かが正しく機能していません。JAVA での実装関数は次のとおりです: http://ws.apache.org/wss4j/xref/org/apache/ws/security/conversation/dkalgo/P_SHA1.html

私たちのコード:

<?php
  $newSeed    = $label . $seed; // concat as strings
  // $p_sha1
  $psha1 = p_hash('sha1', $secret, $newSeed, $length);
  $string = arrayToBytes($psha1);
  /**
  * P_SHA1 crypto alg calculation
  *
  * @return array of bytes - key
  **/
  function p_hash($algo, $secret, $seed, $length) {
    $bytes = array_fill(0, $length, 0); 
    $tmp = null;
    $A = $seed;
    $index = 0;

    while (1) {
      // hmac sha1: secret + seed
      $A = hash_hmac($algo, $secret, $A, true);

      // hmac sha1: secret + 1st hash + seed
      $output = hash_hmac($algo, $secret, ($A . $seed), true);

      foreach (bytesToArray($output) as $c) {
          if ($index >= $length) {
              return $bytes;
          }

          $bytes[$index] = $c;
          $index++;
      }
    }
    return $bytes;
}

function bytesToArray($bytes) { return unpack('C*', $bytes); }
function arrayToBytes($array) { return call_user_func_array("pack", array_merge(array("C*"), $array)); }
?>

誰かが私が既製の解決策をどこで見つけることができるか知っていますか? または、スクリプトを適切に動作させるのを手伝ってくれる人はいますか?

4

4 に答える 4

3

これは、"signing SOAP message request via ADFS" への返信に含まれる C# メソッドに基づいています。私はそれを使用して SOAP リクエストに署名し、必要な応答を得ることができました。

function psha1($clientSecret, $serverSecret, $sizeBits = 256)
{
    $sizeBytes = $sizeBits / 8;

    $hmacKey = $clientSecret;
    $hashSize = 160; // HMAC_SHA1 length is always 160
    $bufferSize = $hashSize / 8 + strlen($serverSecret);
    $i = 0;

    $b1 = $serverSecret;
    $b2 = "";
    $temp = null;
    $psha = array();

    while ($i < $sizeBytes) {
        $b1 = hash_hmac('SHA1', $b1, $hmacKey, true);
        $b2 = $b1 . $serverSecret;
        $temp = hash_hmac('SHA1', $b2, $hmacKey, true);

        for ($j = 0; $j < strlen($temp); $j++) {
            if ($i < $sizeBytes) {
                $psha[$i] = $temp[$j];
                $i++;
            } else {
                break;
            }
        }
    }

    return implode("", $psha);
}

注意すべき重要な点の 1 つは、この関数に渡す前に、クライアント シークレットとサーバー シークレットを base64 でデコードする必要があることです。

于 2013-11-11T16:19:29.453 に答える
1

これは「 WS-SecureConversation 1.3 」の実装であり、明らかに SHA1 ではなく、プロトコル固有の HMAC-SHA1 のバリエーションであることに注意してください。

それはTLS (RFC 2246)からのものであることが判明しました:

RFC 2246 で TLS 用に定義されたメカニズムのサブセットを使用します。具体的には、P_SHA-1 関数を使用して、セキュリティ キーの生成に使用できる一連のバイトを生成します。

あなたは最初に尋ねる人ではありません。たとえば、この質問には回答がありません RFC 2246 PRF function in PHP

于 2013-10-25T13:18:57.047 に答える
-1

既製のSHA1関数または何か他のものを探していますか? これにより SHA1 ハッシュが得られます。2 番目の引数に true を指定すると、バイナリで得られます。それ以外の場合は、16 進数で表示されます

于 2013-10-25T13:08:56.580 に答える