设置
鉴于以下情况:
$s = Crypt::encryptString('a');
是否有可能知道,对于长度为 1 的字符串,可能的长度范围为 1 $s
?
语境
数据库存储 - 需要存储加密值,并希望设置输入字符串的验证,以便最长长度的输入字符串在加密时被插入到数据库中而不被截断。
基本测试
使用以下代码片段在本地运行一些非常粗略的测试:
Route::get('/test', function() {
echo '<table>';
for ($i=0; $i < 100; $i++) {
$s = str_repeat('a', $i);
$l1 = strlen($s);
$l2 = strlen(Crypt::encryptString($s));
echo "<tr><td>$l1</td><td>$l2</td></tr>";
}
echo '</table>';
});
我可以看到以下内容,但它在运行之间会有所不同,例如,“a”字符串的长度为 188 或 192(更长的值似乎在 244 和 248 之间)。
所以必须有一个公式。我已经看到output_size = input_size + (16 - (input_size % 16))
但没有考虑到差异。
输出
0 192
1 188
2 188
3 192
4 188
5 188
6 188
7 192
8 192
9 188
10 188
11 192
12 192
13 192
14 192
15 192
16 220
17 220
18 216
19 216
20 220
编辑
好的,所以和下面@Luke Joshua Park 聊了聊,长度的变化来自于laravel 加密函数和方式$iv
创建,是随机字节,可以包含/
.
$value
加密方法里面还可以包含一个/
.
当包含 a 的值/
是 JSON 编码时,将/
转义为\\\/
每次出现额外添加 3 个字符。
真正的问题 - 可以$iv
包含$value
多个“/”吗?