Random-Number-Generator

伺服器端 Javascript 安全性

  • October 4, 2012

javascript 庫缺乏創建適當 PRNG 的能力是公認的。我的理解是,這主要是由於 javascript 所在的沙盒瀏覽器環境的限制。

它是否正確?由於系統範圍的訪問,伺服器端 javascript 可以生成可證明的安全加密嗎?

我特別對 node.js 產生了興趣。

據我所知,沒有任何基本障礙可以阻止您在 JavaScript 中實現您想要的任何加密算法,無論是在伺服器端還是客戶端。與用 C 或程序集編寫的優化實現相比,低級加密原語(如分組密碼或 PRNG)的 JavaScript 實現可能會很慢,而且很難防止側通道攻擊(儘管有一些方法可以做到這一點,特別是如果你知道CPU 和解釋器(程式碼將在其上執行),但它們仍然可以工作。

在客戶端使用 JavaScript 進行加密的最大問題是,除非您使用 HTTPS 之類的安全通道將程式碼傳遞給客戶端,否則您無法保證客戶端接收和執行的程式碼與您的程式碼相同從伺服器發送。如果您確實使用 HTTPS,那麼您也可以使用它將數據安全地發送到伺服器,而無需進行客戶端 JavaScript 加密。

(也就是說,在極少數情況下,即使在客戶端 JavaScript 中進行加密也可能有意義。例如,在某些情況下,您可能希望要求客戶端在向伺服器請求昂貴的操作之前送出工作證明為了防止拒絕服務攻擊。或者,一些昂貴的加密操作,例如密鑰拉伸,可以安全有效地完全解除安裝到客戶端(儘管您仍然應該在使用之前使用傳統的散列函式對客戶端送出的密鑰進行散列) )。

然而,在這兩種情況下,JavaScript 加密實現的緩慢都為攻擊者提供了一個不受歡迎的優勢,他們可能不會執行實際的 JavaScript,而是用更快的語言重新實現算法。這是一個案例,通過提供對來自 JavaScript 的快速本機加密原語的訪問,提議的Web Crypto API實際上可能有用。)

在任何情況下,安全程式碼傳遞的問題都不適用於伺服器端 JavaScript,因為不存在需要發送程式碼的不受信任的網路。但是,在 JavaScript 中執行低級加密操作的性能問題肯定仍然存在,除非您的伺服器 JavaScript 解釋器提供一些 API 讓您的 JavaScript 程式碼使用快速的本機加密原語。

引用自:https://crypto.stackexchange.com/questions/3956