V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
Emory_M
V2EX  ›  Node.js

node.js的crypto模块Sign签名如何实现与php的openssl_sign相同的算法

  •  
  •   Emory_M · Sep 2, 2013 · 12862 views
    This topic created in 4630 days ago, the information mentioned may be changed or developed.
    查看php的openssl_sign文档得到signature_alg参数默认使用 OPENSSL_ALGO_SHA1 (integer)
    但是在nodejs使用crypto.createSign('RSA-SHA1')算法对字符串进行加签 却无法得到一致的签名
    node.js文档中提示使用openssl list-public-key-algorithms来获取算法列表,但是debian获取到的列表并无法直接使用

    如何使用node.js crypto.createSign生成与php openssl_sign一致的签名?
    Supplement 1  ·  Apr 19, 2015
    node.js内部编码问题
    使用signer.update(str,'utf8') 解决
    14 replies    2016-07-14 22:55:17 +08:00
    shiny
        1
    shiny  
    PRO
       Sep 2, 2013
    上 node 的代码,贴 gist。
    shiny
        3
    shiny  
    PRO
       Sep 2, 2013
    我试了下你提供的代码,是一样的啊。

    重新整理的版本: https://gist.github.com/shiny/6410663
    shiny
        4
    shiny  
    PRO
       Sep 2, 2013
    忘记贴图了:
    Emory_M
        5
    Emory_M  
    OP
       Sep 2, 2013
    @shiny 能把私钥贴给我吗?
    Emory_M
        6
    Emory_M  
    OP
       Sep 2, 2013
    @shiny 我是这样生成 生成私钥的:openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
    shiny
        7
    shiny  
    PRO
       Sep 2, 2013
    我用 ssh-keygen 重新生成了一个 test_rsa 结果一样。上传到了 debian 主机上生成也一样。
    你提供的命令行看上去不是生成私钥的,而是根据私钥生成 public_key。

    这是生成的 rsa:

    https://gist.github.com/shiny/6410836
    Emory_M
        8
    Emory_M  
    OP
       Sep 2, 2013
    @shiny 呵呵,贴错了,是 openssl genrsa -out rsa_private_key.pem 1024
    shiny
        9
    shiny  
    PRO
       Sep 2, 2013
    用这个生成的 pem 同样没问题,以下是我的版本信息:
    php -v
    PHP 5.3.15 with Suhosin-Patch (cli) (built: Dec 9 2012 19:32:02)

    openssl
    OpenSSL support => enabled
    OpenSSL Library Version => OpenSSL 0.9.8x 10 May 2012
    OpenSSL Header Version => OpenSSL 0.9.8r 8 Feb 2011

    node -v
    v0.10.12
    Emory_M
        10
    Emory_M  
    OP
       Sep 2, 2013
    @shiny

    非常感谢
    看来是node.js的问题 iOS的openssl库加签和php是一致的
    重新编译试试

    你的openssl信息是如何打印的?

    我的版本如下:
    Debian 7.0 64Bit

    php -v
    PHP 5.4.4-14+deb7u3 (cli) (built: Jul 17 2013 14:54:08)

    node -v
    v0.10.7

    OpenSSL> version
    OpenSSL 1.0.1e 11 Feb 2013
    shiny
        11
    shiny  
    PRO
       Sep 2, 2013
    @Emory_M 我用 phpinfo 列的OpenSSL 版本号。

    不过我试了下 debian 上的 OpenSSL,版本和你的一样,输出的签名和本地0.9.8x的一样。
    Emory_M
        12
    Emory_M  
    OP
       Sep 2, 2013
    @shiny 了解到原因了,如果出现ascii以外的unicode字符那么加签名 结果就不一样了,看来又是node内部编码问题了
    Emory_M
        13
    Emory_M  
    OP
       Sep 3, 2013   ❤️ 2
    signer.update(str,'utf8') 解决
    Jaylee
        14
    Jaylee  
       Jul 14, 2016
    @Emory_M 忒感谢你了 差点放弃 node.js 了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1761 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 16:18 · PVG 00:18 · LAX 09:18 · JFK 12:18
    ♥ Do have faith in what you're doing.