最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Node.js 中使用 ECDSA 簽名遇到的坑

 更新時間:2018年11月26日 14:40:12   作者:全體人員  
這篇文章主要介紹了詳解Node.js 中使用 ECDSA 簽名遇到的坑,主要是使用 Node.js 的 Crypto 模塊無法校驗(yàn)網(wǎng)絡(luò)傳輸過來的簽名結(jié)果,感興趣的小伙伴們可以參考一下

最近有個朋友問我關(guān)于 Node.js 下使用 ECDSA 的問題,主要是使用 Node.js 的 Crypto 模塊無法校驗(yàn)網(wǎng)絡(luò)傳輸過來的簽名結(jié)果。在踩坑無數(shù)后,終于搞清楚了原因。

坑 0x00:簽名輸出格式

在排除了證書、消息不一致的可能之后,我開始對比使用 Node.js 簽名的結(jié)果與網(wǎng)絡(luò)傳輸過來的簽名,發(fā)現(xiàn)長度不一致,大約差了5~7個字節(jié)。于是去網(wǎng)上搜索了一下,才知道原來 Node.js (基于 OpenSSL)簽名得到的是 DER 格式的內(nèi)容,而網(wǎng)絡(luò)上常用的 ECDSA 簽名結(jié)果是 IEEE P1363 格式的。(也可以寫作 R|S)

參考:https://stackoverflow.com/a/39575576

知道問題了就好解決了。但是,DER 和 IEEE P1363 兩個格式互轉(zhuǎn)也不是那么容易的。

簡單科普一下,ECDSA 是指基于 ECC 橢圓加密算法的簽名方式,簽名結(jié)果是兩個整數(shù) R 和 S。 R 和 S 一般長度相同,或者接近。如果長度不同,在各自前面補(bǔ)字節(jié) 0x00 直到等長。把 R 和 S 以大頭字節(jié)序表示,然后依次前后拼接,就是所謂 IEEE P1363 格式。

坑 0x01:DER 的整數(shù)問題

先來了解一下 ECDSA 的 DER 輸出格式,大概如下:

SEQUENCE <LENGTH>
 INTEGER <INTEGER_LENGTH> <INTEGER_VALUE...> # 整數(shù) R
 INTEGER <INTEGER_LENGTH> <INTEGER_VALUE...> # 整數(shù) S

其中

SEQUENCE 是 DER 數(shù)組(串?)標(biāo)頭,用一個字節(jié) 0x30 表示

<LENGTH> 是 SEQUENCE 的長度,用一個字節(jié)表示,不包括標(biāo)頭和這個長度本身

INTEGER 是整數(shù)標(biāo)頭,用一個字節(jié) 0x02 表示

<INTEGER_LENGTH> 是整數(shù)的字節(jié)長度,用一個字節(jié)表示。

<INTEGER_VALUE> 是整數(shù)的內(nèi)容,以大頭字節(jié)序表示。

另一個坑我也已經(jīng)寫出來了,不知道有人發(fā)現(xiàn)沒有?沒想到的話,繼續(xù)往下。

IEEE P1363 格式下,R 和 S 都是等長的。所以只要把 IEEE P1363 格式的簽名從中間切分就可以得到 R 和 S 的內(nèi)容了。而且 IEEE P1363 格式下,R 和 S 也是以大頭字節(jié)序表示的,因此沒有字節(jié)序轉(zhuǎn)換問題了。現(xiàn)在,只需要按上面的格式構(gòu)造一個 DER 即可。

坑 0x01.0:缺少整數(shù)前置字節(jié) 0x00

我第一次嘗試將 IEEE P1363 格式的簽名轉(zhuǎn)換成 DER 格式,并沒有失敗,但是當(dāng)我換一個簽名結(jié)果,卻失敗了……我對比了 DER 和 IEEE P1363 的區(qū)別,發(fā)現(xiàn)了一個特點(diǎn),在 DER 格式下,R 和 S 偶爾會有前置字節(jié) 0x00,但不是一定的。

查資料后才明白,DER 下沒有“無符號整數(shù)”之說,也就是說整數(shù)都是有符號的。如果 INTEGER 所表示的整數(shù)最高字節(jié)大于 0x7F,也就是最高位(符號位)為 1,則表示負(fù)數(shù)。如果要表示正數(shù),必須在前面補(bǔ)一個字節(jié) 0x00……

參考 https://bitcointalk.org/index.php?topic=215205.msg2258789#msg2258789

坑 0x01.1:多余的整數(shù)前置字節(jié) 0x00

在我修改代碼后,雖然提高了成功率,可仍然有失敗的情況,仔細(xì)看了下,原來是因?yàn)?IEEE P1363 格式里,R 和 S 可能被補(bǔ)了不止 1 個字節(jié) 0x00……

而 DER 下雖然要求補(bǔ)字節(jié) 0x00,卻是有且只能有一個字節(jié) 0x00。

到此,問題都解決了——直到我測試了 521-bit (是的,你沒看錯,不是 512) 長度的密鑰時,完全失敗,毫無例外。

坑 0x02:DER SEQUENCE 的長度超過 0x7F

前面說了,<LENGTH> 只能用一個字節(jié)表示,這是一個整數(shù),前文我提到的整數(shù)正負(fù)問題,這里也存在!

即是說,ECDSA 簽名使用 DER 輸出格式時,如果使用 521-bit (是的,你沒看錯,不是 512) 長度的密鑰時,DER的長度將超出 0x7F,使得 <LENGTH> 變成了負(fù)數(shù)!

而解決方案不是補(bǔ)字節(jié) 0x00,而是用字節(jié) 0x81 填充 <LENGTH>,再在下一個字節(jié)用一個無符號整數(shù)的表示長度(0 ~ 255)。

參考:https://stackoverflow.com/a/47099047

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • node.js中的fs.symlink方法使用說明

    node.js中的fs.symlink方法使用說明

    這篇文章主要介紹了node.js中的fs.symlink方法使用說明,本文介紹了fs.symlink的方法說明、語法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • 基于Node.js的WebSocket通信實(shí)現(xiàn)

    基于Node.js的WebSocket通信實(shí)現(xiàn)

    這篇文章主要介紹了基于Node.js的WebSocket通信實(shí)現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • sails框架的學(xué)習(xí)指南

    sails框架的學(xué)習(xí)指南

    本文從最基礎(chǔ)的sails框架知識開始講起,通過示例給我們展示了sails框架的各個方面,非常的不錯,推薦給小伙伴們
    2014-12-12
  • node.js中的events.emitter.once方法使用說明

    node.js中的events.emitter.once方法使用說明

    這篇文章主要介紹了node.js中的events.emitter.once方法使用說明,本文介紹了events.emitter.once的方法說明、語法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • 學(xué)習(xí)Node.js模塊機(jī)制

    學(xué)習(xí)Node.js模塊機(jī)制

    這篇文章主要為大家詳細(xì)介紹了Node.js模塊機(jī)制,一篇關(guān)于Node.js模塊機(jī)制的學(xué)習(xí)筆記,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Node.js包管理工具

    Node.js包管理工具

    本文主要詳細(xì)介紹了node包管理工具,主要介紹了npm,cnpm及yarn,文中有詳細(xì)的代碼示例,對學(xué)習(xí)具有一定參考價值,需要的朋友可以參考一下
    2023-04-04
  • 實(shí)例詳解Nodejs 保存 payload 發(fā)送過來的文件

    實(shí)例詳解Nodejs 保存 payload 發(fā)送過來的文件

    這篇文章主要介紹了實(shí)例詳解Nodejs 保存 payload 發(fā)送過來的文件 的相關(guān)資料,需要的朋友可以參考下
    2016-01-01
  • node.js實(shí)現(xiàn)簡單的壓縮/解壓縮功能示例

    node.js實(shí)現(xiàn)簡單的壓縮/解壓縮功能示例

    這篇文章主要介紹了node.js實(shí)現(xiàn)簡單的壓縮/解壓縮功能,結(jié)合實(shí)例形式分析了node.js實(shí)現(xiàn)本地文件與服務(wù)器端壓縮/解壓縮相關(guān)操作技巧,需要的朋友可以參考下
    2019-11-11
  • Windows7系統(tǒng)下如何安裝nodejs16以上版本

    Windows7系統(tǒng)下如何安裝nodejs16以上版本

    這篇文章主要給大家介紹了關(guān)于Windows7系統(tǒng)下如何安裝nodejs16以上版本的相關(guān)資料,很多時候node.js的版本存在兼容,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • nodejs實(shí)現(xiàn)郵箱發(fā)送驗(yàn)證碼功能

    nodejs實(shí)現(xiàn)郵箱發(fā)送驗(yàn)證碼功能

    開發(fā)個人網(wǎng)站時,注冊頁面可以使用郵箱驗(yàn)證,于是記錄一下如何用nodejs/express服務(wù)器實(shí)現(xiàn)郵箱發(fā)送驗(yàn)證碼,不僅可以在郵箱注冊時使用,還可以拓展用于各種安全驗(yàn)證,本文給大家介紹了使用nodejs實(shí)現(xiàn)郵箱發(fā)送驗(yàn)證碼功能,需要的朋友可以參考下
    2024-07-07

最新評論

纳雍县| 周至县| 玉树县| 西充县| 资中县| 成武县| 长治市| 宾川县| 洞头县| 资溪县| 蒙城县| 北安市| 沂水县| 页游| 望谟县| 庄浪县| 陆河县| 墨江| 麻城市| 平安县| 浙江省| 建宁县| 纳雍县| 云安县| 堆龙德庆县| 枣阳市| 六盘水市| 额济纳旗| 四平市| 通河县| 万荣县| 务川| 伊金霍洛旗| 饶平县| 保山市| 博乐市| 潼关县| 新津县| 焉耆| 开封市| 阿勒泰市|