php - 这种创建“真正”随机字符串的方式有意义吗?
问题描述
一天中的美好时光,
最近,我一直在玩 Laravel Echo,并得出结论,对于任何涉及敏感信息的操作,我都需要一个令牌,它足够安全,可以用作广播频道。
因此,我基于某些数据令牌生成“真正”随机的想法如下:
- 创建 127 个字符的随机字符串
- 使用 SHA-512 散列用户名
- 使用 SHA-512 散列电子邮件
- 使用 SHA-512 散列名字
- 使用 SHA-512 散列姓氏
- 使用 SHA-512 散列当前时间戳
- 组合散列字符串并再次使用 SHA-512 散列它们
- 组合随机字符串(127 个字符)和散列的 5 个字符串(128 个字符)
所以我最终得到的是 255 个字符的字符串。这个令牌在每次登录时都会重新生成,所以它非常“强大”?
那么,是否有可能以更少的“麻烦”实现相同的目标,或者这几乎是为任何敏感数据实现“最高安全性”的最佳方法?
/**
* Generate truly random string for broadcast_token
* @param App\Models\User $user
* @return string
*/
function broadcast_id(\App\Models\User $user) : string {
$algorithm = 'sha512';
$randomString = \Illuminate\Support\Str::random(127);
$usernameHash = hash($algorithm, $user->username);
$emailHash = hash($algorithm, $user->email);
$firstNameHash = hash($algorithm, $user->first_name);
$lastNameHash = hash($algorithm, $user->last_name);
$timeHash = hash($algorithm, time());
$hashedData = hash($algorithm, sprintf('%s:%s:%s:%s:%s', $usernameHash, $emailHash, $firstNameHash, $lastNameHash, $timeHash));
return sprintf('%s%s', $randomString, $hashedData);
}
解决方案
对于任何涉及敏感信息的操作,我需要一个令牌,它足够安全,可以用作广播频道。
好的。
- 创建 127 个字符的随机字符串
[剪辑]
所以我最终得到的是 255 个字符的字符串。这个令牌在每次登录时都会重新生成,所以它非常“强大”?
你的目标是一个随机字符串,所以你从一个随机字符串开始?
这似乎很麻烦。
那么,是否有可能以更少的“麻烦”实现相同的目标,或者这几乎是为任何敏感数据实现“最高安全性”的最佳方法?
简单的:
$token = bin2hex(random_bytes(32));
将一堆东西散列在一起只会给你的脚本增加一点计算开销,它并不能真正保证任何安全。
使用 32 字节的随机字符串,您将在生成大约 2^128 个令牌后发生第一次冲突(50%)的概率。你一辈子都不会达到这个数字。
推荐阅读
- unity3d - 启动画面挥之不去
- javascript - 如何在laravel中插入数组字段
- fortran - 用 Fortran77 中的标志区分块数据中的条目
- c# - 如何在openxml中保留字符串格式?
- scala - Spark:show 和 collect-println 给出不同的输出
- java - 如何解决未经检查的调用'mapByPage(函数
- , 列表
>)' 作为原始类型 'android.arch.paging.PositionalDataSource' 的成员 - selenium - 在 selenium chrome 驱动程序中伪造系统日期
- python - FreeOpcUa 如何访问方法(从终端)
- flutter - Flutter:从不同的文件运行多个 UI 测试
- java - p4java api 需要两次刷新才能获得新的更改列表描述