十万火急!!!如何重写WebForm的ViewState 加密过程????

猴头 2016-06-27 05:55:44
就是 EnableViewStateMAC="true" ViewStateEncryptionMode="Always" 设置这俩属性后,执行的加密~~~~~~

求解,领导让我想办法重写 加密过程,使用自定义的密钥 128位的
...全文
440 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
猴头 2016-06-30
  • 打赏
  • 举报
回复
引用 10 楼 sp1234 的回复:
[quote=引用 9 楼 yan_hyz 的回复:] 有空吗,能不能帮我 看看我重写的 HiddenFieldPageStatePersister 到底哪里出了问题,我仿照 msdn的例子写的能存能取保存的ViewState 数据,但是到页面上之后,VIewState 就取不到了.
抄 msdn 不一定是唯一的方式。 当年我们随便写上几十行代码,也被另外一个公司(这个软件公司早在前几年就上市了)的负责一个项目的人比较夸张地说什么“这是微软的代码啊!”。我就心说“也不看看我们这帮人中随便什么人胡写什么代码,就乱吹捧?明明是10分钟急急忙忙胡乱写的,只不过是一个demo,做事有多种方式,为什么不理解实质呢?”。 这个东西是比较简单清晰的,我在 #4 楼的代码是在 asp.net 有那个意识要封装个PageStatePersister之前写的,但是实质是几乎一模一样的。你若参考,就参考代码内部的实质。若抄 msdn 上的一个样子,那么就只好自己研究了。[/quote] 我不懂为什么,也不知道 实际的原理,只能从MSDN上找示例 然后根据示例分析 其中的原理.......
  • 打赏
  • 举报
回复
引用 9 楼 yan_hyz 的回复:
有空吗,能不能帮我 看看我重写的 HiddenFieldPageStatePersister 到底哪里出了问题,我仿照 msdn的例子写的能存能取保存的ViewState 数据,但是到页面上之后,VIewState 就取不到了.
抄 msdn 不一定是唯一的方式。 当年我们随便写上几十行代码,也被另外一个公司(这个软件公司早在前几年就上市了)的负责一个项目的人比较夸张地说什么“这是微软的代码啊!”。我就心说“也不看看我们这帮人中随便什么人胡写什么代码,就乱吹捧?明明是10分钟急急忙忙胡乱写的,只不过是一个demo,做事有多种方式,为什么不理解实质呢?”。 这个东西是比较简单清晰的,我在 #4 楼的代码是在 asp.net 有那个意识要封装个PageStatePersister之前写的,但是实质是几乎一模一样的。你若参考,就参考代码内部的实质。若抄 msdn 上的一个样子,那么就只好自己研究了。
猴头 2016-06-30
  • 打赏
  • 举报
回复
引用 6 楼 sp1234 的回复:
viewstate 中的信息都是公开的,它是控件的状态。因此它不怕人看(怕人看的信息也不可能展现给用户)。它要保证不被客户端篡改,是从比价普通的数据一致性角度,并不是怕人看到什么。 我想,ViewState 中的信息都是页面上的状态,那么用户就看页面表现就好了根本不用看 ViewState中有什么信息,领导具体是怕 ViewState 中有什么秘密呢? 领导是学 asp.net 有点着魔了,所以反而担心别人比自己学的更深、怕别人反序列化 __ViewState 信息进行调试?
有空吗,能不能帮我 看看我重写的 HiddenFieldPageStatePersister 到底哪里出了问题,我仿照 msdn的例子写的能存能取保存的ViewState 数据,但是到页面上之后,VIewState 就取不到了.

 public class UUHiddenFieldPageStatePersister : HiddenFieldPageStatePersister
    {
        public UUHiddenFieldPageStatePersister(Page page)
            : base(page)
        {
        }

        public override void Load()
        {
            Stream stateStream = new FileStream("ViewStateContent.txt", FileMode.OpenOrCreate);
            // Read the state string, using the StateFormatter.
            StreamReader reader = new StreamReader(stateStream);
            IStateFormatter formatter = this.StateFormatter;
            string fileContents = reader.ReadToEnd();
            // Deserilize returns the Pair object that is serialized in
            // the Save method.
            if (fileContents != "" && fileContents != null)
            {
                string json = (string)formatter.Deserialize(fileContents);
                Pair statePair = JsonConvert.DeserializeObject<Pair>(json);

                ViewState = statePair.First;
                ControlState = statePair.Second;

                reader.Close();
                stateStream.Close();
            }
            //return;
            base.Load();
        }

        public override void Save()
        {
            if (this.ViewState != null || this.ControlState != null)
            {
                if (Page.Session != null)
                {
                    Stream stateStream = new FileStream("ViewStateContent.txt", FileMode.OpenOrCreate);
                    StreamWriter writer = new StreamWriter(stateStream);
                    IStateFormatter formatter = this.StateFormatter;

                    Pair statePair = new Pair(this.ViewState, this.ControlState);
                    // Serialize the statePair object to a string.
                    string json = JsonConvert.SerializeObject(statePair);
                    string serializedState = formatter.Serialize(json);

                    writer.Write(serializedState);

                    writer.Close();
                    stateStream.Close();
                }
                else
                {
                    throw new InvalidOperationException("Session needed for StreamPageStatePersister.");
                }
            }

            //return;
            base.Save();
        }
    }

 public partial class Default : System.Web.UI.Page
    {
        private string TstViewStateKey = "TestTxt";

        private PageStatePersister pageStatePersister = null;
        protected override PageStatePersister PageStatePersister
        {
            get
            {
                //return base.PageStatePersister;
                if (this.pageStatePersister == null)
                {
                    this.pageStatePersister = new UUHiddenFieldPageStatePersister(this);
                }
                return this.pageStatePersister;
            }
        }

  protected void Page_Load(object sender, EventArgs e)
        {
            if (this.IsPostBack == false)
            {
                this.TextBox1.Text = "这是个文本框";
                this.ViewState[TstViewStateKey] = "[123测试文本321]";
            }
        }

   protected void Button1_Click(object sender, EventArgs e)
        {
            string txt = this.ViewState[TstViewStateKey] == null ? "" : this.ViewState[TstViewStateKey].ToString();
            this.Label2.Text = this.TextBox1.Text + txt;
        }
    }
正怒月神 版主 2016-06-28
  • 打赏
  • 举报
回复
应该保证秘钥的安全, 而不是算法。
猴头 2016-06-28
  • 打赏
  • 举报
回复
引用 6 楼 sp1234 的回复:
viewstate 中的信息都是公开的,它是控件的状态。因此它不怕人看(怕人看的信息也不可能展现给用户)。它要保证不被客户端篡改,是从比价普通的数据一致性角度,并不是怕人看到什么。 我想,ViewState 中的信息都是页面上的状态,那么用户就看页面表现就好了根本不用看 ViewState中有什么信息,领导具体是怕 ViewState 中有什么秘密呢? 领导是学 asp.net 有点着魔了,所以反而担心别人比自己学的更深、怕别人反序列化 __ViewState 信息进行调试?
因为 在页面 回发过程中,有些用户数据是存在ViewState的,并且ViewState 数据优惠被序列化存在页面上,但是这些用户数据又不想被别人能够看到详细内容,因此,才想到将ViewState 进一步加密。 我昨天查MSDN 仿照MSDN的列子 重写了 HiddenFieldPageStatePersister 类 : UUHiddenFieldPageStatePersister : HiddenFieldPageStatePersister 重写其中的Load 和Save 方法,Load 和Save 方法仿照 MSDN的列子 存在了 文件中,可以获取到,但是 每次获取到之后在页面上的 this.ViewState["Key"] 就访问不到数据了,不知道 是哪一步缺少处理了.....
  • 打赏
  • 举报
回复
viewstate 中的信息都是公开的,它是控件的状态。因此它不怕人看(怕人看的信息也不可能展现给用户)。它要保证不被客户端篡改,是从比价普通的数据一致性角度,并不是怕人看到什么。 我想,ViewState 中的信息都是页面上的状态,那么用户就看页面表现就好了根本不用看 ViewState中有什么信息,领导具体是怕 ViewState 中有什么秘密呢? 领导是学 asp.net 有点着魔了,所以反而担心别人比自己学的更深、怕别人反序列化 __ViewState 信息进行调试?
wanghui0380 2016-06-27
  • 打赏
  • 举报
回复
额,我表示你们头有个基本的东西没搞明白,任何一个学过点基础安全知识的都会明白一个基本理论“系统的保密性不依赖于对加密体制或算法的保密,而仅依赖于密钥的安全性。对于当今的公开密码系统,加密解密算法是公开的”
  • 打赏
  • 举报
回复
其实 asp.net 会自动检查它写出的 __ViewState 有没有被客户端篡改,因此你们领导的“担心”我觉得是一种怪现象,也许你们真的很闲?你们收入太多了!你们领导感觉应该让你做点任何asp.net 都没有受命做过、没有机会去网上抄袭的事情?! 我许多年以前写过一个代码
using System;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Formatters.Binary;
using System.Threading;
using System.Web.UI;

public class VPage : Page
{
    static private DirectoryInfo _Dir;

    private static DirectoryInfo Dir
    {
        get
        {
            if (_Dir == null)
            {
                _Dir = new DirectoryInfo(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Data"));
                if (!_Dir.Exists)
                    _Dir.Create();
                _Dir = new DirectoryInfo(Path.Combine(_Dir.FullName, "ViewState"));
                if (!_Dir.Exists)
                    _Dir.Create();
            }
            return _Dir;
        }
    }

    protected override object LoadPageStateFromPersistenceMedium()
    {
        PageStatePersister ps = this.PageStatePersister;
        ps.Load();
        if (ps.ControlState != null)
            ps.ControlState = 反序列化对象((string)ps.ControlState);
        if (ps.ViewState != null)
            ps.ViewState = 反序列化对象((string)ps.ViewState);
        return new Pair(ps.ControlState, ps.ViewState);
    }

    protected override void SavePageStateToPersistenceMedium(object state)
    {
        PageStatePersister ps = this.PageStatePersister;
        if (state is Pair)
        {
            ps.ControlState = ((Pair)state).First;
            ps.ViewState = ((Pair)state).Second;
        }
        else
            ps.ViewState = state;
        if (ps.ControlState != null)
            ps.ControlState = 序列化对象(ps.ControlState);
        if (ps.ViewState != null)
            ps.ViewState = 序列化对象(ps.ViewState);
        ps.Save();
    }

    private object 反序列化对象(string stateID)
    {
        if (stateID == null)
            return null;

        object state = Cache[stateID];
        if (state == null)
            using (var stream = File.OpenRead(Path.Combine(Dir.FullName, stateID)))
                state = new BinaryFormatter().Deserialize(stream);
        else
            Cache.Remove(stateID);
        return state;
    }

    private string 序列化对象(object obj)
    {
        string stateID = Guid.NewGuid().ToString("N");
        Cache.Insert(stateID, obj, null, DateTime.Now.AddMinutes(5), System.Web.Caching.Cache.NoSlidingExpiration);
        using (var stream = File.Create(Path.Combine(Dir.FullName, stateID)))
            new BinaryFormatter().Serialize(stream, obj);
        return stateID;
    }

    static VPage()
    {
        ThreadPool.QueueUserWorkItem(h =>
        {
            var et = DateTime.Now.AddMinutes(-30);
            Dir.GetFiles()
                .Where(f => f.LastAccessTime < et)
                .ToList()
                .ForEach(f =>
                {
                    try
                    {
                        f.Delete();
                    }
                    catch { }
                });
        });
    }
}
使用它替换你的页面的父类 Page 即可。 不过这原本并不是为了什么“加密”的目的而设计的。但是既然信息根本不抛给客户端,那么自然你们领导也没什么可说的了。
  • 打赏
  • 举报
回复
引用 2 楼 yan_hyz 的回复:
[quote=引用 1 楼 autfish 的回复:] 设置machineKey和加密算法validation就行了,为什么要自己写呢
领导认为 不安全[/quote] 举个不安全的实际例子看看。
猴头 2016-06-27
  • 打赏
  • 举报
回复
引用 1 楼 autfish 的回复:
设置machineKey和加密算法validation就行了,为什么要自己写呢
领导认为 不安全
大雨将至 2016-06-27
  • 打赏
  • 举报
回复
设置machineKey和加密算法validation就行了,为什么要自己写呢

62,244

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧