PHP中的双向加密-需要一些指导吗

PHP中的双向加密-需要一些指导吗,php,mysql,hash,Php,Mysql,Hash,我正在开发我的第一个安全购物网站。我们没有存储信用卡数据,所以这不是问题。然而,我们的支付网关(authorize.net)确实有一个事务密钥和API登录密钥,我更愿意将其保存在数据库中,而不是硬编码到我的php中。我不知道我们需要极大的安全性,但我宁愿不存储在纯文本中。我知道沙,但那是单向的。我需要一种方法将值以半安全的格式存储在数据库中,然后能够通过编程对其进行“解密”,以便在我的函数中使用 另外一个警告是,我的站点是托管的,这意味着我可以安装的内容有非常严格的限制,因此理想情况下,任何解决

我正在开发我的第一个安全购物网站。我们没有存储信用卡数据,所以这不是问题。然而,我们的支付网关(authorize.net)确实有一个事务密钥和API登录密钥,我更愿意将其保存在数据库中,而不是硬编码到我的php中。我不知道我们需要极大的安全性,但我宁愿不存储在纯文本中。我知道沙,但那是单向的。我需要一种方法将值以半安全的格式存储在数据库中,然后能够通过编程对其进行“解密”,以便在我的函数中使用

另外一个警告是,我的站点是托管的,这意味着我可以安装的内容有非常严格的限制,因此理想情况下,任何解决方案都将依赖于标准php安装中包含的内容

谁能给我指出正确的方向吗?我对保护数据非常陌生


编辑添加:我与我的主机进行了检查,并安装了mcrypt。这是正确的方向吗?

从安全角度来看,将其存储在php文件或数据库中没有区别,如果有人可以访问您的php文件,他也可以访问数据库

使用mcrypt并不意味着你会有更多的安全性(如果他们可以读取你的php文件,他们也可以读取密钥),所以

如果我是你,我会将API密钥以纯文本形式存储在web服务器目录之外的文件中


只要编写好代码就可以了。

嗯,你可以试试AES加密。问题是您必须将salt散列(98sdfx9c6v5c)保存在PHP中的某个位置

插入配置:

INSERT INTO config (secret_key) VALUES (AES_ENCRYPT('secret api key','98sdfx9c6v5c'));
选择配置:

SELECT AES_DECRYPT(secret_key,'98sdfx9c6v5c') AS secret_url FROM config

MCrypt可以成为你的朋友。不过,您需要考虑的是,每一种公开可用(且有用)的加密方法都需要一个密钥。如果AES加密或3DES加密在加密过程中不需要密钥,那么破坏加密只需尝试每种标准解密方法,直到获得有意义的结果。因此,存储支付网关的密钥会产生与存储加密密钥完全相同的风险。无论您要添加多少层加密,在某种程度上,都必须有一个以明文形式存储的密钥,通常硬编码到PHP中,并且通常包含在一个
config.PHP
文件中,以便于将来更改

安全存储信息而不需要密钥的唯一选择是发明自己的加密方法。此方法的安全性仅在于,没有人知道加密字符串的方法,因此他们没有一个循序渐进的模式,只能向后走。但是,如果你告诉某人你的加密是如何工作的,那么安全性将被没收。此外,有许多算法方法可以破解简单的加密(例如,字母替换)。这就是为什么数学家们会因为开发AES之类的东西而得到很多钱


你最好的办法是调查和调查。这样,如果只有你的PHP被破坏,那么他们知道你用来加密的密钥,但是他们没有数据。如果只是数据库被破坏,那么他们有数据,但没有你用来加密它的密钥。如果双方都妥协了,你就完蛋了。但是,如果两者都受到威胁,无论你做什么,你都会倒霉,因此这是一条相当安全的路线。

我们不会将其存储在数据库中以确保安全;我们这样做是为了编写一个前端,允许非编码人员在必要时更改值。也就是说,我们不希望它存储在纯文本中。再说一次,这个网站是云托管的;我们无法访问给定web服务器空间之外的目录。实际上,您应该始终假定远程服务器的不同组件存在单独的安全风险。通过SQL注入或简单的错误查询,可以在不影响PHP代码的情况下返回数据库的行。这就是为什么你总是散列密码-以防有人得到你的数据库。盐是为了防止彩虹表攻击而发明的,就像mcrypt密钥一样——如果有人得到了盐,他们可以绕过它,仍然使用彩虹表。我不明白为什么人们会对我说的话投反对票,如果你相信通过散列它你会更安全,那就做吧,这不会改变任何事情。要处理这种安全性,您应该有一个非常不同的基础设施,您存储的是一个API密钥,您将使用哈希和普通txt代码获得相同的“安全性”。在哪里存储数据库连接文件:p?您应该很好地检查允许API密钥执行的操作。我的意思是,该API密钥必须只能从定义的IP等执行某些操作。假设您将API密钥存储在数据库中,并且有人使用以下理论SQL注入:
”--GET*from API_KEY
。现在他们有了你的API密钥。假设您将API密钥存储在PHP配置文件中。现在,如果有人强行输入您的FTP密码并下载脚本,该怎么办?他们有你的API密钥。假设您加密API密钥,将加密密钥存储在PHP配置文件中,并将加密的API密钥存储在数据库中。无论哪种方式你都是安全的。我喜欢当他们得到你的数据库或FTP时你说“无论哪种方式都是安全的”。我明白你的意思,但如果有人能破解你的FTP,你就完蛋了(安全服务器根本不应该有FTP),不管怎样。不管怎样,我明白你的意思,但它在安全方面非常薄弱。毕竟OP只是想隐藏一个API密钥,当然我不会乐意与一些破解者共享一个API密钥,但是不应该允许API密钥让任何事情变得糟糕。通常,这些API密钥用于为GET/POST HTTP调用创建令牌。您无法保护数据免受宿主公司管理员的攻击。理论上是不可能的。我们并不是试图保护数据不受主机管理员的影响;我们只是想确定他们是否被黑客入侵,我们的数据库是否正常