代码之家  ›  专栏  ›  技术社区  ›  Sampson

不熟悉用php加密,请教方向?

  •  3
  • Sampson  · 技术社区  · 14 年前

    我正在做一个非常小的表格,接受信用卡号码,这将很快被清除。当它们存在于数据库中时,我希望它们以舒适的加密状态存在。不幸的是,在我多年的网络开发、编程和数据库开发工作中,我从未有过在加密领域接受教育的机会。

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

    语言:php/storage:mysql

    2 回复  |  直到 14 年前
        1
  •  4
  •   gahooa    14 年前

    最好的方法之一就是简单地使用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常量中。它不太可能在运行时那样被泄露(小细节)。

        2
  •  0
  •   bobince    14 年前

    这不太容易,但是如果您的应用程序不需要读取存储的信用卡(即,它们只被系统的另一部分读取),您可以使用公钥加密来加密信息,这样您自己的webapp就无法对其进行解密。

    这样,即使攻击者获得了对数据库和webapp自己脚本的访问权,他们仍然无法获得卡片数据。只有系统的另一个卡处理部分(可能更容易被锁定以抵御攻击)才能解密它们。

    你应该从 openssl_public_encrypt 功能。 example use