久久久精品一区ed2k-女人被男人叉到高潮的视频-中文字幕乱码一区久久麻豆樱花-俄罗斯熟妇真实视频

Node.js中ECDSA簽名如何使用

今天就跟大家聊聊有關(guān)Node.js 中ECDSA 簽名如何使用,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

創(chuàng)新互聯(lián)建站服務(wù)項目包括葉城網(wǎng)站建設(shè)、葉城網(wǎng)站制作、葉城網(wǎng)頁制作以及葉城網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,葉城網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到葉城省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

坑 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)換問題了?,F(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)了一個特點,在 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ì)看了下,原來是因為 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)。

看完上述內(nèi)容,你們對Node.js 中ECDSA 簽名如何使用有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。

本文標(biāo)題:Node.js中ECDSA簽名如何使用
文章URL:http://sd-ha.com/article36/jocppg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、品牌網(wǎng)站建設(shè)動態(tài)網(wǎng)站、App開發(fā)、面包屑導(dǎo)航網(wǎng)站設(shè)計公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營