Pregunta

Hola, en una base de datos MSSQL que estoy guardando y recuperando para usar procedimientos almacenados. Estoy tratando de cifrar algunos datos en el formulario de Windows C# antes de ser colocado, y luego, por supuesto, descifrarlos cuando los retire. Todo el cifrado se está manejando en el lado de C#. Estoy usando el código de muestra para el cifrado y el descifrado literalmente de Clase de tripleDeservicio tripleDeservicio de Microsoft (La versión de memoria, 2do ejemplo). Los valores se encriptan y se envían a la base de datos, pero al recuperarla obtengo un error de "malos datos". Una muestra de la llamada de cifrado es ...

TripleDESCryptoServiceProvider tDESalg = new TripleDESCryptoServiceProvider();
byte[] tempByte = new byte[100];
tempByte = encrypt(txt_Last_Name.Text, tDESalg.Key, tDESalg.IV);
txt_Last_Name.Text = System.Text.ASCIIEncoding.ASCII.GetString(tempByte);

El txt_last_name se envía a la base de datos, y puedo ver que hay algo en la base de datos. En la base de datos, el apellido es de tipo varchar (20)

La muestra de la llamada de descifrado es ...

TripleDESCryptoServiceProvider tDESalg = new TripleDESCryptoServiceProvider();
string lastName = dr.GetString(dr.GetOrdinal("Last Name"));
if (isEncrypted)
{
     byte[] toDecrypt = new ASCIIEncoding().GetBytes(lastName);
     lastName = decrypt(toDecrypt, tDESalg.Key, tDESalg.IV);                    
}
txt_Last_Name.Text = lastName;

se bombea en la función de descifrado en: "csdecrypt.read (fromEnnapt, 0, fromEnnpt.length);"; Y no entiendo por qué. No estoy seguro de si no se está almacenando en la base de datos correctamente, o mis conversiones no son correctas.

Si significa algo, los "datos" que entran en la función Decrypt es de tamaño 16 y contiene valores distintos de cero, pero el "byte [] fromencrypt" es una matriz de tamaño 16 que contiene todos los ceros.

¡Gracias por cualquier ayuda!

¿Fue útil?

Solución

Editar: Bien, tenemos al final ... aunque el problema ASCII también habría mordido.

Cada vez que creas un nuevo TripleDESCryptoServiceProvider Y pídale una clave/IV, generará una nueva. Debe almacenar eso de forma segura en algún lugar, ya que se requiere para descifrar los datos. De lo contrario, no tiene ningún "secreto", por lo que no es realmente cifrado ...


Esta es una idea terrible:

txt_Last_Name.Text = System.Text.ASCIIEncoding.ASCII.GetString(tempByte);

Tienes datos binarios arbitrarios en tempByte. No Suponga que es un texto ASCII válido. Eso es casi seguro donde estás perdiendo datos.

Usar Convert.ToBase64String y Convert.FromBase64String para codificar de forma segura los datos binarios opacos como texto.

Además, esta es una mala idea:

byte[] tempByte = new byte[100];
tempByte = encrypt(txt_Last_Name.Text, tDESalg.Key, tDESalg.IV);

¿Cuál es el punto de crear una matriz de bytes si lo vas a ignorar? Usar

byte[] tempByte = encrypt(txt_Last_Name.Text, tDESalg.Key, tDESalg.IV);

en cambio. Ah, e intenta seguir las convenciones de nombres de .NET :)

Habiendo dicho todo esto, si su cifrado siempre devuelve una matriz de bytes de 16 ceros, esa es una señal bastante segura de que su encrypt El método está roto. Realmente no podemos ayudar allí hasta que publique el código para ese método.

Finalmente, si su columna es de tipo varchar(20) Debe tener en cuenta que eso puede no contener todos los datos a los que lo necesita ... especialmente si va a incluir una sal. Base64 aumentará un poco el tamaño de los datos, y el cifrado también puede hacerlo. Como se menciona en otra respuesta, almacenar esto como binario en la base de datos Sería más sensato en muchos sentidos.

(Nota: incluso si hizo quiero usar ese código, lo escribiría como txt_Last_Name.Text = Encoding.ASCII.GetString(tempByte);. El uso de directivas es tu amigo y ASCII es una propiedad de Encoding, no ASCIIEncoding.)

Otros consejos

Sólo leyendo el doctor... Debes convertir tu byte [] en una cadena usando Convert.ToBase64String().

Ya sea convert.Tobase64String (), como Pascal recomendó anteriormente, o almacene los datos como binarios en su base de datos en lugar de texto (la solución preferida, ya que usaría menos espacio). En SQL Server, hay un tipo de datos Varbinary (Max) para este mismo propósito.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top