c# - mvc - ¿Cuál es la mejor manera de encriptar cadenas cortas en.NET?
login encriptado c# (6)
Mi jefe quiere que encripte cierta información utilizada durante la transferencia de datos. Las cadenas individuales que se cifrarán tienen entre ocho y veinte caracteres de longitud. Se debe usar una sola contraseña para cifrar y descifrar, así que necesito un alogrithm simétrico. No quiero hacer lo mío: quiero usar uno integrado en .NET desde C #.
Entonces, ¿qué algoritmo es el mejor?
Aquí está la función de cifrado y descifrado con encriptación des3
'''''' <summary>
'''''' Encrypts a memory string (i.e. variable).
'''''' </summary>
'''''' <param name="data">String to be encrypted.</param>
'''''' <param name="key">Encryption key.</param>
'''''' <param name="iv">Encryption initialization vector.</param>
'''''' <returns>Encrypted string.</returns>
Public Shared Function Encrypt(ByVal data As String, ByVal key As String, ByVal iv As String) As String
Dim bdata As Byte() = Encoding.ASCII.GetBytes(data)
Dim bkey As Byte() = HexToBytes(key)
Dim biv As Byte() = HexToBytes(iv)
Dim stream As MemoryStream = New MemoryStream
Dim encStream As CryptoStream = New CryptoStream(stream, des3.CreateEncryptor(bkey, biv), CryptoStreamMode.Write)
encStream.Write(bdata, 0, bdata.Length)
encStream.FlushFinalBlock()
encStream.Close()
Return BytesToHex(stream.ToArray())
End Function
'''''' <summary>
'''''' Decrypts a memory string (i.e. variable).
'''''' </summary>
'''''' <param name="data">String to be decrypted.</param>
'''''' <param name="key">Original encryption key.</param>
'''''' <param name="iv">Original initialization vector.</param>
'''''' <returns>Decrypted string.</returns>
Public Shared Function Decrypt(ByVal data As String, ByVal key As String, ByVal iv As String) As String
Dim bdata As Byte() = HexToBytes(data)
Dim bkey As Byte() = HexToBytes(key)
Dim biv As Byte() = HexToBytes(iv)
Dim stream As MemoryStream = New MemoryStream
Dim encStream As CryptoStream = New CryptoStream(stream, des3.CreateDecryptor(bkey, biv), CryptoStreamMode.Write)
encStream.Write(bdata, 0, bdata.Length)
encStream.FlushFinalBlock()
encStream.Close()
Return Encoding.ASCII.GetString(stream.ToArray())
End Function
Clases de seguridad .net:
Picadillo
* MD5
* MD5Cng
* SHA1
* SHA1Managed
* SHA1Cng
* SHA256
* SHA256Managed
* SHA256Cng
* SHA384
* SHA384Managed
* SHA384Cng
* SHA512
* SHA512Managed
* SHA512Cng
Cifrado simétrico: utiliza la misma clave para cifrado y descifrado.
* DES
* DESCryptoServiceProvider
* TripleDES
* TripleDESCryptoServiceProvider
* Aes
* AesCryptoServiceProvider
* AesManaged
* RC2
* RC2CryptoServiceProvider
* Rijandel
* RijandelManaged
Cifrado asimétrico: Utiliza diferentes claves para cifrado y descifrado.
* DSA
* DSACryptoServiceProvider
* ECDsa
* ECDsaCng
* ECDiffieHellman
* ECDiffieHellmanCng
* RSA
* RSACryptoServideProvider
Simplemente podría usar el cifrado RSA, ya que son cadenas cortas, lo que simplificará el intercambio de claves.
La cantidad que puede encriptar con RSA se basa en la longitud de la clave.
Soy un fan de la biblioteca de rsa del castillo hinchable.
TripleDes?
Puede usar System.Security.Cryptography.TripleDESCryptoServiceProvider
Una pequeña cantidad de código para encriptar / descifrar ... hace exactamente lo que dice en la lata :)
DES es bastante obsoleto en este punto. Aquí está la Wikipedia . Si cambia mucho la llave, podría ser adecuada, pero si confía en una llave por un tiempo, AES parece ser una mejor opción.
Por supuesto, es una cuestión de cuánta protección necesita. Pero AES también está ahí.
He usado AES para cadenas pequeñas, y funciona bien.
Lo que he leído sobre TripleDES es que, dado que DES es fácilmente crackable, TripleDES aún no es sustancial.
TripleDES es una muy buena opción, pero también puede considerar AesCryptoServiceProvider (AES), que es un cifrado simétrico moderno.