我正在开发我的第一个安全购物网站。我们不存储信用卡数据,所以这不是问题。但是,我们的支付网关(authorize.net)有一个交易密钥和API登录密钥,我宁愿将其保存在数据库中,而不是硬编码到我的PHP中。我不知道我们需要巨大的安全性,但我宁愿不以纯文本形式存储它。我知道沙,但这是单向的。我需要一种方法以半安全格式将值存储在数据库中,但是然后能够以编程方式“解密”它以便在我的函数中使用。
另一个警告是我的网站是托管的,这意味着我可以安装什么样的东西有一个非常严格的限制,所以理想情况下任何解决方案都会依赖于标准php安装中包含的东西。
有人能指出我正确的方向吗?我对保护数据非常陌生。
编辑添加:我检查了我的主机并安装了mcrypt。这是正确的方向吗?
答案 0 :(得分:2)
MCrypt可以成为你的朋友。但是,您需要考虑的是,每个公开可用(且有用)的加密方法都需要密钥。如果AES加密或3DES加密在加密过程中不需要密钥,那么破解加密只需要尝试每种标准的解密方法,直到获得有意义的结果。因此,存储支付网关的密钥会产生与存储加密密钥完全相同的风险。无论你想要添加多少层加密,在某种程度上都必须有一个以纯文本形式存储的密钥,通常硬编码到PHP中,并且通常在包含的config.php
文件中,以便于改变未来。
安全存储信息而不需要密钥的唯一选择是创建自己的加密方法。这种方法的安全性完全在于没有人知道你加密字符串的方法,所以他们没有逐步向后走的模式。但是,如果您曾告诉别人您的加密工作如何,那么安全性就会被取消。此外,有许多算法可以打破简单的加密(例如,字母替换)。这就是数学家为开发像AES这样的东西获得大量资金的原因。
您最好的方法是调查MCrypt Encrypt和MCrypt Decrypt。这样,如果您的PHP被泄露,那么他们就知道您用于加密的密钥,但他们没有数据。如果只是数据库被泄露,那么他们拥有数据,但不是您用来加密数据的密钥。如果两者都受到损害,那你就搞砸了。但如果两者都受到损害,无论你做什么都会被搞砸,所以这是一条相当安全的路线。
答案 1 :(得分:0)
嗯,你可以试试AES加密。问题是你必须在PHP中的某处保存salt hash(98sdfx9c6v5c)。
插入配置:
INSERT INTO config (secret_key) VALUES (AES_ENCRYPT('secret api key','98sdfx9c6v5c'));
选择配置:
SELECT AES_DECRYPT(secret_key,'98sdfx9c6v5c') AS secret_url FROM config
答案 2 :(得分:-2)
从安全角度来看,将它存储在php文件或数据库中没有区别,如果有人可以访问你的php文件,他也可以访问数据库。
使用mcrypt并不意味着你会有更多的安全性(如果他们可以读取你的php文件,他们也可以读取密钥)所以......
如果我是你,我会将API密钥以纯文本形式存储在Web服务器目录之外的文件中。
只要写出好的代码就可以了。