net asp asp.net encryption

¿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í:

http://www.misitio.com/report.aspx?id=12345&year=2008

¿Cómo hago para encriptar toda la cadena de consulta para que se vea algo como lo siguiente?

http://www.misitio.com/report.aspx?crypt=asldjfaf32as98df8a

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.