자바 스크립트 AES 암호화 [닫힘]


109

Javascript에서 AES 256 비트 암호화에 사용할 수있는 라이브러리가 있습니까?


다음은 crypto-js <script src = " cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/… > <script> var encryptedAES = CryptoJS.AES.encrypt를 사용하여 AES 암호화에 필요한 것입니다. ( "Message", "Passphrase"); var decrypted = CryptoJS.AES.decrypt (encryptedAES.toString (), "Passphrase"); console.log ( "Encrypted :", encryptedAES.toString ()); console.log ( "Decrypted :", decrypted.toString (CryptoJS.enc.Utf8)); </ script>
Hari Das

답변:


66

JSAES는 JavaScript에서 AES의 강력한 구현입니다. http://point-at-infinity.org/jsaes/


32
JSAES는 GNU GPL에 따라 사용이 허가되었으므로 일부 프로젝트에서는 사용할 수 없습니다.
Robert

11
이 지금은 매우 유용하고 기능이 풍부한 code.google.com/p/crypto-js을
데이빗 Kierans

2
@HappyDeveloper 글쎄, 아니. 이것에 대한 라이센스를 비난하지 마십시오. GPL은 라이브러리에 적합하지 않기 때문에 저자가 잘못된 라이센스를 선택했습니다.
inta

4
"사용 비용은 들지 않지만"GPL이 아닌 다른 제품으로 결과물을 출시하려는 경우에는 사용할 수 없습니다.
Curtis

3
JSAES 는 좋은 시작점이지만 16 바이트의 데이터를 암호화하는 데만 사용할 수 있습니다. 더 큰 데이터 블록을 암호화하려면 초기화 벡터, 암호화 모드 (CBC 또는 기타 ...), 패딩을 구현하기 위해 직접 확장해야합니다.
Paolo

35

다음 은 slowAES를 사용 하는 데모 페이지 입니다.

slowAES 는 사용하기 쉬웠습니다. 논리적으로 설계되었습니다. 합리적인 OO 패키징. IV 및 암호화 모드와 같은 노브 및 레버를 지원합니다. .NET / C #과의 우수한 호환성. 그 이름은 혀로 뺨을 맞대고 있습니다. C ++로 구현되지 않았기 때문에 " 느린 AES"라고합니다. 그러나 내 테스트에서는 비현실적으로 느리지 않았습니다.

ECB 모드가 없습니다. 또한 CTR 모드가 부족하지만 ECB 모드가 주어지면 쉽게 만들 수 있습니다.

암호화에만 중점을 둡니다. 자바 스크립트에서 RFC2898 호환 암호 기반 키 파생 을 수행하는 멋진 보완 클래스는 Anandam 에서 구할 수 있습니다 . 이 라이브러리 쌍은 유사한 .NET 클래스와 잘 작동합니다. 좋은 상호 운용성. SlowAES와 달리 Javascript PBKDF2는 키를 생성 할 때 Rfc2898DeriveBytes 클래스 보다 눈에 띄게 느립니다 .

기술적으로 좋은 상호 운용성이 있다는 것은 놀라운 일이 아니지만 저에게 핵심 포인트는 SlowAES에서 채택한 모델이 친숙하고 사용하기 쉽다는 것입니다. AES에 대한 다른 Javascript 라이브러리 중 일부는 이해하고 사용하기가 어렵습니다. 예를 들어 일부에서는 IV 또는 모드 (CBC, ECB 등)를 설정할 위치를 찾을 수 없습니다. 내가 예상했던 곳이 아니 었습니다. SlowAES는 그렇지 않았습니다. 속성은 내가 예상했던 곳에 옳았습니다. Java 및 .NET 암호화 프로그래밍 모델에 익숙했기 때문에 쉽게 익힐 수있었습니다.

Anandam의 PBKDF2는 그 수준이 아니 었습니다. DeriveBytes 함수에 대한 단일 호출 만 지원하므로 암호에서 키와 IV를 모두 파생해야하는 경우이 라이브러리는 변경되지 않고 작동하지 않습니다. 약간의 수정이 있으며 그 목적으로 잘 작동합니다.

편집 : SlowAESAnandamPBKDF2 수정 버전 을 Windows 스크립트 구성 요소 에 패키징 하는 예모았습니다 . 이 AES를 암호 파생 키와 함께 사용하면 .NET RijndaelManaged 클래스와의 상호 운용성이 좋습니다.

EDIT2 : 데모 페이지 는 웹 페이지에서이 AES 암호화를 사용하는 방법을 보여줍니다. .NET에서 지원되는 동일한 입력 (iv, 키, 모드 등)을 사용하면 .NET Rijndael 클래스와의 좋은 상호 운용성을 제공합니다. "소스보기"를 수행하여 해당 페이지에 대한 javascript를 얻을 수 있습니다.

EDIT3
늦은 추가 : 유해한 것으로 간주되는 Javascript Cryptography. 읽을만한 가치가 있습니다.



1
모든 파일이 로컬에 저장된 HTML 5 앱이라는 유효한 사용 사례가 하나 있습니다. 로컬 파일이 하이재킹 될 수 있다면 어떤 경우에도 당신은 파멸합니다 ;-).
Nux

8
edit3 링크에 대해, 그것은 기사의 쓰레기입니다 ... 그 진술의 절반은 완전히 거짓입니다!
mmm

2
랜덤 키 문제는 사용자가 마우스를 움직이고 진정한 랜덤 생성기로 키를 입력하도록하여 해결할 수 있습니다.
mmm

2
데모 페이지에 대한 링크가 끊어진 것 같습니다.
Sean

26

AES 암호화 검색에서 일부 Standford 학생에게서 이것을 발견했습니다. 밖에서 가장 빠르다고 주장합니다. CCM, OCB, GCM 및 블록 암호화를 지원합니다. http://crypto.stanford.edu/sjcl/


그게 내가 말하는 것입니다!
mmm

5
문서가 부족하고 사용하기 어렵습니다. 키 길이는 어떻게 변경합니까? 나는 문서를 샅샅이 뒤졌고 적당한 시간에 그것을 알아낼 수 없었다. 또한 무언가를 암호화하면 키-값 쌍의 배열이 반환되지만 문서에서는이를 설명하지 않는 것 같습니다. 결국 이동식 형식 라이브러리를 사용하게되었습니다.
CpnCrunch

그리고 이것은 비동기가 아니므로 예를 들어 AES-CBC를 사용하여 더 긴 문자열을 암호화하거나 해독하는 경우 UI를 차단합니다
rsz

12

인터넷 검색 "JavaScript AES" 에서 몇 가지 예를 찾았습니다. 팝업 된 첫 번째 항목은 알고리즘을 설명하고 솔루션을 제공하도록 설계되었습니다.

이동 가능한 유형 스크립트 : AES


1
그 라이브러리에서 IV를 설정하는 방법을 알 수 없었습니다. 또한 OO가 아닙니다.
Cheeso

카운터 모드의 IV에 해당하는 것은 nonce입니다. 이 구현은 더 많은 OO로 재구성되었습니다. 카운터 (CTR) 작동 모드 만 포함됩니다.
ChrisV

이것은 ECB 모드가 없다는 점을 제외하면 꽤 잘 작동합니다.
CpnCrunch

10

이 게시물은 이제 오래되었지만 crypto-js 는 이제 가장 완전한 자바 스크립트 암호화 라이브러리 일 수 있습니다.

CryptoJS 는 JavaScript로 구현 된 암호화 알고리즘 모음입니다. 여기에는 AES-128, AES-192, AES-256, DES, Triple DES, Rabbit, RC4, RC4Drop 및 해시 : MD5, RIPEMD-160, SHA-1, SHA-256, SHA-512, SHA가 포함됩니다. -3 (224, 256, 384 또는 512 비트).

당신은보고 할 수 있습니다 자신의 가이드를 빠른 스타트 또한 다음과 Node.js를 포트에 대한 참조이다.

node-cryptojs-aescrypto-js 의 node.js 포트입니다.


1
불행히도 문서가 부족합니다. '빠른 시작'안내서 만있는 것 같습니다. 전체 문서는 어디에 있습니까? 여러 키 길이를 지원하지만이를 수행하는 방법에 대한 문서는 없습니다.
CpnCrunch

@CpnCrunch : 전체 API 문서는 온라인이 아니지만 전체 javadoc api 주석과 같은 코드입니다. 그리고 그것을 생성 할 수 있습니다. cipher-core.js 소스 에 대한 주석을 읽고 암호의 키 크기와 암호의 IV 크기를 찾으십시오.
marcz 2014 년

이상한, 내가 다시 암호화하고 해독 할 때 텍스트가 다릅니다
OMGPOP

openssl 사용으로 인해 충돌이 있습니다
Vlad

9

최근에 자바 스크립트와 파이썬간에 암호화 / 복호화 상호 운용성을 수행해야했습니다.

구체적으로 특별히...

1) AES를 사용하여 javascript로 암호화하고 python (Google App Engine)에서 복호화 2) RSA를 사용하여 javascript로 암호화하고 python (Google App Engine)에서 복호화 3) pycrypto 사용

웹에 떠 다니는 RSA와 AES의 다양한 버전을 많이 발견했고 접근 방식이 모두 달랐지만 javascript와 python 상호 운용성에 대한 좋은 예를 찾지 못했습니다.

결국 나는 많은 시행 착오 끝에 내 필요에 맞는 무언가를 조합 할 수 있었다.

어쨌든 나는 AES와 공개 키 및 개인 키 RSA 항목을 사용하는 Google 앱 엔진 호스팅 Python 서버와 대화하는 js / webapp의 예를 두 드렸습니다.

동일한 작업을 수행해야하는 다른 사용자에게 유용 할 경우를 대비하여 여기에 링크로 포함하겠습니다.

http://www.ipowow.com/files/aesrsademo.tar.gz

데모 에서 RSA-AES-데모 DOT appspot 닷컴

편집 : 브라우저 콘솔 출력을보고 소스를보고 데모 에서 진행되는 작업에 대한 힌트와 유용한 메시지를 얻습니다.

편집 : 현재 가리키는 소스에 대한 매우 오래되고 기능이없는 링크를 업데이트했습니다.

https://sestertii.com/files/aesrsademo.tar.gz


1
정말 감사합니다! 내 인생에서 내 javascript aes가 내 파이썬 aes와 대화하도록 할 수 없었습니다.
Spike

1
나는 밤새도록 (pycrypto와 다른 사람들과 함께) 당신의 코드가 내가 10 분 만에 성취하도록 도왔던 것을하려고 노력해 왔습니다. 정말 고맙습니다!
Remy Vanherweghem

1
어떤 이유로 든 RSA가 쉽게 작동하지만 AES는 왕실의 고통입니다. 감사합니다!!!
speedplane

1
링크를 찾을 수 없습니다!
machineaddict jul.

7

내 경험에 비추어 볼 때 asmcrypto.js 는 JavaScript에서 가장 빠른 AES 구현을 제공합니다 (특히 Firefox에서 asm.js를 완전히 활용할 수 있기 때문에).

Readme에서 :

Chrome/31.0
SHA256: 51 MiB/s (9 times faster than SJCL and CryptoJS)
AES-CBC: 47 MiB/s (13 times faster than CryptoJS and 20 times faster than SJCL)

Firefox/26.0
SHA256: 144 MiB/s (5 times faster than CryptoJS and 20 times faster than SJCL)
AES-CBC: 81 MiB/s (3 times faster than CryptoJS and 8 times faster than SJCL)

편집 : 웹 암호화 API는 이제 대부분의 브라우저에서 구현 및 성능에 대해 걱정하는 경우 기본 솔루션으로 사용되어야한다. IE11은 promise를 사용하지 않는 표준 초안 버전을 구현했습니다.

여기에서 몇 가지 예를 찾을 수 있습니다.


CryptoJS로 약 8MiB / s를 얻었습니다. 이것이 어떻게 수행되는지 궁금합니다.
Lodewijk 2014 년


3

asmcrypto.js를 사용 해보세요 . 정말 빠릅니다.

추신 : 저는 저자이고 질문이 있으면 답변 해 드릴 수 있습니다. 또한 피드백을 주시면 기쁩니다 :)


asmcrypto.js는 좋지만 IE10에서는 잘 작동하지 않습니다. 때로는 1 분 이상 또는 최소 45 초 동안 브라우저가 중단됩니다. 또한, 왜 전역 수학 함수를 대체해야하는지 이해하지 못했습니다. 이것을 사용하는 많은 라이브러리가 있습니다.
decho 2014 년

2
제대로 작동하는지 어떻게 확신하는지 말씀해 주시겠습니까? IOW : AES를 제대로 구현했는지 어떻게 알 수 있습니까?
Lodewijk

IE10 성능은 asm.js를 전혀 최적화하지 않기 때문에 열악합니다. 또한 JIT 패턴이 약간 다릅니다. IE에서 코드가 잘 작동하도록하면 Chrome과 FF에서도 문제가 발생합니다. 내가 올바른 선택을했다고 가정 해보자. Math.random 과 관련하여 긴 논의가 있었습니다. 곧 원시 Math.random 출력 유출 (이론상 PRNG 보안을 저하시킬 수 있음)을 방지해야합니다 .
vibornoff



1

SSL 사용을 피하기 위해 자바 스크립트를 사용하려는 경우 다시 생각해보십시오. 많은 중간 조치가 있지만 SSL 만이 보안 통신을 제공합니다. Javascript 암호화 라이브러리는 특정 공격 집합에 대해 도움이 될 수 있지만 진정한 중간자 공격은 아닙니다.

맞춤 도메인에서 Google 앱 엔진 용 SSL을 찾고 있다면 wwwizer.com을 살펴보세요 .

다음 게시물은 자바 스크립트로 보안 통신 시도를 생성하는 방법과이를 잘못하는 방법을 설명합니다. SSL / HTTPS 대신 자바 스크립트 암호화 모듈 사용


1
자바 스크립트 암호화를 구현하려는 모든 사람이 최소한 고려할 필요가있는 매우 좋은 점이기 때문에 이것이 왜 망각에 반대했는지 확실하지 않습니다. 찬성.
Jules

SSL을 피하기 위해 클라이언트 측 암호화를 사용하는 것은 일부 사람들이 그것에 반대하는 오래된 지점입니다. 실제로 HTTPS에 보안을 추가하고 수동 공격을 피하거나 다운로드 한 애플리케이션 및 브라우저 확장에 사용될 수 있습니다. 나는 한 번 잘못 사용되는 것을 보았고 (우리 대학은 이미 그것을 고쳤지만) 여러 번 올바르게 사용되었습니다 (예 : cryptocat).
Gustavo Rodrigues



당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.