我应该如何存储AES加密密钥?

时间:2010-10-27 23:46:21

标签: php mysql linux aes

我使用Linux CentOS 5,php和mysql DB在MediaTemple上运行DV 3.5服务器,并尝试使用AES加密电话记录。

我遇到了似乎是PHPAES

的好脚本

但我不确定以下内容:

  1. 我在哪里实际存储AES 用于加密和的加密密钥 解密电话号码?

  2. 如何调用AES加密 用户提交数据时的密钥 通过表格和商店进入我们的MySQL 数据库?

  3. 当我想为我们的内部客户服务代理解密这些信息时 - 他们如何依次调用AES密钥?

  4. 我意识到这可能很简单,但请不要侮辱。我正在尝试学习如何推进任何类型的加密的最佳实践。我们没有必要的东西(到目前为止)。

2 个答案:

答案 0 :(得分:2)

我开发了一个过程,我从一个初始加密密钥开始,我将其编码为SHA1哈希,然后使用带有用户名/密码组合的加密密钥并将其存储在数据库中。密码(散列或其他)永远不会存储在数据库中,仅在登录时用于解密加密密钥。然后,我使用该主用户名/密码创建具有密码的其他用户,其中PHP或JavaScript使用新用户的用户名/密码对解密密钥进行编码,并将该加密密钥存储在数据库中。当我尝试使用用户名/密码组合从数据库解密加密密钥时,我应该期望返回SHA1哈希。如果我没有获得可以解密数据的有效SHA1哈希,那么我知道密码错误且数据无法使用。您必须拥有有效的用户名/密码组合才能获得解密密钥,并通过SSL传输到客户端,使用JavaScript函数解密,然后存储在用于SSL会话的cookie中。

绕过系统,解密数据并访问您必须感染的信息,这些信息是在登录会话期间搜查过您的密钥记录器或木马,否则服务器所有者或没有用户名/密码的客户端组合可以使用数据库中的数据而不会强制它。使用AES 256位和强密码(12个以上的字符,AZ,az,0-9,符号等),你自己有一个相当难以破解的解决方案,或者至少有一个难以尝试。< / p>

每个帐户都有一个锁定功能,因此如果您尝试通过网络登录太多次并失败,该帐户将被锁定。所有PHP页面都编码/解码参数以防止SQL注入攻击并验证PHP会话是否处于活动状态并与您登录期间跟踪的上一个会话相匹配,并验证您的加密密钥是否有效。每次登录或访问登录页面时,上一个会话都将失效,或者如果会话超时,它也会失效。即使所有这些层都很快并且阻止人们使用PHP脚本将使用伪造的POST输出JSON到脚本和SQL注入攻击。它还限制了服务器所有者/管理员解密和读取您的信息(如果它存储在共享提供程序等)的能力。

答案 1 :(得分:0)

我实际上最终走了这条路:

我使用存储在数据库本身的salted哈希加密初始数据(并且对于存储的每个记录都是唯一的)。然后,我使用256位AES加密字符串并使用我的公钥进行RSA加密,该公钥位于服务器端。

为了解密,我必须使用我的私钥上传一个临时文件并检索必要的数据。

在我看来非常安全。