Esta pregunta está dirigida al marco .Net, pero se espera que sea respondida para abarcar muchos idiomas y amp; marcos.
Supongamos que tengo dos métodos, uno que en realidad descifra los datos y otro que toma los datos descifrados y los devuelve al usuario:
private string Decypt_Data(string encryptedText, string EncryptionKey) {
string plainText = "";
using(SomeEncryptionClass myObject = new SomeEncryptionClass()) {
myObject.Key = EncryptionKey; //lets not worry about how we create or store these
myObject.IV = GetIV();
plainText = myObject.DecryptText(encryptedText);
}
return plainText; //REFERENCE 1
}
//specifically this is called from a controller after a POST
private ActionResult Read_Encrypted_Value()
{
string encryptedEncryptionKey = GetDataFromDatabase("keyfield");
string encryptionKey = Decypt_Data(encryptedEncryptionKey, GetKeyFromSomeWhereThisIsUnImportant());
//decrypt data with plainText (ie. plainText is a key.. but this isnt important to the question)
syromg encryptedData = GetDataFromDatabase("datafield");
return View(Decypt_Data(encryptedData, encryptionKey)); //RFERENCE 2
}
Mirando el método Decrypt_Data, el texto encriptado se pasa y se desencripta y luego se devuelve el texto sin formato.
La pregunta es ... ¿qué tan seguro es el valor almacenado en "plainText" (en la REFERENCIA 1)?
La variable plainText solo dura el alcance del método ... pero, ¿entonces qué? ¿Permanece ese valor en la memoria hasta que el recolector de basura se ocupa de él? ¿Se anula o algo así? ¿Debo hacer algo como en la REFERENCIA 2, donde hago el cálculo y devuelvo el valor juntos? ¿Debo pasar cadenas como referencias, para que no sea necesario crear una instancia de la variable que devuelve el valor?
Si el valor permanece en la memoria, ¿no es vulnerable? ¿Puede un atacante no leer la memoria y robar el valor? (Estoy trabajando en el principio de que este valor se utiliza para descifrar algunos otros datos ... para que el atacante que tiene acceso directo a la base de datos no le dé todos los datos).
La respuesta
Muchas gracias a todos por sus respuestas, encontré este artículo: enlace en uno de los enlaces de la respuesta del usuario10008. Cubre prácticamente todo lo que necesita saber + lista de códigos completa.