2014-04-05 10 views
6

Ich möchte ein 256-Bit-Passwort für meine AES-Verschlüsselung zu generieren. Wenn ich das Passwort nach der Verschlüsselung überprüfe, unterscheidet es sich von meinem ursprünglichen Passwort. Was mache ich falsch? Oder gibt es Sicherheitsmechanismen, die mir nicht bekannt sind?cryptojs: Wie AES-Passwort zu generieren

Mein Code:

password=Generate_key(); 

var encrypted = CryptoJS.AES.encrypt("Message", password); 

//Those two should be the same 
document.write(password+"<br>"); 
document.write(encrypted.key); 


function Generate_key() { 
    var key = ""; 
    var hex = "abcdef"; 

    for (i = 0; i < 64; i++) { 
     key += hex.charAt(Math.floor(Math.random() * 16)); 
     //Initially this was charAt(chance.integer({min: 0, max: 15})); 
    } 
    return key; 
} 

Der Ausgang ist das heißt

0b05308c9a00f07044416bad7a51bacd282fc5c0c999551a4ff15c302b268b20 4df875993770411044fb35953166ee7833c32ca0741e9fec091dfa10138039e8

Ist das normal oder mache ich etwas falsch hier? Danke für Hilfe!

+0

'Math.floor (Math.random() * 16)' ist nicht gleichbedeutend mit 'chance.integer ({min: 0, max: 15}) '. Sie sollten versuchen Math.round (Math.random() * 15) ' – Biduleohm

Antwort

1

Ich fand die Lösung. Sie können Ihren eigenen Schlüssel definieren mit var verschlüsselt = CryptoJS.AES.encrypt ("Nachricht", Schlüssel, {iv: iv});

Also mein Quellcode ist:

key=CryptoJS.enc.Hex.parse(Generate_key()); 
iv=CryptoJS.enc.Hex.parse(Generate_key()); 
var encrypted = CryptoJS.AES.encrypt("Message", key, { iv: iv }); 
+0

Wie generieren Sie Schlüssel? –

9

Die Verschlüsselung erfolgt mit einem Schlüssel, bei dem es sich um einen Satz binärer Bits handelt, nicht um ein Kennwort, das eine lesbare Zeichenfolge enthält.

Um von einem Passwort zu einem Schlüssel zu gelangen, kann man eine passwortbasierte Schlüsselableitungsfunktion wie PBKDF2 verwenden. Crypto-JS hat bereits ein PBKDF2 function built-in, das heißt

<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/pbkdf2.js"></script> 
<script> 
    var salt = CryptoJS.lib.WordArray.random(128/8); 

    var key128Bits = CryptoJS.PBKDF2("Secret Passphrase", salt, { keySize: 128/32 }); 
    var key256Bits = CryptoJS.PBKDF2("Secret Passphrase", salt, { keySize: 256/32 }); 
    var key512Bits = CryptoJS.PBKDF2("Secret Passphrase", salt, { keySize: 512/32 }); 

    var key512Bits1000Iterations = CryptoJS.PBKDF2("Secret Passphrase", salt, { keySize: 512/32, iterations: 1000 }); 
</script> 

In der Regel verwenden so hohe Iterationszahlcode wie man sich erlauben kann.

Salt sollte wie im obigen Beispiel ein zufälliger Wert sein; Sie müssen diesen Wert natürlich zusammen mit der Iterationszahl speichern, um denselben Schlüssel mit der gleichen Passphrase zu erhalten.

+1

Was ist, wenn ich überhaupt keine Passphrase brauche? Ich möchte nur den Schlüssel erzeugen und irgendwo speichern. Oder erzeugt die Lösung mit my generate_key() eine Passphrase, analysiert sie zu einem Schlüssel und verwendet dann die AES-Verschlüsselung? – Yaron

+1

Dann würden Sie den Schlüssel mit den gleichen Techniken erzeugen, die Sie sonst verwenden würden, um das Salz und die IV zu erzeugen, d.h. eine kryptografisch zufällige Bibliothek. In diesem Beispiel würden Sie CryptoJS.lib.WordArray.random für den Schlüssel und den IV verwenden. –