首頁 > web前端 > js教程 > 使用Javascript加密解密

使用Javascript加密解密

伊谢尔伦
發布: 2016-11-22 13:07:26
原創
1864 人瀏覽過

在創建 Opal 網站時,我們所面臨的挑戰,是尋找在瀏覽器中加密解密的可靠方法。

這篇文章描述了瀏覽器端加密所面臨的難題,並指出了近期的科技進步所提供的一種解決方案。

在 Web 應用中加密的三種選擇

只有 JavaScript 才是所有瀏覽器都支援的語言。與 Opal 同類的 Web 應用程式使用 JavaScript 編寫,以便於在任何現代瀏覽器上運作。如果這些應用程式要使用加密函數,那麼 JavaScript 必須能夠存取到它們。

目前,要把加密函數暴露給瀏覽器的 JavaScript,只有三個選項:

1、使用插件加密

插件是指運行在瀏覽器中,可以由 JavaScript 呼叫的,編譯過的程式碼。

例如,Java 和 Flash 中存在的加密庫。這樣的做法通常性能很高,但是需要用戶安裝瀏覽器插件程序,而這,也是人們不願意,或者完成不了的部分(如果他們使用的是公用電腦)。

另一個選項是使用 Chrome 瀏覽器的 NaCl 用戶端(Native Client) 程序,它允許運行由 C 或 C++ 編譯出的機器碼。同樣,這種做法的效能很高,但是NaCl客戶端程式只能用於 Chrome 瀏覽器。

即使這些插件和NaCl客戶端程式在速度上有優勢,但是因為他們需要用戶使用特殊插件,或者使用特定瀏覽器,因此這種做法的可移植性不是很好。

2、使用 Web 加密 API

即將出現的 Web 加密 API 會給 JavaScript 提供原生的基本加密接口,讓 Web 應用可以更快地加密解密。但是,這項介面仍在草案階段,主流瀏覽器要採用這項技術還很長的一段時間。而現在,多數瀏覽器中能使用的,只有crypto.getRandomValues()函數。

在 Web 加密 API 廣泛應用之前,這並不是一項切實可行的瀏覽器端加密方案。

3、直接用 JavaScript 加密

這種方案的優點就在於高度的可移植性。所有的瀏覽器都可以執行 JavaScript,也意味著所有的瀏覽器都可以呼叫 JavaScript 寫成的加密函式庫。

在 JavaScript 加密主要有兩項缺陷:安全性和速度。我們會輪流談到這兩項缺陷。

JavaScript 加密可以變得安全

有文章聲稱“JavaScript 加密是有害的”,並且列出了許多證據支持這一論述。

文中的某些觀點現在不再準確了。例如,這篇文章說,Math.random()函數不是隨機數的良好來源,所以不可能得到足夠的隨機數字來加密。 Math.random() 函數的確不是隨機數的良好來源。在現代瀏覽器已經提供了 crypto.getRandomValues()函數以獲得足夠數量的隨機數。

這個帖子中有相當多的案例證明 JavaScript 加密是個壞主意,但這種做法也它的意義。

這條回答有利地駁斥了第一個帖子中的許多觀點,同時也指出了JavaScript 加密的兩個有效用例:端對端的資訊加密(也就是對主機存取做出防護的應用)以及安全的遠端密碼認證。這些剛好是 Opal 加密的使用場景,所以我們使用 JavaScript 加密是非常自然的。

JavaScript 加密可以很快

直到最近,JavaScript 在進行安全加密所要用到的複雜計算時都很慢。這直接導致了許多應用程式需要依賴插件所提供的加密功能,這樣的做法可移植性差,同時也會讓用戶厭煩。

幸運的是,JavaScript 近年來的效能有極大提升,所以完全使用 JavaScript 進行加密操作是可行的。現在有許多 JavaScript 加密庫可供選擇(連結1,連結2,連結3,連結4,連結5,連結6,連結7,連結8,連結9)。

於是就變成了選哪一個函式庫的問題。

NaCl,一個可以信賴的 C 語言加密函式庫

NaCl (讀作 “salt”) 是一個 C 語言的函式庫,提供對稱式金鑰加密解密和公鑰簽章認證的應用程式。它由密碼學人士編寫,在加密社區廣為人知,受到信賴。問題之一是 NaCl 是 C 語言,而不是 JavaScript 編寫的。

js-NaCl:將 NaCl 編譯成 JavaScript

幸運的是,我們能把 NaCl 編譯成 LLVM 的字節碼,然後用 emscripten 將這些字節碼編譯成 JavaScript。而且,LLVM 編譯器能在編譯時作許多最佳化,所以得到的 JavaScript 程式碼也會得到最佳化。因此我們可以將 NaCl 函式庫編譯成 JavaScript,作好在瀏覽器中執行的準備!

js-nacl 專案正是: 編譯成 JavaScript 的 NaCl 加密函式庫。

asm.js 的速度很快!

更好的是,emscripten 編譯出的程式碼是 JavaScript 的子集,也叫做 asm.js。你可以將 asm.js 當作很像 JavaScript 的組合語言。瀏覽器遇到了 asm.js 的程式碼區塊時,會將其編譯成高效的機器碼,運行速度接近原生程式碼。

目前主要只有 Firefox 瀏覽器支援 asm.js 的最佳化。這使得 js-nacl 在 Firefox 中的加密解密非常迅速,視具體操作的不同,比 Chrome 瀏覽器的速度快 2 至 8 倍。但即使是 Chrome,js-nacl 也很快,超過了我們所測試的其他所有加密庫。

NaCl 這樣備受信賴的加密庫和現代瀏覽器的快速執行,使像 Opal 這樣的 Web 應用都應當使用 js-nacl 庫。

同樣的原因下,Opal 使用了由 emscripten 編譯出的 asm.js 版 scrypt 函式庫來擴充金鑰(正在這篇文章中啟用)。你可以看到由專案維護者提供的 js-nacl 和 js-scrypt 效能的比較。我們同時也為 js-nacl 作了 jsperf 測試,了解各個不同瀏覽器版本的效能差異,你也可以隨意嘗試。


相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板