我将实现一个PHP/mySQL
设置,用于存储信用卡信息。
看起来AES_ENCRYPT/AES_DECRYPT
是正确的选择,
但我还有一个困惑:
如何保护加密密钥的安全?
将其硬编码到我的PHP脚本中(这些脚本将与数据库位于同一台服务器上)似乎会造成重大安全漏洞。
在这里,有什么最佳实践解决方案吗?
你应该认真思考是否确实需要保留信用卡号。如果没有充分的理由,请不要保留!每隔一周就会听到某些公司被攻击并且信用卡号被盗。这些公司都犯了一个致命的错误——他们保留了太多信息。在交易完成前保留信用卡号,交易完成后删除它。
至于保护服务器,最好的方法是保护硬件,并使用内部系统套接字连接到MySQL,并确保阻止任何对MySQL服务器的网络访问。确保您同时使用系统权限和MySQL权限来允许尽可能少的访问权限。对于某些脚本,您可以考虑使用只写身份验证。实际上没有加密方法是万无一失的(因为您总是需要解密,因此必须存储密钥)。这并不是说您不应该这样做——您可以将密钥存储在一个位置,并在检测到系统被攻击时销毁文件,从而使数据无效。
将数据库文件放在计算机外,比如外部硬盘,并将其放在安全的地方。这仅适用于您只能在放置此外部驱动器的位置开发此项目的情况下 :) 或者,您可以使用文件系统加密工具来保护这些文件,例如https://itsfoss.com/password-protect-folder-linux/
在生产环境中,我同意Kyle Cronin的观点。
我同意,但如果你不需要cc的话就不要使用。但如果你真的需要,确保拥有它的文件不可在Web上访问。你可以编写一个返回密钥的二进制文件,这样它就不会以明文形式存储。但是,如果你的服务器被攻击,仍然很容易获取它。
您需要的安全性取决于您的应用程序。例如,如果仅在用户登录时使用cc#(如在线商店类型场景),则可以使用用户明文密码的哈希值,每个用户的salt和专用cc# salt加密cc#。不要永久存储此值。
由于您没有存储此值,因此您可以获取此值的唯一时间是用户输入其密码以登录时。只需确保您有良好的会话过期和垃圾收集策略即可。
如果此情况不适用于您,请更详细地描述您的情况,以便我们提供更合适的答案。