ASP.Net SessionState с использованием SQL Server - зашифрованы ли данные? - PullRequest
7 голосов
/ 09 июня 2009

При использовании Sql Server для хранения и управления SessionState хранятся ли данные сеанса в базе данных с использованием шифрования?

Когда я смотрю на данные в базе данных ASPNet, данные в столбце «SessionItemLong» в столбцах ASPStateTempSessions представляются шестнадцатеричными данными. Зашифрованы ли эти данные перед сохранением в базе данных? И если да, то где ключ, который используется для шифрования данных и какой алгоритм используется для шифрования данных?

Кроме того, состояние Session хранит объект с использованием сериализации. Какая сериализация используется? (двоичный файл или XML)

Ответы [ 2 ]

13 голосов
/ 09 июня 2009

Там нет шифрования. Данные хранятся с использованием двоичной сериализации (это намного быстрее, чем 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);
}
7 голосов
/ 15 ноября 2009

У меня недавно была эта проблема, и мне пришлось деконструировать сохраненное состояние, чтобы изучить проблему производительности ; грубый код был что-то вроде:

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);
        }
    }
}
...