Estou escrevendo um login para um fórum e preciso fazer o hash da senha do lado do cliente em javascript antes de enviá-la para o servidor. Estou tendo problemas para descobrir em qual implementação SHA-256 posso realmente confiar. Eu esperava que houvesse algum tipo de script oficial que todos usassem, mas estou encontrando vários projetos diferentes, todos com suas próprias implementações.
Sei que usar a criptografia de outras pessoas é sempre um ato de fé, a menos que você esteja qualificado para revisá-la sozinho, e que não existe uma definição universal de "confiável", mas isso parece algo comum e importante o suficiente para que haja algum tipo de consenso sobre o que usar. Eu sou apenas ingênuo?
Edite já que aparece muito nos comentários: Sim, fazemos um hash mais rigoroso novamente no lado do servidor. O hashing do lado do cliente não é o resultado final que salvamos no banco de dados. O hashing do lado do cliente ocorre porque o cliente humano o solicita. Eles não deram um motivo específico, provavelmente eles apenas gostam de exagero.
fonte
Respostas:
A Stanford JS Crypto Library contém uma implementação de SHA-256. Embora a criptografia em JS não seja um empreendimento tão bem avaliado quanto outras plataformas de implementação, esta é pelo menos parcialmente desenvolvida por, e até certo ponto patrocinada por, Dan Boneh , que é um nome bem estabelecido e confiável em criptografia e significa que o projeto foi supervisionado por alguém que realmente sabe o que está fazendo. O projeto também é apoiado pela NSF .
Vale a pena ressaltar, entretanto ...
... que se você hash a senha do lado do cliente antes de enviá-la, então o hash é a senha , e a senha original se torna irrelevante. Um invasor precisa apenas interceptar o hash para personificar o usuário e, se esse hash estiver armazenado sem modificações no servidor, o servidor está armazenando a senha verdadeira (o hash) em texto simples .
Portanto, sua segurança agora está pior porque você decidiu adicionar suas próprias melhorias ao que antes era um esquema confiável.
fonte
Em https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest , encontrei este snippet que usa o módulo js interno:
Observe que está
crypto.subtle
disponível apenas emhttps
oulocalhost
- por exemplo, para o seu desenvolvimento local,python3 -m http.server
você precisa adicionar esta linha ao seu/etc/hosts
:0.0.0.0 localhost
Reinicie - e você pode abrir
localhost:8000
com o trabalhocrypto.subtle
.fonte
A implementação SHA-256 do Forge é rápida e confiável.
Para executar testes em várias implementações SHA-256 JavaScript, vá para http://brillout.github.io/test-javascript-hash-implementations/ .
Os resultados na minha máquina sugerem que o forge seja a implementação mais rápida e também consideravelmente mais rápida do que a Stanford Javascript Crypto Library (sjcl) mencionada na resposta aceita.
Forge tem 256 KB de tamanho, mas extrair o código relacionado ao SHA-256 reduz o tamanho para 4,5 KB, consulte https://github.com/brillout/forge-sha256
fonte
npm install node-forge
, mas agora, como usar a biblioteca para criar um hash a partir da stringfoo
?Para os interessados, este é um código para criar hash SHA-256 usando
sjcl
:fonte
Não, não há como usar o JavaScript do navegador para melhorar a segurança da senha. Eu recomendo fortemente que você leia este artigo . No seu caso, o maior problema é o problema do ovo da galinha:
[...]
O que leva a isso:
Basicamente, o problema é este:
Ou alternativamente,
Nota: Além disso, SHA-256 não é adequado para isso, já que é tão fácil usar a força bruta em senhas sem sal e não iteradas . Se você decidir fazer isso de qualquer maneira, procure uma implementação de bcrypt , scrypt ou PBKDF2 .
fonte
Achei essa implementação muito fácil de usar. Também tem uma licença generosa no estilo BSD:
jsSHA: https://github.com/Caligatio/jsSHA
Eu precisava de uma maneira rápida de obter a representação hexadecimal de um hash SHA-256. Demorou apenas 3 linhas:
fonte
Além da biblioteca de Stanford que tylerl mencionou. Achei o jsrsasign muito útil ( repositório Github aqui: https://github.com/kjur/jsrsasign ). Não sei exatamente o quão confiável é, mas usei sua API de SHA256, Base64, RSA, x509 etc. e funciona muito bem. Na verdade, também inclui a biblioteca de Stanford.
Se tudo o que você deseja fazer é SHA256, jsrsasign pode ser um exagero. Mas se você tiver outras necessidades na área relacionada, acho que é uma boa opção.
fonte