【问题标题】:Can an encryption key be discovered with the encoded string and string?可以通过编码字符串和字符串发现加密密钥吗?
【发布时间】:2011-05-22 15:44:17
【问题描述】:

我正在使用 PHP mcrypt_encrypt 函数来加密要在 URL 中发送的 ID。例如:/?id=encryptedstring 而不是/?id=1;这是为了防止用户猜测下一个序列。

如果用户拥有加密字符串和原始值,是否有可能发现加密密钥?

【问题讨论】:

  • 取决于您的加密算法,以及密钥的长度。如果您只是简单地使用sha1($id) 或md5($id) 来“加密”,那么检查sha1($id+1) 是什么就很简单了。
  • 如果有人猜测下一个序列或任何其他有效标识符会发生什么?

标签: php encryption


【解决方案1】:

加密不是正确的方法。

如果您担心用户猜测下一个序列,请考虑从一开始就为每条记录指定一个随机的 10 位或 20 位 ID。

但是,如果您要保护敏感数据,则依靠无法猜测的 URL 是不够足够的安全性。 URL 可以被传递,将存储在浏览器的历史记录中,将在代理和服务器日志中可见等。

在这种情况下,您需要实现一个授权系统,只允许用户访问他们被允许访问的记录(例如通过登录用户),因此他们是否知道顺序并不重要。

【讨论】:

  • 访问控制是授权而不是身份验证。
【解决方案2】:

当然,这是可能的。他们可以使用蛮力攻击并使用您的加密字符串检查原始已知值的测试加密,并比较每个可能的密钥,直到找到生成相同加密字符串的密钥。

但是,暴力破解效率非常低,因此他们不太可能发现您的密钥。

请参阅this site,了解有关暴力破解攻击者需要多长时间才能发现您的密钥的更多信息。

Pekka 提供了一个建议,即如果用户没有正确的读取记录的权限,则简单地拒绝访问,您绝对应该遵循该建议。 “通过默默无闻的安全根本不是安全”。

【讨论】:

  • 效率很低??假设您有一个用于 AES 加密的 128 位密钥。你知道有多少种可能的选择吗? 2^128 = ~10^38 !即使您需要 1 毫秒来测试一个选项,也需要您(只是为了好玩)10790283070806014188970529154.99 年来检查所有选项! :) 当然,密码分析比这复杂得多,但你说的是蛮力
  • @davka 好吧,也许这是本世纪的轻描淡写,但我的观点仍然有效,暴力破解可以找到给定的密钥。只是,机会比我突然学会如何飞行的机会要少
【解决方案3】:

如果你真的担心这个,你可以在你的加密中添加salt。

【讨论】:

  • 加盐与已经使用的“密钥”没有太大区别,并且可以以相同的方式发现。
  • 那为什么还要加盐呢?它增加了另一个必须被蛮力强迫的晦涩程度。任何东西都可以用足够的时间破解——让它更难(破解时间更长)是让它更安全的原因。没有盐,潜在的黑客无法说“我想要 id 1000”并生成哈希
【解决方案4】:

通常它需要一对以上的明文+加密数据才能破解加密(即导出密钥)。这是如果你使用一个像样的加密方案,当然

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-02
    • 2023-02-25
    • 2012-11-10
    • 1970-01-01
    • 2017-09-11
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多