¿Cómo puedo encriptar una cadena de consulta en asp.net?
asp net aes encryption (5)
Necesito cifrar y descifrar una cadena de consulta en ASP.NET.
La cadena de consulta podría verse más o menos así:
¿Cómo hago para encriptar toda la cadena de consulta para que se vea algo como lo siguiente?
Y luego, por supuesto, ¿cómo descifrarlo? ¿Cuál es el mejor cifrado para usar para algo como esto? TripleDES?
¿Por qué intentas encriptar tu cadena de consulta? Si los datos son confidenciales, debe usar SSL. Si le preocupa que alguien revise el hombro del usuario, use el formulario POST en lugar de GET.
Creo que es bastante probable que haya una solución mejor para su problema fundamental que encriptar la cadena de consulta.
Aquí hay una especie de versión sofisticada de la función de descifrado del ejemplo de Brian anterior que podría usar si solo fuera a usar esto para QueryString ya que devuelve una NameValueCollection en lugar de una cadena. También contiene una ligera corrección ya que el ejemplo de Brian se romperá sin
stringToDecrypt = stringToDecrypt.Replace(" ", "+")
si hay caracteres ''espacio'' en la cadena para descifrar:
Public Shared Function DecryptQueryString(ByVal stringToDecrypt As String, ByVal encryptionKey As String) As Collections.Specialized.NameValueCollection
Dim inputByteArray(stringToDecrypt.Length) As Byte
Try
Dim key() As Byte = System.Text.Encoding.UTF8.GetBytes(encryptionKey.Substring(0, encryptionKey.Length))
Dim IV() As Byte = {&H12, &H34, &H56, &H78, &H90, &HAB, &HCD, &HEF}
Dim des As New DESCryptoServiceProvider()
stringToDecrypt = stringToDecrypt.Replace(" ", "+")
inputByteArray = Convert.FromBase64String(stringToDecrypt)
Dim ms As New MemoryStream()
Dim cs As New CryptoStream(ms, des.CreateDecryptor(key, IV), CryptoStreamMode.Write)
cs.Write(inputByteArray, 0, inputByteArray.Length)
cs.FlushFinalBlock()
Dim encoding As System.Text.Encoding = System.Text.Encoding.UTF8
Dim decryptedString As String = encoding.GetString(ms.ToArray())
Dim nameVals() As String = decryptedString.Split(CChar("&"))
Dim queryString As New Collections.Specialized.NameValueCollection(nameVals.Length)
For Each nameValPair As String In nameVals
Dim pair() As String = nameValPair.Split(CChar("="))
queryString.Add(pair(0), pair(1))
Next
Return queryString
Catch e As Exception
Throw New Exception(e.Message)
End Try
End Function
¡Espero que encuentres esto útil!
Aquí hay una manera de hacerlo en VB. De: http://www.devcity.net/Articles/47/1/encrypt_querystring.aspx
Wrapper para el código de encriptación: ¡ pasa tus parámetros de cadena de consulta a esto y cambia la clave!
Private _key as string = "!#$a54?3"
Public Function encryptQueryString(ByVal strQueryString As String) As String
Dim oES As New ExtractAndSerialize.Encryption64()
Return oES.Encrypt(strQueryString, _key)
End Function
Public Function decryptQueryString(ByVal strQueryString As String) As String
Dim oES As New ExtractAndSerialize.Encryption64()
Return oES.Decrypt(strQueryString, _key)
End Function
Código de Encriptación:
Imports System
Imports System.IO
Imports System.Xml
Imports System.Text
Imports System.Security.Cryptography
Public Class Encryption64
Private key() As Byte = {}
Private IV() As Byte = {&H12, &H34, &H56, &H78, &H90, &HAB, &HCD, &HEF}
Public Function Decrypt(ByVal stringToDecrypt As String, _
ByVal sEncryptionKey As String) As String
Dim inputByteArray(stringToDecrypt.Length) As Byte
Try
key = System.Text.Encoding.UTF8.GetBytes(Left(sEncryptionKey, 8))
Dim des As New DESCryptoServiceProvider()
inputByteArray = Convert.FromBase64String(stringToDecrypt)
Dim ms As New MemoryStream()
Dim cs As New CryptoStream(ms, des.CreateDecryptor(key, IV), _
CryptoStreamMode.Write)
cs.Write(inputByteArray, 0, inputByteArray.Length)
cs.FlushFinalBlock()
Dim encoding As System.Text.Encoding = System.Text.Encoding.UTF8
Return encoding.GetString(ms.ToArray())
Catch e As Exception
Return e.Message
End Try
End Function
Public Function Encrypt(ByVal stringToEncrypt As String, _
ByVal SEncryptionKey As String) As String
Try
key = System.Text.Encoding.UTF8.GetBytes(Left(SEncryptionKey, 8))
Dim des As New DESCryptoServiceProvider()
Dim inputByteArray() As Byte = Encoding.UTF8.GetBytes( _
stringToEncrypt)
Dim ms As New MemoryStream()
Dim cs As New CryptoStream(ms, des.CreateEncryptor(key, IV), _
CryptoStreamMode.Write)
cs.Write(inputByteArray, 0, inputByteArray.Length)
cs.FlushFinalBlock()
Return Convert.ToBase64String(ms.ToArray())
Catch e As Exception
Return e.Message
End Try
End Function
End Class
No puedo darte una solución de llave en mano, pero debes evitar TripleDES ya que no es tan seguro como otros métodos de encriptación .
Si lo estuviera haciendo, tomaría todo el URL (dominio y querystring) como un objeto URI , lo encriptaría con una de las bibliotecas incorporadas de .NET y lo suministraría como el objeto crypt
. Cuando necesite descifrarlo, hágalo, luego cree un nuevo objeto URI, que le permitirá recuperar todo de la cadena de consulta original.
Originalmente iba a estar de acuerdo con Joseph Bui sobre la base de que sería más eficiente con el procesador usar el método POST en su lugar, los estándares web dictan que si la solicitud no cambia los datos en el servidor, se debe usar el método GET.
Será mucho más código cifrar los datos que simplemente usar POST.