2012-04-23 78 views
12

我一點點混淆如何以適當的方式從服務器發送時的加密的消息發送給客戶端,或反之亦然困惑如何使用AES和HMAC

使用AES和HMAC(基於SHA-256)糾正我,請,如果下面的方法是錯誤的:

  1. 採取從密鑰文件中的安全密鑰(例如,我們建議使用AES-256,我們已經有了一個有效的256位長度的密鑰)
  2. 生成隨機IV用於AES-256以確保相同的純文本將具有不同的加密輸出。
  3. 使用純文本和安全密鑰計算HMAC-SHA-256。 (第一個問題:我應該使用IV來進行HMAC計算嗎?例如追加到安全密鑰?)
  4. 使用AES-256加密純文本。如下
  5. 爲客戶撰寫消息:HMAC + IV + ENCRYPTED_MESSAGE

最大的問題是:是否有可能以某種方式不派IV客戶,而是產生同樣的方式,仍然是加密安全嗎?或者也可以發送IV嗎?

我最終得到隨機的第四代,因爲需要相同的純文本在不同的加密結果中結束。

回答

11

不要發送hmac(消息),aes(消息)。如果您發送相同的消息兩次,任何人都可以告訴。而且,您需要通過密碼密碼來防止攻擊,例如padding oracle attack

IV:一般來說,處理iv的簡單方法是將其加密,因爲它的長度固定爲密文。然後您可以在解密之前讀取這些字節。 IV可以是公開的,但它們必須是隨機的。

HMAC:如果您的庫支持它,最簡單的方法是在GCM模式(或不太可取的EAX)中使用AES。這實際上不是一個HMAC,但它提供的認證加密同樣好。如果不支持這些加密:

您確實需要通過iv和密文計算hmac。如果||是級聯(你可以有發言權陣列複製如果處理的字節數組做),那麼你要

CipherText = iv|| aes(key1,iv,message) 
tag = hmac(key2,ciphertext) 

,然後發送(標籤,密文)。另一方面,您運行相同的hmac調用來重新生成標籤,並將收到的標籤與計算的標籤進行比較。比較標籤的sha1或sha256散列值,而不是直接進行比較,以便在比較失敗的位置不泄漏。

您應該爲hmac使用不同的密鑰。在實踐中,加密你的加密密鑰的總和就足夠了。

+0

你會推薦什麼操作模式? CBC有其開銷,我們應該處理填充。我想我的選擇ic OFB/CFB。 – Valentin 2012-04-30 12:05:18

+1

從安全角度來看,它們都是一樣的(ECB除外,不要用)。如果系統需要IV,請確保使用新的IV。如果你想節省一些努力,那麼有認證模式,不需要hmac。 GCM是其中最好的。你在用什麼語言? – imichaelmiers 2012-04-30 15:20:14

+0

我不建議將第一個密鑰的SHA1和作爲第二個密鑰。相反,您可以從密碼中派生兩個不同的參數和不同的參數和PBKDF2。最好的事情是擁有兩個獨立的密鑰,而不是依賴(可能)弱密碼。 – 2012-05-17 09:18:23