網絡安全系列 之 密碼算法


1. 簡介

1.1 密碼算法作用

  1. 機密性:敏感信息不泄露給未經授權的實體。
  2. 完整性:保證信息在儲存和傳輸過程中不被修改。如使用hash函數校驗。
  3. 真是性:可以確定遠程用戶或系統的身份。
  4. 不可抵賴性:證明一個唯一的用戶進行了交易請求。用戶是不可能對他或她的行為進行否認的。

1.2 常用密碼算法

  • 對稱加密算法
  • 非對稱加密算法
  • 哈希算法

2. 隨機數

密碼算法中的密鑰、密鑰材料、鹽值、IV的生成都使用到隨機數,應使用密碼學安全的隨機數發生器來產生。

可以使用哪些安全的隨機數發生器?
如果產品支持使用硬件隨機數接口則盡量使用硬件接口來產生隨機數,如果不支持,可使用以下安全的隨機數發生器或接口:
OpenSSL庫的RAND_bytes( );
中軟iPSI組件的CRYPT_random( );
JDK的java.security.SecureRandom( );
類Unix平台的/dev/random文件;
Windows平台的RtlGenRandom( );
VxWorks平台CCI組件的cciRand( )函數。
使用RAND_bytes()和CRYPT_random()前要在程序初始化時分別調用RAND_seed()和CRYPT_randSeed()設置隨機數種子。可使用系統時間或程序運行時間(毫秒為單位)作為種子。

注意:C標准庫函數random( )、rand( )以及Java的java.util.Random類,所產生的隨機數都不屬於安全隨機數,禁止用於安全用途。

3. 對稱加密算法

對稱加密算法用來對敏感數據等信息進行加密。
加密密鑰和解密密鑰是一樣的或者彼此之間容易相互確定。

  • 分組密碼算法:將明文分成固定長度的分組,如64bit或128bit一組,用同一密鑰和算法對每一個分組加密,輸出也是固定長度的密文。
  • 流密碼算法:將明文按字符逐位(逐比特)地、對應地進行加密的一類對稱密碼算法。

最佳實踐:

使用對稱分組密碼算法進行加密時,推薦使用AES算法(Advanced Encryption Standard)。
(所有的流密碼算法都存在結構上的弱點)
要點: 正確生成密鑰、密碼算法工作模式的選取(分組密碼算法時選擇GCM或CBC模式)、IV生成(安全隨機數)。

4. 非對稱加密算法

又稱公鑰密碼算法。其使用兩個密鑰,一個公鑰,一個私鑰。公鑰可以向所有使用者公開,私鑰需要保密。
非對稱密碼算法廣泛應用密鑰協商、數字簽名、數字證書等安全領域。

4.1 RSA算法

RSA算法是第一個既能用於數據非對稱加密也能用於數字簽名的算法。應用:

  • 密鑰對生成:產生公鑰和私鑰
  • 非對稱加密:采用公鑰加密私鑰解密
  • 數字簽名:私鑰對消息摘要加密,公鑰驗簽

最佳實踐:

非對稱加密,選擇RSA算法時,其密鑰長度應為2048bits
RSA算法進行非對稱加密時,優先選擇OAEP填充方式

4.2 數字簽名

作用:數據完整性、身份認證、抗抵賴。

  • 數字簽名的流程

簽名

  1. 信息的發送方使用哈希函數(如SHA-256)對信息生成信息摘要;
  2. 信息的發送方使用自己的私鑰對摘要值進行非對稱加密(簽名);
  3. 信息發送方將信息和加密后的摘要值封裝成簽名結果,發送給接收方。

驗簽

  1. 接收方首先利用發送方的公鑰解密數字簽名,導出摘要值;
  2. 接收方使用同樣的哈希函數對信息重新計算摘要值;
  3. 將(步驟1)解密出的摘要值和(步驟2)計算得到的摘要值進行比較,如果相同,則簽名得到驗證,否則簽名無效。

最佳實踐

數字簽名算法選擇,推薦使用RSA(2048bits)或者ECDSA(256bits)簽名算法。
簽名算法要結合安全的哈希算法一起使用。
只對來源可信的數據進行簽名。
在同時進行加密和簽名時,使用先簽名后加密的方式。

5. 哈希算法

哈希算法也叫消息摘要算法、單向散列、數字指紋算法。對任意給定的數據生成一個定長的摘要。
在密碼學中,哈希算法常用於構造MAC或在數字簽名方案中用於提取數字指紋,也常用於輸入比較、軟件完整性保護、密鑰導出、口令保存、隨機數生成。

常用的安全哈希算法:SHA-256、SHA-384、SHA-512.
不安全的哈希算法:MD2、MD4、MD5、SHA-1.

常見誤用1:口令使用可還原的方式儲存,攻擊者可能獲取口令仿冒用戶身份登錄。

口令是指用於身份認證、鑒權或者導出加密密鑰的字符串,可由字母、數字和符號組成。口令不是密鑰(key)。
對於不需要還原口令的場景必須保存口令的單向哈希值。

常見誤用2:口令使用了哈希算法,但沒有加鹽,不能抵抗彩虹表攻擊。

彩虹表:就是一個龐大的、針對各種可能的字母組合預先計算好的哈希值的集合。
鹽值:通過在口令任意位置插入字符串,讓哈希后的結果和使用原始口令的哈希結果不相符,這種過程稱之為“加鹽”。這個字符串就是鹽值。

最佳實踐:口令單向哈希場景下推薦使用PBKDF2算法

單純的口令哈希值,無法防止彩虹表攻擊。哈希加鹽可以防止彩虹表攻擊,但無法防止暴力攻擊,安全性仍不足,標准的基於口令密鑰導出算法考慮了彩虹表攻擊和暴力攻擊的防范,更為安全。
PBKDF2算法是一個密鑰導出算法,既可用於導出密鑰,也可用於口令保存,計算公式:
DK = PBKDF2(Password, Salt, count, dkLen)。
要點:哈希算法推薦使用SHA256及以上、迭代次數最低10000次、鹽值至少為8字節安全隨機數、輸出長度不少於256比特。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM