Estoy escribiendo un inicio de sesión para un foro y necesito codificar la contraseña del lado del cliente en javascript antes de enviarla al servidor. Tengo problemas para averiguar en qué implementación de SHA-256 realmente puedo confiar. Esperaba que hubiera algún tipo de script autorizado que todos usaran, pero estoy encontrando muchos proyectos diferentes, todos con sus propias implementaciones.
Me doy cuenta de que usar las criptomonedas de otras personas es siempre un acto de fe a menos que esté calificado para revisarlo usted mismo, y que no existe una definición universal de "confiable", pero esto parece algo común y lo suficientemente importante como para que haya algún tipo de de consenso sobre qué utilizar. ¿Soy simplemente ingenuo?
Edite ya que aparece mucho en los comentarios: Sí, volvemos a hacer un hash más estricto en el lado del servidor. El hash del lado del cliente no es el resultado final que guardamos en la base de datos. El hash del lado del cliente se debe a que el cliente humano lo solicita. No han dado una razón específica por la cual, probablemente solo les gusta la exageración.
fuente
Respuestas:
La biblioteca de cifrado de Stanford JS contiene una implementación de SHA-256. Si bien la criptografía en JS no es un esfuerzo tan bien investigado como otras plataformas de implementación, esta está al menos parcialmente desarrollada y hasta cierto punto patrocinada por Dan Boneh , que es un nombre bien establecido y confiable en criptografía. y significa que el proyecto está supervisado por alguien que realmente sabe lo que está haciendo. El proyecto también cuenta con el apoyo de la NSF .
Sin embargo, vale la pena señalar ...
... que si aplica un hash a la contraseña del lado del cliente antes de enviarla, entonces el hash es la contraseña y la contraseña original se vuelve irrelevante. Un atacante solo necesita interceptar el hash para hacerse pasar por el usuario, y si ese hash se almacena sin modificar en el servidor, entonces el servidor almacena la contraseña verdadera (el hash) en texto sin formato .
Entonces, su seguridad ahora es peor porque decidió agregar sus propias mejoras a lo que antes era un esquema confiable.
fuente
En https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest encontré este fragmento que usa el módulo js interno:
Tenga
crypto.subtle
en cuenta que solo está disponible enhttps
olocalhost
, por ejemplo, para su desarrollo localpython3 -m http.server
, debe agregar esta línea a su/etc/hosts
:0.0.0.0 localhost
Reinicie y podrá abrir
localhost:8000
con el trabajocrypto.subtle
.fuente
La implementación de SHA-256 de Forge es rápida y confiable.
Para ejecutar pruebas en varias implementaciones de JavaScript SHA-256, vaya a http://brillout.github.io/test-javascript-hash-implementations/ .
Los resultados en mi máquina sugieren que Forge es la implementación más rápida y también considerablemente más rápida que la Stanford Javascript Crypto Library (sjcl) mencionada en la respuesta aceptada.
Forge tiene un tamaño de 256 KB, pero la extracción del código relacionado con SHA-256 reduce el tamaño a 4,5 KB, consulte https://github.com/brillout/forge-sha256
fuente
npm install node-forge
, pero ahora, ¿cómo usar la biblioteca para crear un hash a partir de la cadenafoo
?Para aquellos interesados, este es un código para crear hash SHA-256 usando
sjcl
:fuente
No, no hay forma de utilizar JavaScript del navegador para mejorar la seguridad de las contraseñas. Le recomiendo que lea este artículo . En su caso, el mayor problema es el problema del huevo de gallina:
[...]
Lo que conduce a esto:
Básicamente, el problema es este:
O alternativamente,
Nota: Además, SHA-256 no es adecuado para esto, ya que es muy fácil forzar contraseñas no iteradas sin sal y sin forzar . Si decide hacer esto de todos modos, busque una implementación de bcrypt , scrypt o PBKDF2 .
fuente
Encontré esta implementación muy fácil de usar. También tiene una generosa licencia estilo BSD:
jsSHA: https://github.com/Caligatio/jsSHA
Necesitaba una forma rápida de obtener la representación de cadena hexadecimal de un hash SHA-256. Solo tomó 3 líneas:
fuente
Además de la biblioteca de Stanford que mencionó tylerl. Encontré jsrsasign muy útil (repositorio de Github aquí: https://github.com/kjur/jsrsasign ). No sé exactamente qué tan confiable es, pero he usado su API de SHA256, Base64, RSA, x509, etc. y funciona bastante bien. De hecho, también incluye la biblioteca de Stanford.
Si todo lo que quiere hacer es SHA256, jsrsasign podría ser una exageración. Pero si tiene otras necesidades en el área relacionada, creo que es una buena opción.
fuente