password_hash metodos encriptar encriptacion ejemplo contraseña c# hash bcrypt bcrypt.net

c# - encriptar - metodos de encriptacion php



¿BCrypt es un buen algoritmo hash para usar en C#? ¿Dónde puedo encontrarlo? (2)

No debe usar BCrypt en .NET. Debe usar PBKDF2 tal como está con la implementación incorporada de .NET framework. Es la única implementación disponible criptográficamente verificada en .NET junto con el algoritmo recomendado por NIST .

StackId utilizó previamente BCrypt y se movió a PBKDF2 por esta misma razón:

Para los curiosos, estamos contraseñas hash con PBKDF2. El código Relavent está aquí ( http://code.google.com/p/stackid/source/browse/OpenIdProvider/Current.cs#1135 ), a través de algunas capas de direccionamiento indirecto. En una iteración anterior, estábamos usando BCrypt; pero se movió a PBKDF2 ya que está integrado en el framework .NET, mientras que BCrypt nos requeriría verificar una implementación (no pequeña empresa).

Kevin Montrose, 27 de mayo de 2011

(Enlace actualizado en GitHub)

Editar: El significado de los términos criptográficos no parece comprenderse fácilmente, una implementación verificada significa que ha sido criptográficamente probado para ser implementado sin error. El costo de esto puede llegar fácilmente a $ 20,000 o más. Recuerdo esto cuando estaba investigando en OpenSSL y leí dónde indicaron que no habían completado todo el proceso de verificación, pero si necesitaban verificarlo por completo, podían indicarle el camino correcto y mencionar los costos asociados. Ciertos requisitos del gobierno incluyen mandatos para algoritmos de cifrado verificados.

Las implementaciones de bcrypt en .NET no han sido verificadas. Al utilizar una implementación de cifrado no verificada, no puede estar absolutamente seguro de que no haya fallas malintencionadas intencionadas, como permitir una puerta trasera en lo que está encriptado o fallas de implementación involuntarias que resultan en datos criptográficamente inseguros.

Edición de 2014: para cualquiera que haya cuestionado el imperativo de usar algoritmos criptográficos verificados, observe la devastación causada por el hack heartbleed explotado en OpenSSL. Ese es el costo de usar una implementación no verificada. Es seguro ... hasta que descubra que cualquier persona puede leer los contenidos de la memoria completa de su servidor.

El autor del cambio que introdujo Heartbleed, Robin Seggelmann, declaró que "olvidó validar una variable que contiene una longitud" y negó toda intención de presentar una implementación defectuosa. Tras la divulgación de Heartbleed, Seggelmann sugirió centrarse en el segundo aspecto, afirmando que OpenSSL no es revisado por suficientes personas.

Esta es la definición de una implementación no verificada. Incluso el defecto más pequeño puede resultar en paralizar toda la seguridad.

Edición de 2015: se eliminó el lenguaje basado en recomendaciones y se reemplazó por absolutos. Embedded original Kevin Montrose comentario para la posteridad.

He leído que cuando se usa una contraseña, muchos programadores recomiendan usar el algoritmo BCrypt.

Estoy programando en C # y me pregunto si alguien sabe de una buena implementación para BCrypt. Encontré esta página , pero realmente no sé si es falsa o no.

¿De qué debería ser consciente al elegir un esquema de hashing de contraseña? ¿BCrypt es una ''buena'' implementación?


Primero, algunos términos que son importantes:

Hashing : el acto de tomar una cadena y producir una secuencia de caracteres que no se puede revertir a la cadena original.

Cifrado simétrico : (por lo general, solo se denomina "cifrado"): el acto de tomar una cadena y producir una secuencia de caracteres que se pueden descifrar a la cadena original mediante el uso de la misma clave de cifrado que la encripta.

Rainbow Table : una tabla de búsqueda que contiene todas las variaciones de los caracteres hash en un algoritmo hash específico.

Salt : una cadena aleatoria conocida añadida a la cadena original antes de que sea hash.

Para .NET Framework, Bcrypt aún no cuenta con una implementación de referencia verificada . Esto es importante porque no hay manera de saber si existen fallas serias en una implementación existente. Puede obtener una implementación de BCrypt para .NET aquí . No sé lo suficiente sobre la criptografía para decir si es una implementación buena o mala. La criptografía es un campo muy profundo. No intente construir su propio algoritmo de encriptación . Seriamente.

Si va a implementar su propia contraseña de seguridad (suspiro), entonces debe hacer varias cosas:

  1. Use un algoritmo hash relativamente seguro .
  2. Sal cada contraseña antes de hashed.
  3. Use una sal única y larga para cada contraseña y almacene la sal con la contraseña.
  4. Requerir contraseñas seguras

Desafortunadamente, incluso si haces todo esto, un hacker determinado aún podría descubrir las contraseñas, solo le tomaría mucho tiempo. Ese es tu principal enemigo: el tiempo .

El algoritmo bcrypt funciona porque tarda cinco órdenes de magnitud más para asignar una contraseña que MD5 ; (y aún mucho más tiempo que AES o SHA-512). Obliga al pirata informático a dedicar más tiempo a crear una tabla arcoiris para buscar sus contraseñas, lo que hace que sea menos probable que sus contraseñas corran peligro de ser pirateadas.

Si está salando y procesando sus contraseñas, y cada sal es diferente, entonces un pirata informático potencial tendría que crear una tabla arcoíris para cada variación de sal , solo para tener una tabla arcoiris para una contraseña salada + hash. Eso significa que si tienes 1 millón de usuarios, un hacker tiene que generar 1 millón de tablas rainbow. Si está utilizando la misma sal para cada usuario, entonces el pirata informático solo tiene que generar 1 tabla arcoíris para piratear su sistema con éxito.

Si no está salteando sus contraseñas, todo lo que tiene que hacer un atacante es extraer una tabla Rainbow existente para cada implementación (AES, SHA-512, MD5) y simplemente ver si coincide con el hash. Esto ya se ha hecho , un atacante no necesita calcular estas tablas Rainbow por sí mismos .

Incluso con todo esto, debe usar buenas prácticas de seguridad . Si pueden usar con éxito otro vector de ataque (XSS, SQL Injection, CSRF, et al. ) En su sitio, la buena seguridad de la contraseña no importa. Eso suena como una declaración polémica, pero piénselo: si puedo obtener toda su información de usuario a través de un ataque de inyección SQL, o puedo hacer que sus usuarios me den sus cookies a través de XSS, entonces no importa qué tan buena sea su contraseña la seguridad es

Otros recursos:

  1. Jeff Atwood: .NET Encryption Simplified (ideal para una visión general de hash)
  2. Jeff Atwood: Acabo de iniciar sesión como tú
  3. Jeff Atwood: Probablemente estés almacenando contraseñas incorrectamente
  4. Jeff Atwood: velocidad Hashing

Nota: por favor, recomiende otros buenos recursos. Debo haber leído una docena de artículos escritos por docenas de autores, pero pocos escriben tan claramente sobre el tema como Jeff. Por favor edite en los artículos a medida que los encuentre.