2009-06-08 6 views
6

Lors de l'utilisation de Sql Server pour stocker et gérer le SessionState, les données de session sont-elles stockées dans la base de données en utilisant le chiffrement?ASP.Net SessionState à l'aide de SQL Server - Les données sont-elles chiffrées?

Lorsque je regarde les données dans la base de données ASPNet, les données dans le "SessionItemLong" dans les colonnes ASPStateTempSessions semblent être des données hexadécimales. Ces données sont-elles cryptées avant d'être stockées dans la base de données? Et si oui, où est la clé qui est utilisée pour crypter les données et quel algorithme est utilisé pour crypter les données?

En outre, l'état de session stocke l'objet en utilisant la sérialisation. Quelle sérialisation est utilisée? (binaire ou XML)

Répondre

12

Il n'y a pas de cryptage. Les données sont stockées en utilisant la sérialisation binaire (c'est beaucoup plus rapide que xml). Pour plus de détails, regardez la classe SessionStateUtility (vous pouvez la parcourir en utilisant free Reflector). Voici le code qui est utilisé pour la sérialisation:

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

Vous venez de me sauver beaucoup de temps (en essayant de désembrouiller certains BLOB de la base de données); Merci. –

6

j'ai eu ce problème récemment, et a dû déconstruire état stocké à investigate a performance issue; le code approximatif était quelque chose comme:

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); 
     } 
    } 
} 
Questions connexes