首页 > 解决方案 > 这种创建“真正”随机字符串的方式有意义吗?

问题描述

一天中的美好时光,
最近,我一直在玩 Laravel Echo,并得出结论,对于任何涉及敏感信息的操作,我都需要一个令牌,它足够安全,可以用作广播频道。

因此,我基于某些数据令牌生成“真正”随机的想法如下:

  1. 创建 127 个字符的随机字符串
  2. 使用 SHA-512 散列用户名
  3. 使用 SHA-512 散列电子邮件
  4. 使用 SHA-512 散列名字
  5. 使用 SHA-512 散列姓氏
  6. 使用 SHA-512 散列当前时间戳
  7. 组合散列字符串并再次使用 SHA-512 散列它们
  8. 组合随机字符串(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);
}

标签: phpalgorithmsecurityrandomhash

解决方案


对于任何涉及敏感信息的操作,我需要一个令牌,它足够安全,可以用作广播频道。

好的。

  1. 创建 127 个字符的随机字符串

[剪辑]

所以我最终得到的是 255 个字符的字符串。这个令牌在每次登录时都会重新生成,所以它非常“强大”?

你的目标是一个随机字符串,所以你从一个随机字符串开始?

这似乎很麻烦。

那么,是否有可能以更少的“麻烦”实现相同的目标,或者这几乎是为任何敏感数据实现“最高安全性”的最佳方法?

简单的:

$token = bin2hex(random_bytes(32));

将一堆东西散列在一起只会给你的脚本增加一点计算开销,它并不能真正保证任何安全。

使用 32 字节的随机字符串,您将在生成大约 2^128 个令牌后发生第一次冲突(50%)的概率。你一辈子都不会达到这个数字。


推荐阅读