使用SecureString作为信用卡号码

时间:2010-07-22 19:55:15

标签: .net credit-card securestring

我一直在研究使用System.Security.SecureString类在处理内存时将信用卡号保存在内存中。有没有人使用SecureString类来保存信用卡号,或者大多数只使用普通的System.String类?

4 个答案:

答案 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