2012-04-23 7 views
12

ich bin ein wenig verwirrt, wie AES und HMAC (basierend auf SHA-256) in einer richtigen Art und Weise zu verwenden, wenn die verschlüsselte Nachricht vom Server zum Client zu übertragen, oder umgekehrtverwirrt, wie AES und HMAC verwenden

korrigieren Sie mich bitte, wenn die folgende Methode ist falsch:

  1. die sicheren Schlüssel aus der Schlüsseldatei (zum Beispiel: schlagen wir die AES-256 zu verwenden, und wir haben bereits eine gültige 256-Bit-Schlüssellängen haben)
  2. generieren random IV für AES-256, um sicherzustellen, dass derselbe Klartext eine andere Verschlüsselungsausgabe hat.
  3. Berechnen Sie HMAC-SHA-256 mit dem Nur-Text- und Sicherheitsschlüssel. (Die erste Frage: Soll IV für die HMAC-Berechnung verwendet werden? Zum Beispiel an den sicheren Schlüssel anhängen?)
  4. Verschlüsseln Sie den Nur-Text mit AES-256.
  5. Compose Nachricht für die Kunden, wie folgend: HMAC + IV + ENCRYPTED_MESSAGE

Die größte Frage ist: ist es möglich, irgendwie nicht IV Client zu senden, sondern es auf die gleiche Weise erzeugen und noch Krypto sicher sein? Oder ist es in Ordnung, die IV auch zu senden?

Ich habe am Ende mit zufälligen IV-Generation, weil es erforderlich ist, dass der gleiche Klartext in verschiedenen Verschlüsselungsergebnissen landen wird.

Antwort

11

Senden Sie nicht hmac (Nachricht), AES (Nachricht). Wenn Sie dieselbe Nachricht zweimal senden, kann dies jeder feststellen. Darüber hinaus müssen Sie den Chiffretext macen, um Angriffe wie die padding oracle attack zu verhindern.

IV: Im Allgemeinen ist der einfache Weg, mit dem iv umzugehen, es voranzustellen, da es eine feste Länge hat, um den verschlüsselten Text. Sie können dann gerade diese Bytes vor der Entschlüsselung ablesen. IVs können öffentlich sein, aber sie müssen zufällig sein.

HMAC: Der einfachste Weg, wenn Ihre Bibliothek dies unterstützt, ist die Verwendung von AES im GCM-Modus (oder weniger bevorzugt EAX). Dies ist nicht wirklich ein HMAC, aber es bietet authentifizierte Verschlüsselung, die genauso gut ist. Wenn diese nicht unterstützt werden:

Sie müssen die hmac sowohl über die iv-und die Chiffre Text berechnen. wenn || Verkettung ist (die Sie mit sagen Array Kopie tun könnten, wenn mit Byte-Arrays zu tun), dann mögen Sie

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

Und dann senden (Tag, Chiffretext). Auf der anderen Seite führen Sie denselben hmac-Aufruf aus, um das Tag neu zu generieren und das empfangene Tag mit dem berechneten zu vergleichen. Vergleichen Sie die sha1- oder sha256-Hashwerte der Tags anstelle von direkt, damit Sie nicht dort auslaufen, wo der Vergleich fehlschlägt.

Sie sollten einen anderen Schlüssel für die hmac verwenden. In der Praxis reicht es aus, die sha1-Summe Ihres Verschlüsselungsschlüssels anzuheften.

+0

Und welchen Betriebsmodus würden Sie empfehlen? CBC hat seinen Overhead und wir sollten uns mit Padding beschäftigen. Ich denke meine Wahl ic OFB/CFB. – Valentin

+1

Aus Sicherheitsgründen sind sie alle gleich (außer EZB, verwenden Sie das nicht). Stellen Sie nur sicher, dass Sie eine frische IV verwenden, wenn das System eine IV einnimmt. Wenn Sie sich etwas Mühe sparen wollen, gibt es authentifizierte Modi, die kein hmac benötigen. GCM ist das Beste von ihnen. Welche Sprache verwendest du? – imichaelmiers

+0

Ich würde nicht empfehlen, die SHA1-Summe des ersten Schlüssels als zweiten Schlüssel zu nehmen. Stattdessen können Sie zwei verschiedene Schlüssel mit unterschiedlichen Parametern und PBKDF2 aus einer Passphrase ableiten.Das Beste ist, zwei unabhängige Schlüssel zu haben und sich nicht auf eine (wahrscheinlich) schwache Passphrase zu verlassen. –