Criptografia Javascript AES [fechado]

109

Existe uma biblioteca disponível para criptografia AES 256 bits em Javascript?

codificador
fonte
Aqui está o que você precisa para criptografar AES usando crypto-js <script src = " cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/… > <script> var encryptionAES = CryptoJS.AES.encrypt ("Mensagem", "Frase secreta"); var decrypted = CryptoJS.AES.decrypt (criptografadoAES.toString (), "Frase secreta"); console.log ("Criptografado:", criptografado AES.toString ()); console.log ( "Decrypted:", decrypted.toString (CryptoJS.enc.Utf8)); </script>
Hari Das

Respostas:

66

JSAES é uma implementação poderosa de AES em JavaScript. http://point-at-infinity.org/jsaes/

barra invertida 17
fonte
32
JSAES é licenciado sob GNU GPL - portanto, não pode ser usado para alguns projetos.
Robert,
11
Isso agora é bastante útil e rico em recursos code.google.com/p/crypto-js
David Kierans
2
@HappyDeveloper Bem, não. Não culpe a licença por isso. O autor escolheu a licença errada, pois a GPL não é adequada para bibliotecas.
inta
4
É "gratuito para usar", mas você não pode usá-lo se quiser lançar o produto resultante sob algo diferente da GPL.
Curtis
3
JSAES é um bom ponto de partida, mas pode ser usado apenas para criptografar 16 bytes de dados. Se você deseja criptografar um bloco maior de dados, você mesmo deve estendê-lo para implementar o vetor de inicialização, o modo de criptografia (CBC ou outro ...), preenchimento.
Paolo
35

Aqui está uma página de demonstração que usa slowAES.

slowAES foi fácil de usar. Projetado de forma lógica. Embalagem OO razoável. Suporta botões e alavancas como modo IV e criptografia. Boa compatibilidade com .NET / C #. O nome é irônico; é chamado de " AES lento " porque não é implementado em C ++. Mas em meus testes não foi impraticávelmente lento.

Ele não possui um modo de ECB. Também não tem um modo CTR, embora você possa construir um facilmente com um modo ECB, eu acho.

É focado exclusivamente na criptografia. Uma boa classe complementar que faz derivação de chave baseada em senha compatível com RFC2898 , em Javascript, está disponível no Anandam . Este par de bibliotecas funciona bem com classes .NET análogas. Boa interoperabilidade. Porém, em contraste com SlowAES, o Javascript PBKDF2 é visivelmente mais lento do que a classe Rfc2898DeriveBytes ao gerar chaves.

Não é surpreendente que, tecnicamente, haja uma boa interoperabilidade, mas o ponto-chave para mim foi que o modelo adotado pelo SlowAES é familiar e fácil de usar. Achei algumas das outras bibliotecas Javascript para AES difíceis de entender e usar. Por exemplo, em alguns deles não consegui encontrar o local para configurar o IV, nem a modalidade (CBC, ECB, etc). As coisas não estavam onde eu esperava. SlowAES não era assim. As propriedades estavam exatamente onde eu esperava que estivessem. Foi fácil para mim aprender, por estar familiarizado com os modelos de programação de criptografia Java e .NET.

O PBKDF2 de Anandam não estava exatamente nesse nível. Suportava apenas uma única chamada para a função DeriveBytes, então se você precisar derivar uma chave e um IV de uma senha, esta biblioteca não funcionará, inalterada. Uma ligeira modificação, e está funcionando bem para esse propósito.

EDITAR : Eu coloquei um exemplo de empacotamento do SlowAES e uma versão modificada do PBKDF2 do Anandam em componentes de script do Windows. Usar este AES com uma chave derivada de senha mostra uma boa interoperabilidade com a classe .NET RijndaelManaged.

EDIT2 : a página de demonstração mostra como usar a criptografia AES de uma página da web. Usar as mesmas entradas (iv, chave, modo, etc.) suportadas no .NET oferece uma boa interoperabilidade com a classe .NET Rijndael. Você pode fazer uma "visualização da fonte" para obter o javascript para essa página.

EDIT3
uma adição tardia: criptografia Javascript considerada prejudicial. Vale a pena ler.

Cheeso
fonte
1
Vejo um caso de uso válido - aplicativo HTML 5 no qual todos os arquivos são armazenados localmente. Se os arquivos locais podem ser sequestrados, você está condenado em qualquer caso ;-).
Nux
8
sobre o link edit3, é uma merda de um artigo ... metade de suas afirmações são completamente falsas!
mmm
2
O problema da chave aleatória pode ser resolvido fazendo com que o usuário mova o mouse e insira as teclas como um verdadeiro gerador aleatório.
mmm
2
O link para a página de demonstração parece estar quebrado.
Sean
26

Em minhas pesquisas por criptografia AES, encontrei isso de alguns alunos de Standford. Afirma ser mais rápido lá fora. Suporta criptografia CCM, OCB, GCM e Block. http://crypto.stanford.edu/sjcl/

Danny C
fonte
é disso que estou falando!
mmm
5
A documentação está faltando e é difícil de usar. Como você altera o comprimento da chave? Procurei os médicos e não consegui descobrir em um tempo razoável. Além disso, quando você criptografa algo, obtém uma matriz de pares de valores-chave retornados, mas os documentos não parecem explicar isso. Acabei usando a biblioteca de tipos móveis.
CpnCrunch
E isso não é assíncrono, então se você estiver criptografando ou descriptografando alguma string mais longa, por exemplo, com AES-CBC, ele bloqueia a IU
rsz
12

Googling "JavaScript AES" encontrou vários exemplos. O primeiro que apareceu foi projetado para explicar o algoritmo, bem como fornecer uma solução:

Scripts de tipo móvel: AES

Samir Talwar
fonte
1
Não consegui descobrir como colocar o IV naquela biblioteca. Também não é muito OO.
Cheeso
O equivalente do IV no modo contador é o nonce. Esta implementação foi reformulada para ser mais OO. Inclui apenas o modo de operação do contador (CTR).
ChrisV,
Isso funciona muito bem, exceto que não tem nenhum modo de ECB.
CpnCrunch
10

Este post agora é antigo, mas o crypto-js , pode ser agora a biblioteca de criptografia javascript mais completa.

CryptoJS é uma coleção de algoritmos criptográficos implementados em JavaScript. Inclui as seguintes cifras: AES-128, AES-192, AES-256, DES, Triple DES, Rabbit, RC4, RC4Drop e hashers: MD5, RIPEMD-160, SHA-1, SHA-256, SHA-512, SHA -3 com 224, 256, 384 ou 512 bits.

Você pode querer dar uma olhada no Guia de início rápido, que também é a referência para a seguinte porta node.js.

node-cryptojs-aes é uma porta node.js de crypto-js

Marcz
fonte
1
Infelizmente, falta documentação. Parece ter apenas um guia de 'início rápido'. Onde está a documentação completa? Ele diz que suporta vários comprimentos de chave, mas nenhuma documentação sobre como fazer isso.
CpnCrunch
@CpnCrunch: o documento completo da API não está online, mas o código como comentários completos da API javadoc. E você pode gerá-lo. Leia os comentários sobre a fonte cipher-core.js para encontrar o tamanho da chave e o tamanho IV da cifra.
marcz
estranho, quando eu criptografo e descriptografo de volta, os textos são diferentes
OMGPOP
Existem alguns conflitos por causa do uso do openssl
Vlad
9

Recentemente, tive a necessidade de executar alguma interoperabilidade de criptografia / descriptografia entre javascript e python.

Especificamente...

1) Usando AES para criptografar em javascript e descriptografar em python (Google App Engine) 2) Usando RSA para criptografar em javascript e descriptografar em python (Google App Engine) 3) Usando pycrypto

Encontrei muitas e muitas versões diferentes de RSA e AES flutuando pela web e todas eram diferentes em sua abordagem, mas não encontrei um bom exemplo de interoperabilidade de javascript e python de ponta a ponta.

Por fim, consegui remendar algo que atendesse às minhas necessidades depois de muitas tentativas e erros.

De qualquer forma, criei um exemplo de um js / webapp conversando com um servidor python hospedado no google app engine que usa AES e chaves públicas e privadas RSA.

Pensei em incluí-lo aqui por meio de um link, caso seja de alguma utilidade para outras pessoas que precisam realizar a mesma coisa.

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

e veja a demonstração em rsa-aes-demo DOT appspot DOT com

editar: veja a saída do console do navegador e também veja o código-fonte para obter algumas dicas e mensagens úteis sobre o que está acontecendo na demonstração

editar: link muito antigo e extinto atualizado para a fonte para agora apontar para

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

David Kierans
fonte
1
Muito obrigado por isso! Eu não poderia por minha vida fazer meus aes javascript conversarem com meus aes python.
pico de
1
Tenho tentado a noite toda (com pycrypto e outros) fazer o que seu código me ajudou a realizar em 10 minutos. Muito obrigado!
Remy Vanherweghem
1
Por alguma razão, fiz o RSA funcionar facilmente, mas o AES é um saco. Obrigado por isso!!!
speedplane
1
o link ... não foi encontrado!
Machineaddict de
7

A julgar por minha própria experiência, o asmcrypto.js fornece a implementação AES mais rápida em JavaScript (especialmente no Firefox, pois pode aproveitar totalmente o asm.js lá).

Do leia-me:

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)

Edit: A API de criptografia da Web agora está implementada na maioria dos navegadores e deve ser usada como a solução principal se você se preocupa com o desempenho. Esteja ciente de que o IE11 implementou uma versão preliminar anterior do padrão que não usava promessas.

Alguns exemplos podem ser encontrados aqui:

Joel richard
fonte
Estou recebendo cerca de 8 MiB / s com o CryptoJS. Gostaria de saber como isso funcionaria.
Lodewijk
3

Experimente asmcrypto.js - é muito rápido.

PS: Eu sou um autor e posso responder às suas perguntas, se houver. Também ficaria feliz em receber algum feedback :)

vibornoff
fonte
o asmcrypto.js é bom, mas no IE10 não funciona bem. ele trava o navegador por mais de 1 minuto às vezes, ou pelo menos 45 segundos. Além disso, eu não entendi, por que você precisa substituir a função matemática global? existem muitas bibliotecas que usam este.
dezembro
2
Você poderia comentar sobre como tem certeza de que está funcionando corretamente? IOW: Como você sabe que implementou o AES corretamente?
Lodewijk
O desempenho do IE10 é ruim porque não otimiza o asm.js. Também tem padrões JIT um pouco diferentes. Fazer o código funcionar bem no IE também o torna péssimo no Chrome e no FF. Suponha que eu fizesse a escolha certa. Em relação a Math.random, houve uma longa discussão . Resumindo, essa necessidade de prevenção de vazamento de saída Math.random bruto (que em teoria pode degradar a segurança do PRNG).
vibornoff
1

Se você está tentando usar javascript para evitar o SSL, pense novamente. Existem muitas medidas intermediárias, mas apenas o SSL fornece comunicação segura. Bibliotecas de criptografia Javascript podem ajudar contra um certo conjunto de ataques, mas não um verdadeiro ataque de intermediário.

Se você estiver procurando SSL para google app engine em um domínio personalizado, dê uma olhada em wwwizer.com .

A postagem a seguir explica como criar uma tentativa de comunicação segura com javascript e como errar: Use o módulo de criptografia JavaScript em vez de SSL / HTTPS

avião rápido
fonte
1
Não sei por que isso foi rejeitado até o esquecimento, pois é um ponto muito bom que qualquer pessoa que esteja pensando em implementar a criptografia javascript precisa pelo menos considerar. Votado.
Jules
Usar criptografia do lado do cliente para evitar SSL é um ponto antigo que algumas pessoas dizem que vai contra: na verdade, pode adicionar segurança ao HTTPS, evitando ataques passivos, ou ser usado em aplicativos baixados e extensões de navegador. Só vi uma vez sendo usado errado (minha faculdade, mas já consertaram) e muitas vezes usado certo (criptocato, por exemplo).
Gustavo Rodrigues