【问题标题】:New to Encryption with PHP, Direction Please?PHP 加密新手,请指导?
【发布时间】:2011-01-01 22:28:00
【问题描述】:

我正在制作一个接受信用卡号码的非常小的表单,该表单将在此后不久被清除。对于它们存在于数据库中的时间,我希望它们以舒适的加密状态存在。不幸的是,在我多年的网络开发、编程和数据库开发工作中,我从来没有机会在加密领域自学。

有没有比较容易实现的信用卡号加密方法,我可以快速实现?一组函数,类,任何可以完成工作并做得好的东西?我借此机会对这个问题进行自我教育,但由于时间敏感性,需要的不仅仅是朝着正确的方向轻推。

语言:PHP / 存储:MySQL

【问题讨论】:

  • 存储信用卡号码对我来说听起来并不是一个计划。用尽所有其他选项?
  • phpdeveloper,不幸的是,这是项目需要的。
  • 好奇——什么是“不久之后”?
  • 这不是你喜欢如何存储它们的问题,而是你如何存储它们的问题。查看 PCIDS 标准:en.wikipedia.org/wiki/… 以及附加的链接。

标签: php security encryption


【解决方案1】:

最好的方法之一是简单地使用 MySQL 进行加密/解密。查看这些函数:

http://dev.mysql.com/doc/refman/5.1/en/encryption-functions.html

但是,请记住,虽然这可以保护您免受可能找到读取您的数据库的人的侵害,但它不会保护您免受拥有服务器的人的侵害。那是因为解密密钥存在于服务器上。

总而言之,这是一个巨大的提升。真正的安全性来自公钥加密和使用安全私钥的离线解密(例如,不同的服务器)。


举个例子:

INSERT INTO BillingInfo 
SET CCard = AES_ENCRYPT('4111...', 'super-secret-key')
...

SELECT 
AES_DECRYPT(CCard, 'super-secret-key') 
...

具体功能记录在这里:
http://dev.mysql.com/doc/refman/5.1/en/encryption-functions.html#function_aes-encrypt

有关 AES 的更多信息,请参阅:
http://en.wikipedia.org/wiki/Advanced_Encryption_Standard


为了在您的环境中获得最大的安全性,我建议您将密钥存储在 PHP 常量中。以这种方式在运行时被泄露的可能性较小(次要细节)。

【讨论】:

  • 您对我应该采用哪种方法有什么建议吗?
  • 正如 bobince 所说,看看AES_ENCRYPT()。有关示例,请参阅问题的编辑。
  • 我希望“PHP 常量”是指 const 变量而不是硬编码键?因为使用硬编码键真的不是要走的路!!存储使用硬编码密钥加密的数据几乎和不加密一样糟糕。考虑一个体面的密钥管理解决方案。
  • @Henri:大多数 PHP 开发人员一开始甚至都不会考虑加密。存储在 PHP 文件中的密钥总比没有加密要好。但你的建议更好。你能详细说明那里的可能性吗?谢谢!
【解决方案2】:

它不那么“简单”,但是如果您的应用程序不需要读回存储的信用卡(即它们只能被系统的另一部分读取),您可以使用公钥加密来加密信息这样你自己的 webapp 就无法解密了。

这样,即使攻击者获得了对数据库和您的 web 应用程序自己的脚本的访问权限,他们仍然无法获得卡片数据。只有系统的其他卡处理部分(可能更容易受到攻击)才能解密它们。

您将从openssl_public_encrypt 函数开始。 example use

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-24
    • 1970-01-01
    • 2017-11-07
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    相关资源
    最近更新 更多