webcrypto库下载_使用WebCrypto API的电子签名
webcrypto庫下載
有時我們需要讓用戶進行電子簽名。 通常,人們會理解為以某種方式將您的手寫簽名放置在屏幕上。 根據管轄范圍,可能很好,或者僅存儲圖像可能還不夠。 例如,在歐洲,有910/2014號法規 ,該法規定義了什么是電子簽名。 從法律文本可以預期到,該定義相當模糊:
“電子簽名”是指電子形式的數據,該數據附加到其他電子形式的數據上或與其他邏輯形式相關聯,并由簽字人用來簽署;
是的,再讀幾次,再說幾次“ wat”,讓我們討論一下這是什么意思。 它基本上可以表示任何東西。 僅將繪制的簽名的圖像(例如,使用html畫布)附加到數據上,并且仍然可以計數,這在技術上是可以接受的。
但是,當我們使用更具體的電子簽名類型-高級和合格的電子簽名時,情況會好一些:
 高級電子簽名應滿足以下要求: 
 (a)與簽字人有獨特的聯系; 
 (b)有能力識別簽字人; (c)它是使用電子簽名創建數據創建的,簽名者可以在其唯一的控制下以高度的信心使用該簽名; 和 (d)它以這種方式鏈接到用其簽名的數據,從而可以檢測到該數據的任何后續更改。 
從技術意義上講,這看起來像是正確的“數字簽名”,例如,使用私鑰進行簽名,并使用公共密鑰來驗證簽名。 “合格”簽名需要由合格的提供者發出,該提供者基本上是一個受信任的證書頒發機構。 必須在安全設備(智能卡和HSM)上發布用于放置合格簽名的密鑰,以便除所有者外,其他任何人都不能訪問私鑰。
但是,高級簽名和合格簽名之間的法律區別尚不完全清楚–該法規明確指出,不合格簽名也具有法律價值。 在瀏覽器中使用合格的簽名(帶有智能卡)會給用戶帶來可怕的體驗-在大多數情況下,它會通過Java Applet進行,而Java Applet基本上只能在Internet Explorer和當今的特殊Firefox版本上運行。 替代方案包括處理簽名的桌面軟件和本地服務JWS應用程序,但是智能卡目前是一個大問題,而且話題不多。
那么,我們如何允許用戶“放置”電子簽名? 我有一個想法,那就是可以完全使用WebCrypto API來完成此工作,如今,WebCrypto API在瀏覽器中或多或少地得到了支持。 這個想法如下:
- 讓用戶輸入密碼以作弊
 - 從密碼中獲取密鑰(例如,使用PBKDF2)
 - 使用派生密鑰在用戶提交的表單內容上簽名
 - 將簽名與其余表單數據一起存儲
 - (可選)存儲派生密鑰以進行驗證
 
這是實現該流程的javascript要點 。
許多片段來自非常有用的webcrypto示例存儲庫 。 hex2buf,buf2hex和str2ab函數是實用程序(可惜在js中不是標準的)。
該代碼的作用很簡單,即使有點冗長。 所有操作都使用Promise和“ then”鏈接在一起,說實話,這對編寫和閱讀非常繁瑣(但我想不可避免):
- 密碼作為原始密鑰加載(轉換為數組緩沖區后)
 - 使用PBKDF2導出一個秘密密鑰(具有100次迭代)
 - 密鑰用于對用戶填寫的內容進行HMAC“簽名”
 - 簽名和密鑰被存儲(在此示例中的UI中)
 - 然后可以使用以下數據驗證簽名:數據,簽名和密鑰
 
 您可以在這里進行測試: 
存儲簽名應足以滿足“電子簽名”的定義。 這是只有用戶知道的秘密密碼,甚至可能意味著這是“高級電子簽名”。 存儲派生的秘密密鑰是有問題的–如果存儲它,則意味著您可以代表用戶“偽造”簽名。 但是,不存儲它意味著您無法驗證簽名-只有用戶可以。 根據用例,您可以選擇其中一個。
現在,我不得不承認我嘗試從密碼(RSA和ECDSA)派生非對稱密鑰對。 WebCrypto API不允許開箱即用。 因此,我嘗試使用deriveBits()“生成”密鑰,例如,為RSA設置“ n”和“ d”值,為ECDSA設置x,y和d值( 可以在稍作搜索后在此處找到) 。 但是我失敗了–您不能僅將任何值指定為importKey參數,并且約束條件未記錄在任何地方,除了底層算法細節以外,這超出了我的實驗范圍。
目的是,如果我們僅從密碼中獲取私鑰,就可以輕松地從私鑰中獲取公鑰(反之則不然)–然后我們將公鑰存儲以進行驗證,而私鑰仍然是真正的私鑰,這樣我們就不能偽造簽名。
我必須在此處添加免責聲明,因為我意識到這不是很安全。 首先,在許多情況下從密碼派生密鑰是有問題的。 但是,在這種情況下(放置簽名),可以。
附帶說明一下–使用WebCrypto API十分繁瑣。 也許是因為還沒有人真正使用過它,所以搜索錯誤基本上可以為您提供Chromium的源代碼,而沒有其他任何東西。 感覺像是一個未知的領域(盡管文檔和示例足以使您入門)。
我不知道以這種方式進行電子簽名是否有用。 我將其實現為一個實際有意義的用例(參與方成員資格聲明簽名)。 它是否比畫布上的手繪簽名更好–我認為是這樣(除非您從圖像中得出密鑰,否則,由于較高的熵,手寫的密鑰會更好)。
翻譯自: https://www.javacodegeeks.com/2017/06/electronic-signature-using-webcrypto-api.html
webcrypto庫下載
總結
以上是生活随笔為你收集整理的webcrypto库下载_使用WebCrypto API的电子签名的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 文广新局官网(文广备案)
 - 下一篇: java登录界面命令_Java命令行界面