我正在更新一个C#项目以使其更加安全(我对它有非常严格的要求(。其中一个要求是保护内存中的一些数据,以防止"未经授权"访问。我做了研究,最终得到了"ProtectedMemory.protect"。我不是C#专家,所以我不确定做得对不对。我如何实现它的一个简化示例:
public class User
{
public string Name
{
get
{
return Encoding.UTF8.GetString(ProtectedMemory.Unprotect(_name, MemoryProtectionScope.SameLogon));
}
set
{
_name = Encoding.UTF8.GetBytes(value);
ProtectedMemory.Protect(_name, MemoryProtectionScope.SameLogon);
}
}
private byte[] _name;
}
这有道理吗?:D
将受保护的内存从私有支持字段移动到属性将没有帮助,因为现在只需要读取公共属性,并且ProtectedMemory类保护的内存可以由注入程序集中并在进程中运行的任何应用程序读取,有很多方法可以做到这一点!
我想这就是为什么MS在新的框架中停止使用安全字符串和ProtectedMemory的原因,因为它对熟练的攻击者或使用正确工具的傻瓜来说真的没有多大区别。。。
还有什么。。。需要注意的一点是,你需要尽快清理任何包含GDPR相关数据的内存,因为你可以使用堆检查来查找机密数据。
基本上,你需要做的是使用加密,只在需要时访问数据,不需要时立即清除。
至于你的问题,这里有一种方法,我使用我的Walter.Cypher nuget包来解决它。我用你的课添加了一份沙拉,并认为你想通过";填充密码";。
using System;
using System.Text;
public class User
{
public User(int id, string name)
{
Id = id;
_name = name.Encrypt(
string.Concat(Id, "APPLICAT10N PA$$wo0rd").AsShaHash(HashMethod.SHA1, 8) //use a salt based key protect the user and the application
, Walter.Cypher.CipherMethod.Medium //use a 365 bit hash
);
}
public int Id { get; }
private byte[] _name;
internal string GetName()
{
return _name.Decrypt(
string.Concat(Id, "APPLICAT10N PA$$wo0rd").AsShaHash(HashMethod.SHA1, 8) //use a salt based key protect the user and the application
, Walter.Cypher.CipherMethod.Medium //use a 365 bit hash
);
}
}
public class UserViewModel : IDisposable
{
User _user;
private Lazy<string> _userName;
private bool _disposedValue;
public UserViewModel(User user)
{
_user = user;
_userName =new Lazy<string>(_user.GetName());
}
public string Name
{
get => _userName.Value;
}
protected virtual void Dispose(bool disposing)
{
if (!_disposedValue)
{
if (disposing)
{
//do what you need to do
}
_userName = null;
_disposedValue = true;
}
}
~UserViewModel()
{
Dispose(disposing: false);
}
public void Dispose()
{
Dispose(disposing: true);
GC.SuppressFinalize(this);
}
}
此代码将在所有平台上工作,因为它不依赖于任何窗口API,而是非对称加密。
每当你觉得有必要使用某个属性来存储机密数据时,请确保你明白这是一个安全问题。
如果您正在使用ASP.NET Core应用程序,请查看数据保护:https://learn.microsoft.com/en-us/aspnet/core/security/data-protection/using-data-protection?view=aspnetcore-3.1
以下内容已被弃用。谢谢你指出这一点
否则,如果允许您使用不安全的代码,请在此处签出
SecureString