0

銀行のリンクを完成させるのに行き詰まっていて、署名が間違っているという応答があります。

これは銀行が送った署名部分のマニュアルです

デジタル署名MACは、送信者の秘密鍵で暗号化されたXMLデータハッシュ値です。
ハッシュ値の計算にはSHA-1アルゴリズムが使用されますが、署名の計算にはRSAアルゴリズムが使用されます。デジタル署名は、BASE64エンコーディングを使用してテキスト形式に変換され、MACフィールドに配置されます。

そして私が築き上げてきたもの:

// the key is loaded succesfull
private function setPrivateKey ( $key_name ) {
  $fp = fopen( $this -> getKeyLocation() . '/' . $key_name, "r" );
  $priv_key = fread( $fp, 8192 );
  fclose( $fp );
  $this -> private_key = openssl_get_privatekey( $priv_key );
}

// signature is created, but not the way bank expects it
private function setSignature () {
  // also tried sha1( $data, true );
  // signature contains no special chars ( meaning no UTF8 specific coding )
  $pre_mac = sha1( $this -> getXMLData() );
  openssl_sign( $pre_mac, $signature, $this -> getPrivateKey() );
  $this -> signature = $signature;
}

// can't be a problem here
private function setMac () {
  $this -> mac = base64_encode( $this -> getSignature() );
}

// this is set correctly
private function setXMLData () {
    $bank_xml = '<?xml version="1.0" ?>
    <bl>
    <snd>PHP_COMPANY</snd>
    <query>NEW</query>
    <type>PHP_TYPE</type>
    <data>
        <client_id>A71045</client_id>
        <amount>PHP_AMOUNT</amount>
        <ccy_name>PHP_CURR</ccy_name>
        <ccy_code>1</ccy_code>
        <bnf_name>PHP_COMPANY</bnf_name>
        <bnf_account>PHP_ACCOUNT</bnf_account>
        <bnf_id>PHP_CID</bnf_id>
        <residence_id>LV</residence_id>
        <residence_name>LV-LATVIA</residence_name>
        <details>PHP_DETAILS</details>
    </data>
    <date>PHP_DATE</date>
    <time>PHP_TIME</time>
    <reply>
        <session_id>PHP_SESSION</session_id>
    </reply>
    <reply_url>PHP_REPLY</reply_url>
    </bl>';

    $this -> bank_xml = $bank_xml;
}

私はそれを正しく暗号化していないようです。何が間違っている可能性がありますか?私は銀行が必要とするすべてのステップを踏んだと信じています。

私はすでにこれを銀行に送りました、しかし彼らは一週間かそこらで応答します。

PS:get関数はすべて、設定された変数を返すように設定されています。投稿する必要はないと思いました。

4

1 に答える 1

0

わかりました、問題を修正しました。銀行の説明書が間違っているようです(まだ銀行からの返事待ちですが)。

sha1 を md5 に置き換え、すべて有効になりました。

$pre_mac = md5( $this -> getXMLData() );

ありがとうraina77ow、あなたのコメントで正しい方向に私を指摘しました:

その中間ハッシュを完全に省略しようとしましたか?

于 2012-07-06T13:46:10.060 に答える