7

使用Sql Server存储和管理SessionState时,session数据存储在数据库中是否采用加密方式?

当我查看 ASPNet 数据库中的数据时,ASPStateTempSessions 列中的“SessionItemLong”中的数据似乎是十六进制数据。这些数据在存储到数据库之前是否经过加密?如果是这样,用于加密数据的密钥在哪里以及用于加密数据的算法是什么?

此外,会话状态使用序列化存储对象。使用哪种序列化?(二进制或 XML)

4

2 回答 2

13

那里没有加密。数据使用二进制序列化存储(它比 xml 快得多)。有关详细信息,请查看 SessionStateUtility 类(您可以使用免费的 Reflector浏览它)。这是用于序列化的代码:

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);
}
于 2009-06-09T00:09:54.670 回答
9

我最近遇到了这个问题,不得不解构存储状态来调查性能问题;粗略的代码是这样的:

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);
        }
    }
}
于 2009-11-15T10:00:03.700 回答