V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Emory_M
V2EX  ›  Node.js

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

  •  
  •   Emory_M · 2013-09-02 16:03:45 +08:00 · 12099 次点击
    这是一个创建于 3860 天前的主题,其中的信息可能已经有所发展或是发生改变。
    查看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一致的签名?
    第 1 条附言  ·  2015-04-19 15:12:14 +08:00
    node.js内部编码问题
    使用signer.update(str,'utf8') 解决
    14 条回复    2016-07-14 22:55:17 +08:00
    shiny
        1
    shiny  
       2013-09-02 16:10:17 +08:00
    上 node 的代码,贴 gist。
    shiny
        3
    shiny  
       2013-09-02 16:46:56 +08:00
    我试了下你提供的代码,是一样的啊。

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

    这是生成的 rsa:

    https://gist.github.com/shiny/6410836
    Emory_M
        8
    Emory_M  
    OP
       2013-09-02 17:19:40 +08:00
    @shiny 呵呵,贴错了,是 openssl genrsa -out rsa_private_key.pem 1024
    shiny
        9
    shiny  
       2013-09-02 17:24:36 +08:00
    用这个生成的 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
       2013-09-02 18:07:58 +08:00
    @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  
       2013-09-02 18:20:36 +08:00
    @Emory_M 我用 phpinfo 列的OpenSSL 版本号。

    不过我试了下 debian 上的 OpenSSL,版本和你的一样,输出的签名和本地0.9.8x的一样。
    Emory_M
        12
    Emory_M  
    OP
       2013-09-02 23:57:52 +08:00
    @shiny 了解到原因了,如果出现ascii以外的unicode字符那么加签名 结果就不一样了,看来又是node内部编码问题了
    Emory_M
        13
    Emory_M  
    OP
       2013-09-03 00:12:18 +08:00   ❤️ 2
    signer.update(str,'utf8') 解决
    Jaylee
        14
    Jaylee  
       2016-07-14 22:55:17 +08:00
    @Emory_M 忒感谢你了 差点放弃 node.js 了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3200 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 13:06 · PVG 21:06 · LAX 06:06 · JFK 09:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.