我正在使用C#和.Net 4.6编写Windows服务。对服务进行配置,使其在运行和执行某些任务之前通过休眠一段可配置的时间来永久运行。作为初始启动的一部分,该服务将运行并获取连接字符串列表,以便它可以连接到数据库服务器列表并收集一些信息。我希望能够将连接字符串保留在内存中。这个想法是服务在启动时获取连接字符串并将其保存在内存中,直到服务停止为止。下次启动时,它将再次捕获它们。这使我无法对连接字符串进行加密,因为其中一些可能包含用户名/密码组合。
因此,我尝试创建一个类来存储此信息,并使用get和set属性动态处理连接字符串的加密/解密。
注意:我已经将字节数组的长度硬编码为1024,但是应该可以将其动态调整为最接近的16。
using System;
using System.Text;
using System.Security.Cryptography;
namespace XXXXXXX.DB
{
public class Instance
{
private byte[] _connectionString = new byte[1024];
System.Text.ASCIIEncoding ae = new ASCIIEncoding();
public string Name { get; set; }
public string ConnectionString
{
set
{
if (value.Length < _connectionString.Length)
value = value.PadRight(_connectionString.Length, ' ');
else
value = value.Substring(0, _connectionString.Length);
_connectionString = ae.GetBytes(value);
ProtectedMemory.Protect(_connectionString, MemoryProtectionScope.SameProcess);
}
get
{
ProtectedMemory.Unprotect(_connectionString, MemoryProtectionScope.SameProcess);
return ae.GetString(_connectionString).Trim();
}
}
}
因此,我在Instance对象上设置了ConnectionString属性,并且按我的期望对它进行了加密。但是当我访问未加密的ConnectionString时,结果仍然是加密的:
using (SqlConnection connection = new SqlConnection(_theInstance.ConnectionString))
我认为这是一个事实,即ConnectionString的私有成员变量是一个字节数组,它是一种引用类型?老实说,我对此有点挠头。
请注意:我看过很多例子,这些例子制作了一个简单的控制台应用,并以相同的方法进行了加密和未加密操作,但是我可以这样做吗?干嘛?