如何存储AES加密密钥?

4
我在MediaTemple上运行一个Linux CentOS 5的DV 3.5服务器,使用php和mysql数据库,并尝试使用AES加密电话记录。
我发现了一个看起来不错的脚本PHPAES,但以下几点我不确定:
1. 我应该将用于加密和解密电话号码的AES加密密钥实际存储在哪里? 2. 当用户通过表单提交数据并存储到我们的MySQL数据库时,我如何调用AES加密密钥? 3. 当我要为内部客户服务代理人解密信息时,他们又如何调用AES密钥?
我意识到这可能很简单,但请不要侮辱我。我正在尝试学习最佳实践,以便不管什么类型的加密都能向前迈进。至今为止,我们没有这种需要。

这个问题其实已经在stackoverflow上提问过了,链接是http://stackoverflow.com/questions/2210011/where-should-one-store-the-cipher-key-when-using-aes-encryption-with-php - Amir Raminfar
最终我认为这是一个类似但不完全相同的问题 - 也许我应该问,是否可能使用一个密钥(公钥)进行加密,然后使用另一个密钥(私钥)进行解密? - JM4
2个回答

2
我开发了一个流程,首先使用一个初始加密密钥,将其编码成SHA1哈希值,然后使用用户名/密码组合进行加密,并将其存储在数据库中。密码(无论是哈希还是其他方式)从不存储在数据库中,仅在登录时用于解密加密密钥。然后我使用主用户名/密码创建其他具有密码的用户,其中PHP或JavaScript使用新用户的用户名/密码对解密密钥进行编码,并将该加密密钥存储在数据库中。当我尝试使用用户名/密码组合从数据库解密加密密钥时,我应该期望得到一个SHA1哈希值。如果我没有得到可以解密数据的有效SHA1哈希值,则知道密码错误,数据无法使用。您必须拥有有效的用户名/密码组合才能获取解密密钥,并通过SSL传输给客户端,使用JavaScript函数进行解密,然后将其存储在SSL会话的cookie中。
要规避系统、解密数据并访问信息,您必须感染键盘记录器或特洛伊木马,在登录会话期间搜索cookie,否则服务器所有者和没有用户名/密码组合的客户端都无法使用数据库中的数据,除非使用暴力破解。使用AES 256位和强密码(12个或更多字符,A-Z,a-z,0-9,符号等),您就可以得到一个相当难以突破的解决方案,或者至少是一个尝试会很痛苦的解决方案。
每个帐户都有一个锁定功能,因此如果您尝试通过Web登录太多次并失败,则该帐户将被锁定。所有PHP页面都对参数进行编码/解码,以防止SQL注入攻击,并验证PHP会话是否处于活动状态并与您登录期间跟踪的上一个会话匹配,并验证您的加密密钥是否有效。每次登录或访问登录页面时,上一个会话都将无效,或者如果您的会话超时,它也将无效。即使有了所有这些层级,它仍然快速,并防止人们使用输出JSON的PHP脚本来伪造POST到脚本和SQL注入攻击。它还限制了服务器所有者/管理员解密和读取您的信息的能力,如果其存储在共享提供程序上等。

0

我最终采用了以下方法:

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

为了解密,我必须上传一个带有私钥的临时文件并检索所需数据。

在我看来非常安全。


盐值哈希什么? 我猜你是指将其他数据哈希并将其用作AES的密钥,而不是对电话号码进行哈希并称其为加密。 但是,如果密钥只是该数据库记录中另一个值的哈希,则在数据库记录中加密值没有意义。 如果你随后立即使用RSA进行加密,为什么需要AES步骤? 听起来像是你只是在假设更复杂就更安全的情况下把一堆加解密函数放在一起。 - Wyzard
2
顺便说一句,将您的私钥上传到远程机器上以解密文件是一个不好的主意;这样做会让它失去您的控制。即使它是一个“临时”文件,您可能已经知道删除的文件通常并没有真正被删除。最好将加密数据下载到您自己的机器上,在那里进行解密。 - Wyzard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接