經常我看到專案中有人使用了對稱加密演算法,用來加密客戶或專案傳輸中的部分資料。但我注意到開發 人員由於不熟悉原理,或者簡單複製網上的**示例,有導致**存在安全風險。
我經常遇到的問題,有如下:
演算法位長
建議rc4
40des
563des
112aes
128✔
tl;dr:
rc4/des/3des都不符合加密/破解的安全性要求。
des是56位加密,聽起來感覺3des應該是168位,但實際上其有效加密位長只有112位。
其它更長的加密演算法,如aes 192位/aes 256位也符合要求。
tl;dr: 不要使用ecb。
ecb不需要初始向量(iv),這個「驚人」的發現常常讓開發簡單粗暴地設計為ecb。ecb的問題在於輸入和輸出存在非常明顯的關聯,攻擊者可以從輸出輕鬆地猜出輸入資料。
c#的aes演算法預設模式為cbc,該演算法沒有上述的安全問題,而且最為通用,可以使用該模式。
tl;dr:
初始向量必須為完全隨機數,完全隨機數應該使用randomnumbergenerator
進行加密。
回想這個問題,資料加密完後,該傳送什麼給接收方?僅資料?那麼初始向量(iv)怎麼辦?
大多數開發選擇的辦法是,寫乙個固定的初始向量(iv)用於加密,然後解密時,也使用相同的初始向量。這樣就導致相同的輸入會產生相同的輸出。
為什麼相同的輸入應該產生不同的輸出?因為根據歷史經驗,攻擊者可以獲取一些資訊,知道某個確定輸入的含義。一旦再次捕獲到相同的加密資料,就能輕易破解。
所以,傳送資料應該包含:版本+初始向量+資料。
加密是面向位元組還是字串?我認為應該面向位元組。如果面向字串,那麼很多問題很難受到重視。
試著回答這個問題:
我認為加密演算法應該面向位元組流/位元組資料,而不是字串。將字串傳送給客戶、放在json中進行端對端傳輸,是沒什麼毛病的做法。但基於以下原因,我強烈建議加密/解密演算法要基於位元組資料:
其中公共方法:// **按原樣提供,可隨意使用,但不對其安全性作任何保證。
string encrypt(string password, string purpose, byte plainbytes) }}
byte decrypt(string packedstring, string password, string purpose)
}}
解釋:// **按原樣提供,可隨意使用,但不對其安全性作任何保證。
byte passwordtokey(string password, string purpose)
}string base64urlencode(byte bytes)
byte base64urldecode(string base64url)
(byte version, byte iv, byte cipherbytes) unpack(byte packedbytes)
else }
byte pack(byte version, byte iv, byte cipherbytes)
.concat(iv).concat(cipherbytes).toarray();
}
測試**:
// **按原樣提供,可隨意使用,但不對其安全性作任何保證。
string purpose = "這個演算法是用來搞sso的";
// 返回:acfce3aqcmnkenthv-u09h_hygky_iry-7ugiw0izohi
encrypt("密碼here", purpose, encoding.utf8.getbytes("hello world"));
// 返回:hello world
encoding.utf8.getstring(decrypt("acfce3aqcmnkenthv-u09h_hygky_iry-7ugiw0izohi", "密碼here", purpose));
加密方式 對稱加密 AES
對稱加密中aes是比較常用,des因為安全性比不上aes已經用的較少 對稱加密 是指加密解密都是乙個金鑰,通過改金鑰加密,也通過它解密。1.加密 加密 param content 需要加密的內容 param key 金鑰 return public static byte encrypt strin...
理解AES對稱加密
很多人對於aes加密並不是很了解,導致互相之間進行加密解密困難。本文用簡單的方式來介紹aes在使用上需要的知識,而不涉及內部演算法。最後給出例子來幫助理解aes加密解密的使用方法。相比於其他加密,aes加密似乎模式很多,包括ecb cbc等等等等,每個模式又包括iv引數和padding引數,並且,不...
使用python進行AES對稱加密解密
使用示例 可能問題 有時需要對資料進行對稱加解密,常用的有 區塊加密演算法採用對稱金鑰,可以加密固定長度的較短 區塊數量 的資料。為了處理任意長度的資料,加密演算法必須指定加密模式。常用的加密模式如下 經典的加密模式,比如cbc mode只能保證機密性,但不能保證完整性。基於這個原因,經典模式經常會...