1. 程式人生 > >加密算法與隨機數生成算法

加密算法與隨機數生成算法

文件中 ssl 運維 環境 -s 限制 管理系 真隨機數 生成

使用安全可靠的加密算法和隨機數生成算法

密鑰管理

在密碼學裏有個基本原則:密碼系統的安全性應該依賴於密鑰的復雜性,而不是算法的保密性。

在安全領域裏,選擇一個足夠安全的加密算法不是困難的事,難的是密鑰管理。在密鑰管理中常見的錯誤是,將密鑰硬編碼在代碼裏。硬編碼的密鑰容易泄露:

① 代碼被廣泛傳播(開源軟件,商業軟件的二進制文件,逆向工程反編譯)。安全方案:通過 Diffie-Hellman 交換密鑰體系,生成公私密鑰來完成密鑰的分發。

② 軟件開發團隊的成員都能看到代碼,從而獲知密鑰,如果人員流動性較大,則密鑰的保密性無法保證。安全方案:改善密鑰管理,限制代碼讀寫權限等。

Web 應用中常見做法:將密鑰(包括密碼)保存在配置文件或數據庫中,在使用時由程序讀取並加載至內存。密鑰所在的配置文件或數據庫需要嚴格的控制訪問權限,同時也要確保運維或 DBA 中具有訪問權限的人員越少越好。在應用發布到生產環境時需要重新生成新的密鑰或密碼,以免與測試環境中使用的密鑰相同。

密鑰管理的主要目的是為了防止密鑰從非正常渠道泄露。定期更換密鑰是一種有效的做法。一個比較安全的密鑰管理系統,可以將所有的密鑰(包括敏感的配置文件)都集中保存在一個服務器或集群上,並通過 Web Service 的方式提供獲取密鑰的 API。每個 Web 應用在需要使用密鑰時,通過帶認證信息的 API 請求密鑰管理系統,動態獲取密鑰。Web 應用不能呢把密鑰寫入本地文件中,只加載到內存。密鑰集中管理降低了系統對密鑰的耦合性,也有利於定期更換密鑰。

使用可靠的偽隨機數算法

偽隨機數是通過一些數學算法生成的隨機數,並非真正的隨機數。密碼學上的安全偽隨機數是不可壓縮的。對應的真隨機數通常由物理系統產生,比如電壓的波動、空中電磁波的噪聲等。

安全的隨機數生成算法:在 Java 中,可以使用 java.security.SecureRandom;在 Linux 中,可以使用 /dev/random 或者 /dev/urandom;在 PHP5.3.0 及之後的版本中,若支持 OpenSSL 擴展,也可以直接使用函數來生成( string openssl_random_pseudo_bytes(int $length [, bool &$scrypto_strong]) )

此外,從算法上可以通過多個隨機數的組合來增加隨機數的復雜性。比如給隨機數使用 MD5 算法後再連接一個隨機字符,然後再使用 MD5算法。

加密算法與隨機數生成算法