我想在一些Setting.cs(以及静态类)文件中存储一些机密值(例如数据库连接字符串,一些密码)。
是否100%确定,IIS 7不以纯文本格式提供此文件? 或者有任何已知的漏洞吗?
答案 0 :(得分:7)
答案 1 :(得分:3)
httpforbiddenhandler
。对于.cs,添加了以下行(.NET 4.0是我从中获取的版本):
<add path="*.cs" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
修改的:
您还可以使用自定义编写的 ProtectedConfigurationProvider 来为您的连接字符串添加更多保护。
答案 2 :(得分:2)
加密的web.config是获得最大安全性的方法......
即使您对程序集进行模糊处理,仍可能会找到这些值。如果你控制自己的网络服务器并且没有其他人可以访问,那么它们在代码和配置中都是安全的,但是例如在共享托管环境中,域管理器自动具有访问权限,您依赖于其他用户无法访问的安全规则。
特别要确保您不要在Silverlight项目中执行此操作,因为它会直接下载到客户端,并且可以使用Reflector等工具轻松读取。
答案 3 :(得分:0)
我建议不要硬编码连接字符串。 IIS不会为它们提供服务,在ASP.NET中注册的显式处理程序将阻止提供源代码文件。
您是否可以使用加密的web.config文件?
答案 4 :(得分:0)
添加ClassLibrary以加密和解密您的连接信息。 这是我的密码学服务代码。使用您的连接设置加密
System.Security.Cryptography下的;命名空间
public class TripleDes
{
readonly byte[] _key = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 };
readonly byte[] _iv = { 8, 7, 6, 5, 4, 3, 2, 1 };
// define the triple des provider
private readonly TripleDESCryptoServiceProvider _mDes = new TripleDESCryptoServiceProvider();
// define the string handler
private readonly UTF8Encoding _mUtf8 = new UTF8Encoding();
// define the local property arrays
private readonly byte[] _mKey;
private readonly byte[] _mIv;
/// <summary>
/// Default constructor
/// </summary>
public TripleDes()
{
_mKey = _key;
_mIv = _iv;
}
/// <summary>
/// Parameterized constructor
/// </summary>
/// <param name="key"></param>
/// <param name="iv"></param>
public TripleDes(byte[] key, byte[] iv)
{
_mKey = key;
_mIv = iv;
}
/// <summary>
/// Encrypts the given byte array input
/// </summary>
/// <param name="input">Input value</param>
/// <returns>Encrypted result</returns>
public byte[] Encrypt(byte[] input)
{
return Transform(input, _mDes.CreateEncryptor(_mKey, _mIv));
}
/// <summary>
/// Decrypts the given encrypted byte array input
/// </summary>
/// <param name="input">Encrypted byte array input</param>
/// <returns>Decrypted result</returns>
public byte[] Decrypt(byte[] input)
{
return Transform(input, _mDes.CreateDecryptor(_mKey, _mIv));
}
/// <summary>
/// Encrypts the given string input
/// </summary>
/// <param name="text">Input value</param>
/// <returns>Encrypted result</returns>
public string Encrypt(string text)
{
byte[] input = _mUtf8.GetBytes(text);
byte[] output = Transform(input, _mDes.CreateEncryptor(_mKey, _mIv));
return Convert.ToBase64String(output);
}
/// <summary>
/// Decrypts the given encrypted string input
/// </summary>
/// <param name="text">Encrypted string input</param>
/// <returns>Decrypted result</returns>
public string Decrypt(string text)
{
byte[] input = Convert.FromBase64String(text);
byte[] output = Transform(input, _mDes.CreateDecryptor(_mKey, _mIv));
return _mUtf8.GetString(output);
}
private static byte[] Transform(byte[] input, ICryptoTransform cryptoTransform)
{
// create the necessary streams
using (MemoryStream memStream = new MemoryStream())
{
using (CryptoStream cryptStream = new CryptoStream(memStream, cryptoTransform, CryptoStreamMode.Write))
{
// transform the bytes as requested
cryptStream.Write(input, 0, input.Length);
cryptStream.FlushFinalBlock();
// Read the memory stream andconvert it back into byte array
memStream.Position = 0;
byte[] result = memStream.ToArray();
// close and release the streams
memStream.Close();
cryptStream.Close();
// hand back the encrypted buffer
return result;
}
}
}
}
答案 5 :(得分:0)
IIS不会以纯文本形式提供您提到的文件。 (除非您专门配置它来执行此操作。)
因此,只要IIS使用的文件是安全的,您的秘密也是安全的。 (并且在.cs文件中存储秘密是微不足道的安全,但使用配置文件显然更复杂。 - 所以我更喜欢使用配置文件)
但无论如何我会推荐Encrypting Configuration Information Using Protected Configuration。