2013-04-26 63 views
0

如何使用密碼和鹽以這種方式執行AES加密我可以在Java中使用相同的密碼和鹽進行解密。我需要這個,因爲我想在將數據放入數據庫之前對其進行加密,並且我不想將任何IV字節數組存儲在數據庫中進行解密。我只想使用密碼和salt store將數據加密到數據庫中的加密數據,以便在我需要數據時,從數據庫中獲取數據,並使用相同的密碼和鹽對數據進行解密,僅此而已。如何使用密碼和鹽以這種方式進行AES加密,以便在Java中僅使用相同的密碼和鹽進行解密

+1

每次加密和解密都可以使用全零的IV--它不會像使用獨特的IV那樣安全,但無論漂浮在船上 – 2013-04-26 18:49:15

回答

1

AES是一種以16字節爲單位進行加密的分組密碼。如果使用相同的密鑰(或密碼+鹽)加密相同的16個字節的數據,則最終會得到相同的加密數據。這具有初始化向量用於解決的一些不希望的(不安全的)屬性。

如果你不想跟蹤的初始化向量,可以反而讓前16個字節數據是隨機的,然後用初始化向量設置爲16個零。這會產生同樣的效果。

0

我能想到的兩種可能性:

  1. 使用AES-CTR。計數器模式不需要IV。

  2. 從密碼和鹽中推導出您的密鑰和IV。喜歡的東西:

    關鍵< - 哈希(密碼+鹽+ 「KEY」)

    IV < - 你將現實生活中的散列(密碼+鹽+ 「IV」)

顯然使用標準的密鑰派生函數,取決於您需要多少安全。

您可能還想考慮驗證以檢查從數據庫返回的內容與您放置的內容相同。對於內置身份驗證,請使用AES-GCM而不是AES-CTR,否則,如果使用第二個選項,請添加HMAC。

+0

請你告訴我如何使用AES- GCM或AES-CTR使用示例代碼,我是密碼學新手 – 2013-04-29 00:25:17

+0

沒有初始化向量(或空白向量)的計數器模式非常糟糕,因爲兩個加密消息的異或=純文本的異或。這是因爲計數器模式通過加密iv +計數器然後用純文本進行異或操作。 – 2013-04-29 18:45:11

+0

來自數據庫的唯一記錄ID將作爲CTR模式的隨機數。 – rossum 2013-05-01 08:54:02