zoukankan      html  css  js  c++  java
  • machinekey相关信息

    在session共享时必须将web.config中的machineKey配置为相同的加解密算法

    <system.web>
        <machineKey decryptionKey="FD69B2EB9A11E3063518F1932E314E4AA1577BF0B824F369" validationKey="5F32295C31223A362286DD5777916FCD0FD2A8EF882783FD3E29AB1FCDFE931F8FA45A8E468B7A40269E50A748778CBB8DB2262D44A86BBCEA96DCA46CBC05C3" validation="SHA1" decryption="Auto"/>
    </system.web>
    

    machineKey详细介绍可参考

    http://blog.csdn.net/huwei2003/article/details/4647008

    原文描述:

    machineKey的作用在于下述场景: ASP.net 使用 forms authentication 时的 cookie 数据的加密和解密。以确保这部分数据不会被篡改。 viewstate 数据的加密和解密。以确保这部分数据不会被篡改。 使用进程外session(out-of-process session)时,对会话状态标识进行验证。

    也就是说machineKey的加解密方法主要作用

    1. 验证前台加密数据是否合法
    2. 验证进程外session是否合法

    但是每个项目的默认加密方式为:

    <!--ASP.NET 1.0-->
    <machineKey  validationKey="AutoGenerate" decryptionKey="AutoGenerate"  validation="SHA1"/>
    
    <!--ASP.NET 1.1-->
    <machineKey 
       validationKey="AutoGenerate,IsolateApps" 
       decryptionKey="AutoGenerate,IsolateApps" 
       validation="SHA1"/>
    
    <!--ASP.NET 2.0、3.0、3.5-->
    <machineKey 
       validationKey="AutoGenerate,IsolateApps" 
       decryptionKey="AutoGenerate,IsolateApps"    
       validation="SHA1" 
       decryption="Auto" />
    

    皆为SHA1,而两个Key都是随机生成的。这样Session在共享的时候必定会出现加解密的问题而导致不能共享。 使用本文开头的加解密规则,两个Key都统一使用同一个值才能解决这个问题

    Asp.Net应用程序中为什么要MachineKey?如何生成MachineKey? 如果你的Asp.Net程序执行时碰到这种错误:“验证视图状态 MAC 失败。如果此应用程序由网络场或群集承载,请确保 <machineKey> 配置指定了相同的 validationKey 和验证算法。不能在群集中使用 AutoGenerate。”那么说明你没有让你的应用程序使用统一的machineKey,那么machineKey的作用是什么呢?按照MSDN的标准说法:“对密钥进行配置,以便将其用于对 Forms 身份验证 Cookie数据和视图状态数据进行加密和解密,并将其用于对进程外会话状态标识进行验证。”也就是说Asp.Net的很多加密,都是依赖于machineKey里面的值,例如Forms 身份验证Cookie、ViewState的加密。默认情况下,Asp.Net的配置是自己动态生成,如果单台服务器当然没问题,但是如果多台服务器负载均衡,machineKey还采用动态生成的方式,每台服务器上的machinekey值不一致,就导致加密出来的结果也不一致,不能共享验证和ViewState,所以对于多台服务器负载均衡的情况,一定要在每台站点配置相同的machineKey。

    另外原文提供了machineKey的生成算法:

    string validationKey = CreateKey(20);
    string decryptionKey = CreateKey(24);
         protected string CreateKey(int len)
         {
                byte[] bytes = new byte[len];
                new RNGCryptoServiceProvider().GetBytes(bytes);
                  StringBuilder sb = new StringBuilder();
                  for(int i = 0; i < bytes.Length; i++)
                  {   
                       sb.Append(string.Format("{0:X2}",bytes[i]));
                  }
                  return sb.ToString();
         }
    

    三种加密方式:

    1. 在Web.config中添加原始的配置,如:
    <machineKey validationKey="XXXXXX" decryptionKey="XXX" validation="SHA1" />
    
    1. 通过程序对web.config中的machineKey加密和解密 加密方式如下:
         Configuration config = WebConfigurationManager.OpenWebConfiguration("/");
         ConfigurationSection machineKeySection = config.GetSection("system.web/machineKey");
         machineKeySection.SectionInformation.ProtectSection("RSAProtectedConfigurationProvider");
         machineKeySection.SectionInformation.ForceSave = true;
         config.Save();
    

    解密方式如下:

         Configuration config = WebConfigurationManager.OpenWebConfiguration("/");
         ConfigurationSection machineKeySection = config.GetSection("system.web/machineKey");
         machineKeySection.SectionInformation.UnprotectSection();
         machineKeySection.SectionInformation.ForceSave = true;
    
    1. 通过程序加密就会得到类似:
        <machineKey configProtectionProvider="RsaProtectedConfigurationProvider">
            <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element" xmlns="http://www.w3.org/2001/04/xmlenc#">
                <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
            </EncryptedData>
        </machineKey>
    

    这样的配置,你只要把这段配置复制到各个需要SSO的站点的Web.config就可以了,系统在运行过程中会自动进行解密

  • 相关阅读:
    AtCoder Beginner Contest 167
    AtCoder Beginner Contest 166
    AtCoder Beginner Contest 165
    AtCoder Beginner Contest 164
    AtCoder Beginner Contest 163
    AtCoder Beginner Contest 162
    AtCoder Beginner Contest 161
    AtCoder Beginner Contest 160
    AtCoder Beginner Contest 159
    自定义Mybatis自动生成代码规则
  • 原文地址:https://www.cnblogs.com/zhoushiya/p/12107656.html
Copyright © 2011-2022 走看看