Php banklink的签名创建问题

Php banklink的签名创建问题,php,openssl,Php,Openssl,我被困在银行链接上,我得到的回应是,我的签名是错误的 这是银行发送的签名部分手册 数字签名MAC是XML数据哈希值,使用发送方私钥加密。 对于散列值计算,使用SHA-1算法,但对于签名计算,使用RSA算法。数字签名使用BASE64编码转换为文本格式,并放置到MAC字段 我所建立的: // the key is loaded succesfull private function setPrivateKey ( $key_name ) { $fp = fopen( $this -> ge

我被困在银行链接上,我得到的回应是,我的签名是错误的

这是银行发送的签名部分手册

数字签名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函数都是返回set变量的set函数,我只是觉得没有必要发布它们。

好的,解决了这个问题。银行手册似乎不正确,但仍在等待银行的答复

将sha1替换为md5,所有内容均有效

$pre_mac = md5( $this -> getXMLData() );
Thanx,你用你的话给我指出了正确的方向:

你有没有试着完全省略中间散列


$this->getXMLData返回什么-一个字符串或一个对象/数组?顺便说一句,openssl_符号中说$data在处理过程中被散列到SHA-1;你有没有试着完全省略中间散列呢?是的,我开始使用w/out$pre_mac=sha1$this->getXMLData;行。银行提供了一些样本数据来检查你的算法吗?不幸的是,我什么都不知道。