我一直在研究使用System.Security.SecureString类在处理内存时将信用卡号保存在内存中。有没有人使用SecureString类来保存信用卡号,或者大多数只使用普通的System.String类?
答案 0 :(得分:9)
答案 1 :(得分:2)
以前在2010年接受的答案可能在当时是正确的,但请注意PCI DSS 3.0第6.5节,其中说明:
培训开发人员采用安全编码技术,包括如何避免 常见的编码漏洞,以及了解敏感数据的方式 在记忆中处理。
最终是坚持行业最佳实践。
鉴于近年来高调的漏洞,敏感数据(包括信用卡信息)被恶意软件,攻击者等抓取内存,更多的重点是保护敏感信息,即使在内存中也是如此。 / p>
尽可能使用SecureString。
在不可能的地方,只要了解你的反对意见。由于字符串是不可变的,并且始终不能依赖垃圾收集,因此您只需使用您所拥有的内容即可。我读过的一种方法是将字符串转换为BSTR,将其复制到固定字符串中,然后BSTR和固定字符串在使用后归零。感觉有点“hacky”,但它比什么都不做要好。
如果完全在winform应用程序中捕获信用卡号码,那么将卡号保存在内存中是非常可行的。
但是,对于一个ASP.NET网络应用程序,我不确定...我还没有尝试过,但是general consensus对SO来说似乎不值得它。此外,MSDN具体提到了ASP.NET应用程序:
在ASP.NET中使用SecureString类不太合适 应用。您不太可能从网页中提取数据 包含敏感数据(如信用卡号)和地点 它在SecureString中没有它已经通过 中间系统。字符串对象
你可能已经完成了你的项目,但希望这会有助于其他人。
答案 2 :(得分:1)
我将SecureString用于其他东西(不是信用卡),如果它将在内存中缓存很长时间。
我遇到的问题是你仍然需要将它编组为一个普通的字符串,以便实际使用它,所以它的实用性非常有限。
我已经创建了一些扩展方法来简化它们的使用:
public static unsafe SecureString Secure(this string source)
{
if (source == null)
return null;
if (source.Length == 0)
return new SecureString();
fixed (char* pChars = source.ToCharArray())
{
SecureString secured = new SecureString(pChars, source.Length);
return secured;
}
}
public static string Unsecure(this SecureString source)
{
if (source == null)
return null;
IntPtr bstr = Marshal.SecureStringToBSTR(source);
try
{
return Marshal.PtrToStringUni(bstr);
}
finally
{
Marshal.ZeroFreeBSTR(bstr);
}
}
答案 3 :(得分:0)
不要使用securestring。 PG正在弃用它。观看视频,他们用它概述了无数的安全问题。 https://github.com/dotnet/apireviews/tree/master/2015-07-14-securestring。