使用SecureString来存储信用卡号码

5

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


1
更好的问题是:System.SecureString对于这个应用程序是否足够安全? - JSBձոգչ
@JSBangs:根据我的理解,System.SecureString专门用于此目的。然而,由于.NET框架中许多其他API仍使用普通的System.String类,因此在整个应用程序中维护字符串的安全性是困难的。我想我的问题真正的是:是否值得努力在内存中端到端地保护数据,或者在API中存在太多不支持这种方式的漏洞,以至于真正的安全性无法实现? - DCNYAM
4个回答

9
PCI-DSS的角度来看,仅存储在内存中的卡号无需保护。
PCI仅要求加密存储到磁盘或通过网络传输的卡号。这是对该问题的一种常识性处理方式。使用SecureString可以确保字符串永远不会被缓存到磁盘上,但正如您所说,使用起来很麻烦。然而,这篇文章提供了一些好的建议:https://stackoverflow.com/questions/122784/hidden-net-base-class-library-classes#123141 理论上来说,保护内存似乎会增加安全性,但实际上,如果坏人能够访问RAM,则游戏已经结束了。

PCI要求是在这里寻找答案的正确位置^^ - cRichter

2
2010年接受的答案可能在当时是正确的,但请注意PCI DSS 3.0第6.5节的规定:
培训开发人员掌握安全编码技术,包括如何避免常见的编码漏洞,并了解敏感数据在内存中的处理方式。最终目标是遵循行业最佳实践。
鉴于近年来备受关注的大规模数据泄露事件,攻击者通过恶意软件等手段获取敏感数据(包括信用卡信息)的情况时有发生,更多的关注点被放在了保护敏感信息的安全性上,即使是在内存中也要做到如此。
尽可能使用SecureString。
如果不可能,则只能了解你需要面对的挑战。由于字符串是不可变的,垃圾回收并不总是可靠的,因此你必须使用现有的方法。我读到的一个方法是将字符串转换为BSTR,将其复制到固定的字符串中,在使用后两者都被清零。这个方法可能有些“hacky”,但总比完全不做好。
如果在Winform应用程序中纯粹进行信用卡号码捕获,则将卡号保持在内存中是可行的。但是,在ASP.NET Web应用程序中,我不确定...虽然我没有尝试过,但SO上的普遍共识似乎不值得。此外,MSDN特别提到了ASP.NET应用程序,如下所述:

在ASP.NET应用程序中使用SecureString类不太合适。不可能从包含敏感数据(例如信用卡号码)的Web页面中提取数据并将其放入SecureString中,而不经过中间System.String对象

你可能已经完成了你的项目,但希望这能帮助其他人。

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
这将违背初衷。一旦你转换为或从System.String转换,它就不再安全。 - Hans Passant
@Hans--我相信我在我的回答的第二段解决了那个缺点。 - Toby

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接