2009-06-08 13 views
6

Al usar el servidor Sql para almacenar y administrar el estado de la sesión, ¿se almacenan los datos de la sesión en la base de datos mediante el cifrado?ASP.Net SessionState usando SQL Server - ¿Están cifrados los datos?

Cuando miro los datos en la base de datos ASPNet, los datos en el "SessionItemLong" en las columnas ASPStateTempSessions parecen ser datos hexadecimales. ¿Esta información está siendo encriptada antes de ser almacenada en la base de datos? Y si es así, ¿dónde está la clave que se utiliza para cifrar los datos y qué algoritmo se utiliza para cifrar los datos?

Además, el estado de sesión almacena el objeto mediante serialización. ¿Qué serialización se usa? (binario o XML)

Respuesta

12

No hay encriptación allí. Los datos se almacenan mediante serialización binaria (es mucho más rápido que xml uno). Para más detalles, mire la clase SessionStateUtility (puede navegar usando free Reflector). Este es el código que se utiliza para la serialización:

internal static void Serialize(SessionStateStoreData item, Stream stream) 
{ 
    bool flag = true; 
    bool flag2 = true; 
    BinaryWriter writer = new BinaryWriter(stream); 
    writer.Write(item.Timeout); 
    if ((item.Items == null) || (item.Items.Count == 0)) 
    { 
     flag = false; 
    } 
    writer.Write(flag); 
    if ((item.StaticObjects == null) || item.StaticObjects.NeverAccessed) 
    { 
     flag2 = false; 
    } 
    writer.Write(flag2); 
    if (flag) 
    { 
     ((SessionStateItemCollection) item.Items).Serialize(writer); 
    } 
    if (flag2) 
    { 
     item.StaticObjects.Serialize(writer); 
    } 
    writer.Write((byte) 0xff); 
} 
+0

Usted acaba de ahorrarme mucho tiempo (tratando de descifrar algunos BLOB del DB); Gracias. –

6

tuve este problema hace poco, y tuvo que deconstruir estado almacenado a investigate a performance issue; el código aproximado era algo así como:

byte[] blob = ... // TODO 
using (var ms = new MemoryStream(blob)) 
using (BinaryReader reader = new BinaryReader(ms)) { 
    int len = reader.ReadInt32(); 
    bool f1 = reader.ReadBoolean(), f2 = reader.ReadBoolean(); 
    SessionStateItemCollection items = null; 
    HttpStaticObjectsCollection sitems = null; 
    if (f1) { 
     items = SessionStateItemCollection.Deserialize(reader); 
    } 
    if (f2) { 
     sitems = HttpStaticObjectsCollection.Deserialize(reader); 
    } 
    if (reader.ReadByte() != 0xFF) { 
     throw new InvalidOperationException("corrupt"); 
    } 
    if (items != null) { 
     int max = items.Count; 
     for (int i = 0; i < max; i++) { 
      object obj = items[i]; 
      Console.WriteLine("{0}\t{1}", items.Keys[i], 
       obj == null ? "n/a" : obj.GetType().FullName); 
     } 
    } 
} 
Cuestiones relacionadas