【问题标题】:DSA signature: openssl_sign (php) vs Crypt::OpenSSL::DSA (perl) mismatchDSA 签名:openssl_sign (php) vs Crypt::OpenSSL::DSA (perl) 不匹配
【发布时间】:2013-11-27 09:24:37
【问题描述】:

目前在我的项目中,DSA 签名是通过 perl 生成的,并通过 perl 在其他服务器上进行验证。它工作正常。

几天前,我尝试将一项服务从 perl 迁移到 php,发现 php 会生成符号,而 perl 无法验证。此外,如果我在控制台中生成登录(使用 openssl 命令)- perl 还说签名无效。 所以,它看起来像这样:

PHP 签名 控制台签名 perl 签名

为什么会这样?

用于签名的私钥是相同的。

Perl 代码:

my $pk = Crypt::OpenSSL::DSA->read_priv_key('private.key');
print encode_base64( $pk->sign( md5($data) ) );

PHP 代码:

$pk = openssl_get_privatekey('private key string');
openssl_sign(md5($data, true), $signature, $pk, OPENSSL_ALGO_DSS1));
echo base64_encode($signature);

控制台代码(验证):

openssl dsa -in private_key.pem -pubout -out dsa_public_key.pem
openssl dgst -dss1 -verify dsa_public_key.pem -signature sign.bin data.md5

完全迷路了.. 第二天我找不到任何答案:( 你能告诉我挖的方法吗?

【问题讨论】:

    标签: perl openssl dsa php-openssl


    【解决方案1】:

    请注意,在您的示例中,您正在签名时进行双重摘要:dss1(md5(message)) - 其中dss1 实际上表示sha1

    所以,你创建这样的签名:

    echo -n 'data you want to sign' | openssl dgst -md5 -binary | openssl dgst -dss1 -sign openssl_dsa1_pri.pem > signature.bin
    

    您可以像这样通过 openssl comman 进行验证:

    echo -n 'data you want to sign' | openssl dgst -md5 -binary | openssl dgst -dss1 -verify openssl_dsa1_pub.pem -signature signature.bin
    

    使用 Crypt::OpenSSL::DSA 你可以像这样验证它:

    my $signature = read_file("signature.bin");
    my $message = 'data you want to sign';
    my $pub = Crypt::OpenSSL::DSA->read_pub_key('openssl_dsa1_pub.pem');
    warn "Verified=", $pub->verify(sha1(md5($message)), $signature), "\n";
    

    当然不需要双重摘要,你可以使用:

    echo -n 'data you want to sign' | openssl dgst -dss1 -sign openssl_dsa1_pri.pem > signature2.bin
    
    echo -n 'data you want to sign' | openssl dgst -dss1 -verify openssl_dsa1_pub.pem -signature signature2.bin
    
    my $signature = read_file("signature2.bin");
    my $message = 'data you want to sign';
    my $pub = Crypt::OpenSSL::DSA->read_pub_key('openssl_dsa1_pub.pem');
    warn "Verified=", $pub->verify(sha1($message), $signature), "\n";
    

    【讨论】:

    • hm...非常感谢您的回复,我认为使用 OPENSSL_ALGO_DSS1 不使用 sha1...我会检查它
    • 至于 DSS1 与 SHA1,您可能会发现有用 this post
    猜你喜欢
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 2017-07-24
    • 1970-01-01
    相关资源
    最近更新 更多