限制 Laravel 5 加密长度

8
我是一名有用的助手,可以为您进行文本翻译。
我有一个基于Laravel5的企业目录Web应用程序。
当我加密一个值时,例如:
$cryptval = Crypt::encrypt(1);

result  =  eyJpdiI6IndhaFZFNlhIRDlURzdXanJVMEhBM0E9PSIsInZhbHVlIjoidWF3VzRFZDhyRHltUlwveDdyV0VVWnc9PSIsIm1hYyI6IjE5YjA2YWIyN2Q0MTBlYjdhNDJiNDE5ZjY2OGQ2MDA2NzQ3ZTA4ODc4NzY0ZTIwMjBiMzQxN2RjNmM5ZDg3ZjYifQ==

它返回一个大约250长度的长字符串。

在Laravel中有没有限制这个字符串长度的方法?

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

www.example.com/varify/eyJpdiI6IndhaFZFNlhIRDlURzdXanJVMEhBM0E9PSIsInZhbHVlIjoidWF3VzRFZDhyRHltUlwveDdyV0VVWnc9PSIsIm1hYyI6IjE5YjA2YWIyN2Q0MTBlYjdhNDJiNDE5ZjY2OGQ2MDA2NzQ3ZTA4ODc4NzY0ZTIwMjBiMzQxN2RjNmM5ZDg3ZjYifQ==

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


“encrypt”方法只接受“$value”参数,因此无法明确控制哈希长度。你为什么需要它更短呢? - Amo
你为什么需要加密? - fico7489
加密真的是你在这里需要的吗?也许你应该使用某种令牌系统?(提示:加密字符串通常不会放入URL中) - Simba
可能是Hiding true database object ID in url's的重复问题。 - Scott Arciszewski
3个回答

1
我认为不需要在数据库中存储任何东西,那是一项艰苦的工作,在我的情况下,我在模型中使用base64_encode,在控制器中使用base64_decode来显示真实值以继续处理。

1
我刚遇到了同样的问题。我只需在数据库表中添加一个“哈希”列,然后填充它使用 md5(encrypt($model->id))。
md5 值更短,并且因为它也使用 Laravel 的加密,所以无法被猜测。

这没有任何意义,是的它更短,但你无法解密它,你只是对它进行散列,而有专门用于散列的函数,所以不需要先加密再散列,这只是简单地多余,甚至错误。 - Steve Moretz

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” 应该真正被混淆,而不仅仅作为一个整数使用 - 这就是时间戳和随机密钥可以发挥作用的地方。
$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的地址长度可以支持大约2000个字符。你提供的示例只有32个字符长度,远远在任何现代浏览器可接受的长度范围内。 编辑:只需使用像this这样的软件包生成uuid,而不是尝试创建自己的随机id。这将产生一个字符串,例如d3d29d70-1d25-11e3-8591-034165a3a613

1
这会使得别人极其容易猜测,从而使哈希变得多余。 - Ian Brindley
将数字进行Base64编码作为混淆对于程序员来说就像……我不知道。写明文?每个人都知道Base64编码,结果字符集和==会暴露它。 - sisve
我回答的问题并不是关于混淆代码,而是关于缩短字符串。我的回答实现了这一点。我们不知道哈希值的重要性(原始示例只是对值为1的值进行哈希)。Laravel的加密功能还对加密后的值进行了base64编码。我只是添加了一些混淆,因为Ian猜测id是完全有效的。 - Amo
完全同意你的看法@Amo,考虑到所有情况,似乎原帖作者可能有点力不从心... 原帖作者,谷歌一下吧 :) - Ian Brindley
1
不要使用哈希(它们是暴力可破解的),也不要进行加密。请使用单独的唯一值。https://paragonie.com/blog/2015/09/comprehensive-guide-url-parameter-encryption-in-php - Scott Arciszewski
显示剩余3条评论

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