none
Encriptar un string con SHA-3 c# RRS feed

  • Pregunta

  • Foro buenas tardes... Tengo un software que hice y para encriptar los strings utiliza MD5 mas un algoritmo que hice que modifica dicho MD5 para que no sea tan sencillo hacer ingenieria inversa al MD5. 

    El tema que hace unos dias me enteré que MD5 NO ES SEGURO, ya ha sido roto, por lo que empeze a investigar un poco mas del tema, Me iba a tirar a SHA1 pero me di cuenta que tambien fue roto, segui con SHA2 pero ya pudieron colicionarlo por lo que en poco tiempo seguro lo van a romper. Por lo que pense usar SHA-3.

    Aun no tengo claro como funciona... En MD5 se una una llave como string, Ahora SHA-3 es igual?????????'

    Encontre este algoritmo : 

    public string SHA3(string mDato, int mTamaño)
            {
                StringBuilder x = new StringBuilder();
                SHA3Managed hash = new SHA3Managed(mTamaño);
                System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
                byte[] MessageBytes = encoding.GetBytes(mDato);
                byte[] ComputeHashBytes = hash.ComputeHash(MessageBytes);
                foreach (var item in ComputeHashBytes) { x.Append(item.ToString("x2")); }
                return x.ToString();
            }

    Lo probe y me devuelve un string encriptado. Pero no se como hacer la inversa.... 

    Mi pregunta es... SHA-3 tiene llave? como md5???

    o como funciona?

    Alguien tiene una funcion que encripte y otra que desencripte????

    jueves, 8 de marzo de 2018 15:49

Respuestas

Todas las respuestas

  • Si necesitas un algoritmo de hashing bien probado y validado y reconocidamente seguro, usa el SHA256.

    No tendrás problema para modificar tu código porque las librerías de .Net que implementan SHA256 son muy similares a las del MD5 y se invocan de la misma manera.

    PERO: Dicho lo anterior, hay que señalar que es una pésima idea usar cualquiera de ellos para encriptar. Los algoritmos de hashing están expresamente diseñados para que no sean invertibles, por lo que no se puede deshacer la operación que hayas hecho con el hashing. Eso implica que has tenido que inventarte tu propio algoritmo para realizar una encriptación que se pueda desencriptar apoyándote en el hashing. Con independencia de lo seguro que sea el algoritmo de hashing que elijas, el hecho de que luego a partir de él apliques tu propio procedimiento para realizar la encriptación NO ES SEGURO. Como te explicará cualquier experto en criptografía, diseñar tu propio algoritmo para cifrar supone un riesgo elevadísimo de que no sea seguro, porque no se somete a los mismos procesos de verificación y validación por la comunidad a los que se someten los algoritmos públicos. En conclusión: para cifrar o descifrar, no uses ninguno de los algoritmos de hash. Usa un algoritmo de cifrado tal como el AES. Incluso DES o triple-DES serían preferibles antes que inventar tu propio algoritmo.


    jueves, 8 de marzo de 2018 16:14
    Moderador
  • Muchas gracias por tu rapida respuesta. El tema es el siguiente... Tengo datos criticos que necesito encriptar.... se me ocurrio lo siguiente: Actualmente estoy usando 2 motores de bases de datos. SqlCompact 4.0 para guardar datos criticos bajo md5 y con password la sql. Y tambien uso sql server express 2012, pero esta ultima no puedo creer que no se le pueda poner contraseña como el sqlcompact. uno instala el sql management en el pc y accede a la base de datos con usuario sa. Por eso quiero encriptar los datos.
    jueves, 8 de marzo de 2018 16:45
  • Ah, si solo lo quieres para encriptar en SQL Server, habilita la criptografia dentro del servidor (funciona en todas las ediciones, incluida la Express).

    https://docs.microsoft.com/es-es/sql/t-sql/functions/encryptbykey-transact-sql

    Si prefieres hacerlo en lado cliente, utiliza un algoritmo de cifrado, no un algoritmo de hashing.

    https://msdn.microsoft.com/en-us/library/system.security.cryptography.rijndaelmanaged(v=vs.110).aspx

    jueves, 8 de marzo de 2018 17:04
    Moderador
  • Que bien. He estado mucho tiempo buscando esta informacion que me has compartido, Desde ya mil gracias Alberto. Viendo mis limitaciones en el tema de sql ya que soy autodidacta, preferiría usar el segundo ejemplo. Viendo dicho ejemplo veo que tiene 2 funciones. 1 que encripta y otra que desencripta. Hasta ahi genial. Ahora veo que la "llave" la auto genera automaticamente con : 

    myRijndael.GenerateKey();

    Ahora.. puedo mandar un string convertido a bytes?

    jueves, 8 de marzo de 2018 18:52
  • Ahora.. puedo mandar un string convertido a bytes?

    Sí, puedes mandar 16 bytes cualesquiera. Pero si lo quieres hacer bien hecho, usa la función PasswordDeriveBytes:

    https://msdn.microsoft.com/en-us/library/system.security.cryptography.passwordderivebytes(v=vs.110).aspx

    Esta función toma un string (la "password") y a partir de él usa un algoritmo criptográficamente robusto para generar los bytes que luego se usarán como clave en el algoritmo de cifrado. De esa forma la clave es más robusta, ya que si usas un string corriente y tomas (por ejemplo) el valor ascii de los caracteres, eso limita mucho las combinaciones y es más fácil predecir la clave.

    jueves, 8 de marzo de 2018 19:04
    Moderador