2009-06-08 15 views
6

Podczas korzystania z serwera Sql do przechowywania SessionState i zarządzania nim dane sesji są przechowywane w bazie danych za pomocą szyfrowania?ASP.Net SessionState przy użyciu SQL Server - czy dane są zaszyfrowane?

Kiedy patrzę na dane w bazie danych ASPNet, dane w kolumnie "SessionItemLong" w kolumnach ASPStateTempSessions wydają się być danymi szesnastkowymi. Czy dane są szyfrowane przed ich zapisaniem w bazie danych? A jeśli tak, to gdzie jest klucz używany do szyfrowania danych i jakiego algorytmu używa się do szyfrowania danych?

Ponadto stan sesji przechowuje obiekt przy użyciu serializacji. Której serializacji używasz? (binarny lub XML)

Odpowiedz

12

Nie ma tam szyfrowania. Dane są przechowywane przy użyciu serializacji binarnej (jest to znacznie szybsze niż xml). Szczegółowe informacje można znaleźć w klasie SessionStateUtility (można ją przeglądać przy użyciu free Reflector). Jest to kod, który służy do serializacji:

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

Właśnie zaoszczędziłeś mi dużo czasu (próbując odszyfrować niektóre BLOBy z db); dzięki. –

6

miałem ten problem niedawno, i miał do dekonstrukcji zapisanego stanu do investigate a performance issue; zgrubny kod był podobny:

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); 
     } 
    } 
} 
Powiązane problemy