【问题标题】:ASP.Net SessionState using SQL Server - is the data encrypted?使用 SQL Server 的 ASP.Net SessionState - 数据是否加密?
【发布时间】:2010-11-01 08:04:03
【问题描述】:

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

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

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

【问题讨论】:

    标签: asp.net sql-server encryption session-state


    【解决方案1】:

    那里没有加密。数据使用二进制序列化存储(它比 xml 快得多)。有关详细信息,请查看 SessionStateUtility 类(您可以使用 free 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);
    }
    

    【讨论】:

    • 你刚刚为我节省了很多时间(试图从数据库中解扰一些 BLOB);谢谢。
    【解决方案2】:

    我最近遇到了这个问题,不得不将存储状态解构为investigate a performance issue;粗略的代码是这样的:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-15
      • 2015-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-22
      • 2019-06-26
      相关资源
      最近更新 更多