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