2016-11-15 7 views
0

私はPhonegapモバイルアプリを持っていて、オフラインでアプリへのログインを提供するために、ローカルインデックス付きdbにいくつかのユーザーデータ(username/pass_hash)を保存したいとします。 私はそのデータをもちろん暗号化したい、私のアプリはすでにCryptoJSを使用しています。 私が理解したように、まずPBKDF2を使ってpasswordでencryption_keyを生成し、CryptoJS.AESを暗号化する必要があります。 例コード:CryptoJS毎回鍵を生成する方法は?

function generateKey(p){ 
var salt = CryptoJS.lib.WordArray.random(128/8); 
return CryptoJS.PBKDF2(p, salt, { keySize: 512/32, iterations: 1000 });  
} 

var pass = "test1"; 
var iv = CryptoJS.lib.WordArray.random(16); 
key512Bits1000Iterations = generateKey(pass); 
var encrypted = CryptoJS.AES.encrypt("Message", key512Bits1000Iterations, { iv: iv }); 
var decrypted = CryptoJS.AES.decrypt(encrypted, key512Bits1000Iterations, { iv: iv }); 

//decrypting with another key step 
key512Bits1000Iterations2 = generateKey(pass); 
var decrypted2 = CryptoJS.AES.decrypt(encrypted, key512Bits1000Iterations2, { iv: iv }); 
console.log("decrypted " + decrypted.toString(CryptoJS.enc.Utf8)); 
console.log("decrypted2 " + decrypted2.toString(CryptoJS.enc.Utf8)); 

動的塩とivが使用されます。 しかし、同じパスワードで復号化の鍵を生成すると、間違った結果が出る(復号化された2は空です) 私は暗号化セッションの間に何を保存すべきですか?私はそれが動的でなければならないと理解した) ありがとう!

+0

暗号化にsaltを使用している場合は、メッセージの暗号化に同じsalt値を使用する必要があります。 –

+1

ありがとう! 私はまた良い記事を見つけたhttps://crackstation.net/hashing-security.htm役に立つかもしれない誰か。 – Maxim

答えて

0

generateKey(...)に新しい塩を生成しています。これにより、PBKDF2が新しい鍵を導きます。

function generateKey(p){ 
    var salt = CryptoJS.lib.WordArray.random(128/8); 
    return CryptoJS.PBKDF2(p, salt, { keySize: 512/32, iterations: 1000 });  
} 

あなたは、セッション間IVを格納する必要があります。これらの2つの値は秘密である必要はありません。

関連する問題