【问题标题】:Limit Laravel 5 Encryption length限制 Laravel 5 加密长度
【发布时间】:2016-01-17 14:26:54
【问题描述】:

我有一个业务目录的 Laravel5 Web 应用程序。

当我加密像

这样的值时
$cryptval = Crypt::encrypt(1);

result  =  eyJpdiI6IndhaFZFNlhIRDlURzdXanJVMEhBM0E9PSIsInZhbHVlIjoidWF3VzRFZDhyRHltUlwveDdyV0VVWnc9PSIsIm1hYyI6IjE5YjA2YWIyN2Q0MTBlYjdhNDJiNDE5ZjY2OGQ2MDA2NzQ3ZTA4ODc4NzY0ZTIwMjBiMzQxN2RjNmM5ZDg3ZjYifQ==

它给出了一个大约 250 长度的长字符串。

有什么办法可以限制laravel中这个字符串的长度吗?

我的客户需要在邮件功能中添加具有加密值的 URL。 例如:

www.example.com/varify/eyJpdiI6IndhaFZFNlhIRDlURzdXanJVMEhBM0E9PSIsInZhbHVlIjoidWF3VzRFZDhyRHltUlwveDdyV0VVWnc9PSIsIm1hYyI6IjE5YjA2YWIyN2Q0MTBlYjdhNDJiNDE5ZjY2OGQ2MDA2NzQ3ZTA4ODc4NzY0ZTIwMjBiMzQxN2RjNmM5ZDg3ZjYifQ == P>

但是邮件功能只允许一定长度的 URL :(

【问题讨论】:

  • encrypt 方法只接受$value 参数,因此无法显式控制哈希的长度。为什么你需要它更短?
  • 你需要加密做什么?
  • 这里真的需要加密吗?也许您应该改用某种令牌系统? (提示:加密字符串不是您通常放入 URL 的内容)

标签: php encryption laravel-5


【解决方案1】:

一种解决方案是将散列值存储在一个表中,然后通过散列值的自增ID引用该散列。

| id | hash             | timestamp | random_key |
| 1  | some-hash        | 125346164 | 21415      |
| 2  | some-other-hash  | 123513515 | 25151      |

所以现在,而不是使用:

www.example.com/verify/some-hash

你可以使用:

www.example.com/verify/1

id 真的应该被混淆,而不是仅仅用作整数 - 这是时间戳和 random_key 可以提供帮助的地方。

$id = 1;
$timestamp = 125346164;
$randomKey = 21415;

$key = base64_encode($timestamp . $randomKey . $id);

echo 'http://www.domain.com/verify/' . $key;

// http://www.domain.com/verify/MTI1MzQ2MTY0MjE0MTUx

话虽如此,我的建议是尝试解决电子邮件传递平台设置为URL's can support an address length of around 2000 characters 的限制。您给出的示例只有 32 的长度,并且在任何现代浏览器都可以接受的长度范围内。

编辑:只需使用 this 之类的包生成 uuid,而不是尝试创建自己的随机 id。这将产生一个字符串,例如d3d29d70-1d25-11e3-8591-034165a3a613

【讨论】:

  • 这将使某人非常容易猜测,从而使哈希变得多余。
  • 同意它在示例格式中并不完美。它需要进一步混淆才能有用,这可以通过将时间戳附加到id 来完成。将更新示例。
  • Base64 编码一个数字作为混淆对于像......我不知道的程序员来说。写明文?每个人都知道 base64 编码,生成的字符集和 == 大放异彩。
  • 我要回答的问题并不是关于混淆,而是关于缩短字符串。我的回答实现了这一点。我们没有关于散列重要性的上下文(OP 的原始示例只是对 1 的值进行散列)。 Laravel 的 encrypt 也是对加密值进行 base64_encode。我只是添加了一些混淆,因为 Ian 猜测 id 的观点是完全有效的。
  • 不要使用哈希(它们是暴力破解的),不要加密。使用单独的唯一值。 paragonie.com/blog/2015/09/…
【解决方案2】:

我认为不需要在数据库中存储任何内容,这是一项艰苦的工作, 在我的例子中,在 blase 中使用 base64_encode 并在控制器中使用 base64_decode 来显示方法的实际值并继续该过程。

【讨论】:

    【解决方案3】:

    我刚刚遇到了同样的问题。我只是在我的数据库表中添加了一个“哈希”列。然后我用 md5(encrypt($model->id))

    填充它

    md5值要短很多,而且因为也是使用Laravel的crypt,所以猜不出来。

    【讨论】:

      猜你喜欢
      • 2020-02-07
      • 2012-12-22
      • 2012-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-16
      • 1970-01-01
      相关资源
      最近更新 更多