2009-06-08 15 views
6

Quando si utilizza Sql Server per archiviare e gestire SessionState, i dati di sessione sono memorizzati nel database utilizzando la crittografia?ASP.Net SessionState utilizzando SQL Server: i dati sono crittografati?

Quando guardo i dati nel database ASPNet, i dati nel "SessionItemLong" nelle colonne ASPStateTempSessions sembrano dati esadecimali. Questi dati vengono crittografati prima di essere archiviati nel database? E se sì, dove è la chiave che viene utilizzata per crittografare i dati e quale algoritmo viene utilizzato per crittografare i dati?

Inoltre, lo stato sessione memorizza l'oggetto utilizzando la serializzazione. Quale serializzazione viene utilizzata? (binario o XML)

risposta

12

Non c'è alcuna crittografia lì. I dati vengono archiviati usando la serializzazione binaria (è molto più veloce di xml). Per i dettagli guarda la classe SessionStateUtility (puoi sfogliarla usando free Reflector). Questo è il codice che viene utilizzato per la serializzazione:

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

Hai appena mi ha salvato un sacco di tempo (cercando di decodificare alcuni BLOB dal db); Grazie. –

6

ho avuto questo problema di recente, e ha dovuto decostruire stato memorizzato investigate a performance issue; il codice di massima era qualcosa di simile:

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); 
     } 
    } 
} 
Problemi correlati