是否有最好的信用卡加密 .NET 算法?
-
09-06-2019 - |
题
互联网 System.Security.Cryptography
命名空间有一个相当令人困惑的算法集合,我可以使用它们来加密信用卡详细信息。哪个是最好的?
对于相对较短的字符串来说,它显然需要安全。
编辑:我在英国,据我所知,只要不存储三位数的 CVV 号码,我们就可以存储加密的信用卡详细信息。并感谢大家的精彩回应。
解决方案
无意冒犯,但这个问题有点“误导”。不存在“银弹”解决方案。我建议阅读一般的密码学知识,然后进行一些威胁建模。您应该问自己一些问题(绝不是全面的列表):
- 进行加密的模块是否需要解密它(在这种情况下使用对称加密),或者它将数据发送到将使用它的其他模块(在另一台机器上)(在这种情况下,您应该考虑公钥)加密)
- 您想防范什么?有人访问数据库但没有源代码(在这种情况下,您可以将加密密钥直接硬编码到源代码中)?有人嗅探您的本地网络(您应该考虑像 IPSec 这样的透明解决方案)?有人窃取您的服务器(即使在数据中心也可能发生 - 在这种情况下应考虑全磁盘加密)?
- 您真的需要保留数据吗?不能直接传给信用卡处理机构,得到确认后抹掉吗?不能将其存储在客户端本地的 cookie 或 Flash LSO 中吗?如果将其存储在客户端,请确保在将其放入 cookie 之前在服务器端对其进行加密。另外,如果您使用 cookie,请确保将它们设置为仅 http。
- 比较数据的相等性(即客户给我的数据与我拥有的数据相同)是否足够?如果是这样,请考虑存储它的哈希值。由于信用卡号码相对较短并且使用较少的符号集,因此在散列之前应为每个信用卡号码生成唯一的盐。
稍后编辑: :请注意,同一类别的标准加密算法(例如 3DES 和 AES - 都是对称分组密码)具有相当的强度。大多数(商业)系统之所以被破坏,并不是因为有人暴力破解了他们的加密,而是因为他们的威胁模型不够详细(或者说他们根本没有任何威胁模型)。例如,您可以加密所有数据,但如果您碰巧有一个容易受到 SQL 注入攻击的面向公众的 Web 界面,那么它对您没有多大帮助。
其他提示
没关系。
完整的卡号绝对不能接触磁盘。
重要的是授权码。
对于跟踪等,您将仅使用最后 4 位数字 xxxx xxxx xxxx 1234 和到期日期。
如果您要存储卡号,则收单银行将强制选择加密方式。
除非你是收购者,在这种情况下,你应该询问一位老unix程序员/db2人员。
“你不能将其存储在客户端本地的 cookie 中吗” <-- 永远不会
我想补充一点,你只是简单地不应该存储它们,除非你有一个非常好的理由,并且将它们存储在 cookie 中是一种 真的 坏主意 - 他们只是 太容易了 获取(如果有人窃取 cookie 会发生什么 - 那么它的加密程度并不重要)。
如果您需要重复付款,大多数 CC 提供商都会提供一种方法,通过存储初始付款中的某种令牌来实现此目的,而根本不保留卡号(您可以只保留最后 4 位数字以向客户显示)以便他们知道存储的是哪张卡)。
真的,只是不要这样做!
另外,您永远不应该保留 CCV 代码。
按照 PCI数据安全标准 合规性规则,任何行业领先的加密标准就足够了。因此,具有 256 位密钥的 3DES 就足够了(尽管可以使用其他标准)。看一下这个 http://pcianswers.com/2006/08/09/methods-of-encrypting-data/
不要忘记这里的诚信。当攻击者不知道密钥但可以操纵密文时,就会出现针对开箱即用加密的伪造攻击。在以下情况下,这些可能会特别令人讨厌:
- 加密短字符串,
- 具有已知子串
信用卡的情况正是如此。因此,在 CBC 模式下使用 System.Security.Cryptography AES 或 3DES 而不滚动自己的校验和可能会很危险。读:没有密钥的攻击者有可能将一个信用卡号码替换为另一个信用卡号码。
如果您使用第三方支付网关,则无需存储号码。
无关紧要。
3des 非常好,将盐存储在旁边,并将标准密钥保存在数据库或配置文件之外的某个位置。这样,如果你被破解,他们就无法解密。
还有法律方面需要考虑。我不知道其他地方的情况,但在德国,你根本不允许存储信用卡号码1). 时期。 是否加密它们以及以什么格式存储它们并不重要。
所有的你 可能 所做的(这里我凭记忆指的是,没有任何司法知识)是存储信用卡号的强哈希值(SHA-256?)以及最后四位数字和帐号。是的,仅根据这些信息重建完整的数字是微不足道的。法律并不总是合乎逻辑的。
1) 除非您是联邦认证的信用卡机构。
暗示: 您应该调查存储信用卡号码是否合法。例如,在瑞典,您必须获得以下认证: PCI(支付卡行业), ,您的内部和外部安全性将受到测试(很长一段时间还有很多其他事情)。
在存储信用卡信息之前,您应该三思而后行,因为错误的法律费用可能会很高。
使用公钥加密信用卡。仅将私钥提供给支付处理机。然后,支付处理器机器可以查询数据库并完成工作,其他人,甚至添加条目的机器,都无法解密它。
类似于 PHP 的 openssl_seal,不过如果您想要的话,也许可以使用不同的算法。