正確使用AES對稱加密

2022-01-12 08:20:57 字數 2160 閱讀 1079

經常我看到專案中有人使用了對稱加密演算法,用來加密客戶或專案傳輸中的部分資料。但我注意到開發 人員由於不熟悉原理,或者簡單複製網上的**示例,有導致**存在安全風險。

我經常遇到的問題,有如下:

演算法位長

建議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只能保證機密性,但不能保證完整性。基於這個原因,經典模式經常會...