博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
配置文件——节点<machineKey>的作用,强随机生成
阅读量:6149 次
发布时间:2019-06-21

本文共 2189 字,大约阅读时间需要 7 分钟。

       <machineKey>这个节允许你设置用于加密数据和创建数字签名的服务器特定的密钥。ASP.NET自动使用它来保护表单验证Cookie,你也可以将它用于受保护的视图状态数据。同时,这个密钥还用于验证进程外的会话状态提供程序。

       如果你在使用Web集群并在多台计算机上运行同一个应用程序,如果对页面的请求由一台计算机处理,而页面回发又由另一台计算机处理,第二个服务器就不能解 密来自第一台服务器的视图状态和表单Cookie。这个问题之所以会发生,是因为两台服务器使用了不同的密钥。

       要解决这个问题,你必须显式的在machine.config文件中定义这个密钥:

       其中,validationKey 的值可以是48到128个字符长,强烈建议使用可用的最长密钥。decryptionKey 的值可以是16到48字符长,建议使用48字符长。

       自己去手动创建验证密钥和解密密钥并没有多大的意义。如果你这么做的话,它们可能随机性不足,这就可能允许某种类型的攻击。更好的办法是使用代码 和.NET加密类(System.Security.Cryptography 命名空间)生成随机密钥,代码如下:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
using 
System;
using 
System.Text;
using 
System.Security.Cryptography;
 
namespace 
Crypto
{
    
public 
class 
KeyCreator
    
{
        
/// <summary>
        
/// 生成machineKey密钥
        
/// </summary>
        
/// <param name="args"></param>
        
/// <remarks>
        
/// 参数:
        
/// 第一个参数是用于创建 decryptionKey 属性的字节数。
        
/// 第二个参数是用于创建 validationKey 属性的字节数。
        
/// 注意:所创建的十六进制字符串的大小是从命令行传入值的大小的两倍。例如,如果您为密钥指定 24 字节,则转换后相应的字符串长度为 48 字节。
        
/// decryptionKey 的有效值为 8 或 24。此属性将为数据加密标准 (DES) 创建一个 16 字节密钥,或者为三重 DES 创建一个 48 字节密钥。
        
/// validationKey 的有效值为 20 到 64。此属性将创建长度从 40 到 128 字节的密钥。
        
/// 代码的输出是一个完整的<machineKey>元素,您可以将其复制并粘贴到Machine.config文件中。
        
/// </remarks>
        
public 
static 
void 
Main(String[] args)
        
{
            
String[] commandLineArgs = System.Environment.GetCommandLineArgs();
            
string 
decryptionKey = CreateKey(System.Convert.ToInt32(commandLineArgs[1]));
            
string 
validationKey = CreateKey(System.Convert.ToInt32(commandLineArgs[2]));
 
            
Console.WriteLine(
"<machineKey validationKey=\"{0}\" decryptionKey=\"{1}\" validation=\"SHA1\"/>"
, validationKey, decryptionKey);
        
}
 
        
static 
String CreateKey(
int 
numBytes)
        
{
            
RNGCryptoServiceProvider rng = 
new 
RNGCryptoServiceProvider();
            
byte
[] buff = 
new 
byte
[numBytes];
 
            
rng.GetBytes(buff);
            
return 
BytesToHexString(buff);
        
}
 
        
static 
String BytesToHexString(
byte
[] bytes)
        
{
            
StringBuilder hexString = 
new 
StringBuilder(64);
 
            
for 
(
int 
counter = 0; counter < bytes.Length; counter++)
            
{
                
hexString.Append(String.Format(
"{0:X2}"
, bytes[counter]));
            
}
            
return 
hexString.ToString();
        
}
    
}
}

 

 使用这个方法可以创建需要的密钥,然后可以复制这些信息并粘贴配置文件文件中,这要比手工创建密钥更安全,更便捷。

另外可以使用工具生成:

转载于:https://www.cnblogs.com/webenh/p/7500078.html

你可能感兴趣的文章
JavaScript面向对象编程深入分析(2)
查看>>
linux 编码转换
查看>>
POJ-2287 Tian Ji -- The Horse Racing 贪心规则在动态规划中的应用 Or 纯贪心
查看>>
Windows8/Silverlight/WPF/WP7/HTML5周学习导读(1月7日-1月14日)
查看>>
关于C#导出 文本文件
查看>>
使用native 查询时,对特殊字符的处理。
查看>>
maclean liu的oracle学习经历--长篇连载
查看>>
ECSHOP调用指定分类的文章列表
查看>>
分享:动态库的链接和链接选项-L,-rpath-link,-rpath
查看>>
Javascript一些小细节
查看>>
禁用ViewState
查看>>
Android图片压缩(质量压缩和尺寸压缩)
查看>>
nilfs (a continuent snapshot file system) used with PostgreSQL
查看>>
【SICP练习】150 练习4.6
查看>>
HTTP缓存应用
查看>>
KubeEdge向左,K3S向右
查看>>
DTCC2013:基于网络监听数据库安全审计
查看>>
CCNA考试要点大搜集(二)
查看>>
ajax查询数据库时数据无法更新的问题
查看>>
Kickstart 无人职守安装,终于搞定了。
查看>>