【问题标题】:How should I store a AES Encryption Key?我应该如何存储 AES 加密密钥?
【发布时间】:2010-10-27 23:46:21
【问题描述】:

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

我遇到了 PHPAES 似乎不错的脚本

但我不确定以下几点:

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

  2. 如何调用 AES 加密 用户提交数据时的密钥 通过表单并存储到我们的 MySQL 中 数据库?

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

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

【问题讨论】:

  • 这里其实已经问过了stackoverflow.com/questions/2210011/…
  • 最终我看到它是相似但不是同一个问题 - 也许我应该问,是否可以用一个密钥(公共)加密并用另一个(私人)解密?

标签: php mysql linux aes


【解决方案1】:

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

要绕过系统,请解密数据并访问您必须感染的信息,这些信息必须在登录会话期间被键盘记录器或特洛伊木马感染,否则服务器所有者或客户端都没有用户名/密码组合可以使用数据库中的数据而无需暴力破解。使用 AES 256 位和强密码(12 个以上字符、A-Z、a-z、0-9、符号等),您就获得了一个相当难以破解的解决方案,或者至少一个尝试起来会很痛苦的解决方案。

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

【讨论】:

    【解决方案2】:

    我实际上最终走的是这条路:

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

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

    在我看来非常安全。

    【讨论】:

    • 什么的盐渍哈希?我假设您的意思是散列一些其他数据并将其用作 AES 的密钥,而不是散列电话号码并将其称为加密。但是,如果密钥只是该数据库记录中另一个值的哈希值,那么加密数据库记录中的值是没有意义的。如果您之后立即使用 RSA 加密,为什么还需要 AES 步骤?听起来你只是假设它越复杂,它必须越安全,而是将一堆加密函数放在一起。
    • 顺便说一句,将您的私钥上传到远程机器只是为了在那里解密文件是个坏主意;你让它脱离了你的控制。即使它是“临时”文件,您也可能已经知道删除的文件通常不会真正被删除。最好将加密数据下载到您自己的密钥所在的机器上,然后在那里解密。
    猜你喜欢
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-29
    • 2011-10-14
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    相关资源
    最近更新 更多