2014-04-05 17 views
6

Tôi muốn tạo mật khẩu 256 bit cho mã hóa AES của mình. Khi tôi kiểm tra mật khẩu sau khi mã hóa, nó khác với mật khẩu ban đầu của tôi. Tôi đang làm gì sai? Hoặc có một số cơ chế bảo mật mà tôi không biết?cryptojs: Cách tạo cụm mật khẩu AES

Mã của tôi:

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; 
} 

Đầu ra là ví dụ:

0b05308c9a00f07044416bad7a51bacd282fc5c0c999551a4ff15c302b268b20 4df875993770411044fb35953166ee7833c32ca0741e9fec091dfa10138039e8

Đây có phải là bình thường hoặc tôi đang làm một cái gì đó sai ở đây? Cảm ơn bạn đã trợ giúp!

+0

'Math.floor (Math.random() * 16) 'là không tương đương với' chance.integer ({min: 0, tối đa: 15}) '. Bạn nên thử 'Math.round (Math.random() * 15)' – Biduleohm

Trả lời

1

Tôi đã tìm thấy giải pháp. Bạn có thể xác định khóa của riêng mình bằng cách sử dụng var encrypted = CryptoJS.AES.encrypt ("Thông báo", khóa, {iv: iv});

Vì vậy, mã nguồn của tôi là:

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

cách bạn tạo khóa? –

9

Mã hóa được thực hiện bằng một khóa, là một tập hợp các bit nhị phân, không phải là mật khẩu, ngụ ý một chuỗi có thể đọc được.

Để chuyển từ mật khẩu sang một khóa, người ta có thể sử dụng một chức năng dẫn xuất khóa dựa trên mật khẩu, chẳng hạn như PBKDF2. Crypto-JS đã có một PBKDF2 function built-in, ví dụ:

<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> 

Nói chung, sử dụng càng cao một số lần lặp như bạn có thể nhận được ngay với.

Muối phải là một giá trị ngẫu nhiên, như trong ví dụ trên; bạn sẽ cần, tất nhiên, để lưu trữ giá trị đó cùng với số lần lặp lại để có cùng khóa cho cùng một cụm mật khẩu.

+1

Nếu tôi không cần cụm từ mật khẩu thì sao? Tôi chỉ muốn tạo ra chìa khóa và lưu nó ở đâu đó. Hoặc là giải pháp tạo cụm từ mật khẩu bằng cách sử dụng generate_key() của tôi, phân tích cú pháp nó thành khóa và sau đó sử dụng mã hóa aes? – Yaron

+1

Sau đó, bạn sẽ tạo khóa bằng các kỹ thuật tương tự mà bạn sẽ sử dụng để tạo ra muối và IV, tức là một thư viện ngẫu nhiên mã hóa. Trong ví dụ này, bạn sử dụng CryptoJS.lib.WordArray.random cho cả khóa và IV. –

Các vấn đề liên quan