2008-10-27 21 views
7

Necesito cifrar y descifrar una cadena de consulta en ASP.NET.¿Cómo puedo encriptar una cadena de consulta en asp.net?

La cadena de consulta podría ser algo como esto:

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

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

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

Y luego, por supuesto, cómo me descifrarlo? ¿Cuál es el mejor cifrado para usar para algo como esto? TripleDES?

Respuesta

6

Aquí es una manera de hacerlo en VB Desde: http://www.devcity.net/Articles/47/1/encrypt_querystring.aspx

Envoltura para el código de cifrado: de pasar sus parámetros de cadena de consulta en esto, y cambiar 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 
+1

Esto casi funciona. Cambié estas dos líneas: Devuelva Server.UrlEncode (enc64.Encrypt (qs, _key)) y Devuelva Server.UrlDecode (enc64.Decrypt (qs, _key)) y no se moleste con Replace ("" , "+") –

+0

Además, uso (¡oh, cómo me gustaría poder editarlo!): Encriptación: Dim myQS = EncryptQueryString ("id = 12345 & year = 2008") Response.Redirect (String.Format ("Default.aspx") ? q = {0} ", myQS)) Desencriptado: Dim myQS As String = DecryptQueryString (Request.QueryString (" q ")) –

+0

¿Hay alguna otra forma de hacer el cifrado pero no hacer que url sea demasiado largo? Algunas veces si hay muchas cadenas de caracteres que hacen que la URL tenga más de 2000 caracteres y no es buena para la mayoría de los navegadores. – Mhmd

0

No puedo darle una solución llave en mano en la cabeza, pero debe evitar TripleDES ya que es not as secure as other encryption methods.

Si lo estuviera haciendo, me acaba de tomar la dirección URL (dominio y la cadena de consulta) como un URI object, cifrarlo con uno de los built-in .NET libraries y suministrarla 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.

-1

Por qué estás tratando de cifrar su 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 exista una solución mejor para su problema fundamental que encriptar la cadena de consulta.

+0

También usamos SSL, pero alguien decidió pasar esta información en la cadena de consulta hace mucho tiempo, así es el camino será por ahora. –

+0

Si ya está utilizando SSL, solo se preocupa por la navegación de hombro, entonces, ¿qué le parece usar Convert.ToBase64String (data) y Convert.FromBase64String (base64) en los valores de los parámetros? –

0

Aquí hay una especie de versión elegante de la función de descifrado del ejemplo anterior de Brian 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 como 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 encuentre útil!

0

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, los estándares web dictan que si la solicitud no cambia los datos en el servidor, el método GET debería ser usado.

Será mucho más código cifrar los datos que simplemente usar POST.

Cuestiones relacionadas