2017-03-20 1 views
1

Ich schrieb ein System, das mit CryptoJS implementiert ist.bekommen cryptoatle.encrypt um zu funktionieren wie CryptoJS.AES.encrypt

Nachdem ich meinen Code geschrieben habe, habe ich crypto.subtle.encrypt entdeckt, was eine AES-Implementierung in Browsern ist.

Ich möchte meinen Code von der Verwendung von CryptoJs und auf die Verwendung von CryptoNet.encrypt ändern.

Daten codiert auf die alte Weise (CryptoJS) muss mit dem neuen Weg kompatibel sein (cryptoatle.encrypt).

Wie kann ich das erreichen?

Als ich meinen ursprünglichen Code geschrieben hat, sah es ähnlich wie folgt aus:

function cryptojs_encrypt(message) { 
    var key = "my password"; 
    return CryptoJS.AES.encrypt(message, key).toString()); 
} 

Wo der „Schlüssel“ bestanden in nur eine Zeichenfolge ist. Von dem, was ich aus anderen Stackoverflow-Fragen lesen konnte, wandelt CryptoJS diese Zeichenfolge in einen "Schlüssel" und "iv" um. Wie genau wird das erreicht? Ich habe versucht, den CryptoJS-Quellcode durchzusehen, konnte aber nicht finden, wonach ich suchte.

Die Art, wie subtil.crypt.encrypt funktioniert, ist, dass Sie den Schlüssel und iv explizit übergeben müssen. Hier ist mein Code:

function subtle_encrypt(message) { 
    var msg = new TextEncoder().encode(message); 
    var pass = new TextEncoder().encode('my password'); 
    var alg = { name: 'AES-CBC', iv: pass }; 
    crypto.subtle.importKey('raw', pass, alg, false, ['encrypt']).then(function(key){ 
     crypto.subtle.encrypt(alg, key, msg).then(function(ctBuffer){ 
      var string = btoa(ctBuffer); 
      console.log("result", string); 
     }); 
    }); 
} 

Dies funktioniert aber wieder ein anderes Ergebnis. Ich muss die Argumente ändern, die in alg gehen, die übereinstimmt, was CryptoJS verwendet, wenn Sie eine Zeichenfolge übergeben. Wie mache ich das?

+2

Sie müssten die OpenSSL-Funktion 'EVP_BytesToKey' implementieren, die auch MD5 benötigt. Dies ist nicht etwas, das Sie neu implementieren möchten, weil es nicht wirklich sicher ist. Es sieht auch so aus, als ob MD5 nicht in der WebCrypto-API verfügbar ist –

+1

Hinzufügen zu was @ArtjomB. sagt, crypto-js konvertiert Ihre Passphrase-Eingabe so in Schlüssel und IV, dass sie mit OpenSSL kompatibel ist (siehe Abschnitt zur Interoperabilität hier: https://code.google.com/archive/p/crypto-js/). Die OpenSSL-Konvertierung der Passphrase wird hier beschrieben: https://security.stackexchange.com/questions/29106/openssl-recover-key-and-iv-by-passphrase. Es ist enttäuschend, dass crypto-js mit einem weniger als wünschenswerten Sicherheitsalgorithmus von OpenSSL interoperiert. – TheGreatContini

Antwort

2

Ich habe eine kleine Bibliothek erstellt, um genau das zu tun.

Einbetten WebCrypto.js (Minified) in Ihrem Dokument.

es wie folgt verwendet:

// Initialize the library 
initWebCrypto(); 

// Encrypt your stuff 
WebCrypto.encrypt({ 
    data: btoa("my message"), 
    password: "my password", 
    callback: function(response){ 
     if(!response.error){ 
      console.log(response.result); // Compatible with CryptoJS 
     }else{ 
      console.error(response.error); 
     } 
    } 
}); 

Siehe https://github.com/etienne-martin/WebCrypto.swift/blob/master/www/index.html für weitere Beispiele.

Quellcode: https://github.com/etienne-martin/WebCrypto.swift/blob/master/source.js

hoffe, das hilft!

Verwandte Themen