나는 CryptoJS를 사용하여 구현 된 시스템을 작성했습니다.cryptoJS.AES.encrypt처럼 crypto.subtle.encrypt를 작동 시키려면
내 코드를 작성한 후 브라우저에 내장 된 AES 구현 인 crypto.subtle.encrypt
을 발견했습니다.
내 코드를 CryptoJs를 사용하지 않고 crypto.subtle.encrypt를 사용하여 바꾸고 싶습니다.
기존 방식으로 인코딩 된 데이터 (CryptoJS)는 새로운 방식 (crypto.subtle.encrypt)과 호환되어야합니다.
어떻게하면됩니까? 내 원래의 코드를 작성하면
는,이처럼 많이 보았다 :function cryptojs_encrypt(message) {
var key = "my password";
return CryptoJS.AES.encrypt(message, key).toString());
}
에 전달 "키"단지 문자열입니다. 다른 stackoverflow 질문에서 읽을 수있게 된 CryptoJS는이 문자열을 "키"와 "iv"로 변환합니다. 이것이 정확히 어떻게 달성 되었습니까? CryptoJS 소스 코드를 살펴 보았지만 찾고 있던 것을 찾을 수 없었습니다.
subtle.crypt.encrypt가 작동하는 방식은 키와 iv를 명시 적으로 전달해야한다는 것입니다. 여기 내 코드 :
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);
});
});
}
이 작동하지만 다른 결과를 반환합니다. 문자열을 전달할 때 CryptoJS가 사용하는 것과 일치하는 alg
에 나오는 인수를 수정해야합니다. 어떻게해야합니까?
MD5가 필요한 OpenSSL의 'EVP_BytesToKey' 기능을 구현해야합니다. 이는 실제로 안전하지 않기 때문에 다시 구현하려는 것이 아닙니다. 또한 WebCrypto API에서 MD5를 사용할 수없는 것 같습니다. –
@ArtjomB에 추가. crypto-js는 암호 구문 입력을 OpenSSL과 호환되는 방식으로 키와 IV로 변환합니다 (상호 운용성 섹션 : https://code.google.com/archive/p/crypto-js/ 참조). 암호 구문의 OpenSSL 변환은 https://security.stackexchange.com/questions/29106/openssl-recover-key-and-iv-by-pass-phrase에 설명되어 있습니다. crypto-j가 OpenSSL의 덜 바람직한 보안 알고리즘과 상호 운용되는 것은 실망 스럽습니다. – TheGreatContini