C# 为可能包含“安全”数据的任何字符串转换为SecureString或从SecureString转换为SecureString的解决方案
代码分析工具Fortify将代码中包含潜在安全数据的某些字符串变量标记为易受堆检查攻击,因为.NET处理字符串的方式以及建议转换为SecureString的方式 据我所知,处理安全字符串的最佳方法是使用字节[],与字符串不同,字节[]在超出范围时会被清除。问题是您必须为byte[]实现任何字符串类型的方法,如replace等 除了使用byte[]和滚动我自己的字符串方法,还有什么替代方法呢?你能不能不使用它 从上面的链接C# 为可能包含“安全”数据的任何字符串转换为SecureString或从SecureString转换为SecureString的解决方案,c#,wcf,security,dynamics-crm-2011,C#,Wcf,Security,Dynamics Crm 2011,代码分析工具Fortify将代码中包含潜在安全数据的某些字符串变量标记为易受堆检查攻击,因为.NET处理字符串的方式以及建议转换为SecureString的方式 据我所知,处理安全字符串的最佳方法是使用字节[],与字符串不同,字节[]在超出范围时会被清除。问题是您必须为byte[]实现任何字符串类型的方法,如replace等 除了使用byte[]和滚动我自己的字符串方法,还有什么替代方法呢?你能不能不使用它 从上面的链接 使用System.Runtime.InteropServices.Mars
使用System.Runtime.InteropServices.Marshal类的适当成员,例如SecureStringToBSTR方法,操作SecureString对象的值。当敏感信息(您确认该信息在您的案例中是敏感的)作为未加密的明文存储在内存中时,应用程序容易受到堆检查的攻击 如果攻击者将执行内存转储记住Heartbleed bug?,则此敏感信息将被泄露 保存此类敏感信息有两种合适的方法: 使用受保护的对象,例如GuardString而不是String或char数组,或者 加密信息并立即清除包含明文的内存
建议您使用以下方法之一安全保存您的敏感信息。老实说,这只是一个简单的想法。SecureString并不总是安全的,我的意思是,只有当您不将值取出并将其作为纯文本分配给另一个字符串时,它才是安全的!所以当我们不再需要这个字符串时,我们应该尽快清除内存!大概是这样的: 个人代码:
public void ValidationUserInfo(string userName,string password)
{
//Do validations with password, after converting it to secureString and fetch it out?....
//Just clear the memory!
ClearSensiveString(password);
//Do any others or return after validations.....
}
//Your memory clear way:
static unsafe void ClearSensiveString(string sensiveValue,char coverChar='\0')
{
fixed(char* c = sensiveValue)
{
for (int i = 0; i < sensiveValue.Length; i++)
{
c[i] = coverChar;
}
}
}
securestring的可伸缩性非常差,实际上并不完整,因为一旦调用“ToUnsecureString”,就会出现与从方法返回的结果字符串相同的堆检查问题。好的-我将很快将其作为答案删除,但对于我的信息,请使用“可伸缩性差”,你的意思是它没有用,因为一旦你尝试实际使用存储的字符串,它就不再安全了,显然你会在某个时候这样做吗?请留下你的答案,也许ToBSTR会有所帮助