这种创造方式是真正的"随机字符串有意义吗?

时间:2018-05-07 19:40:32

标签: php algorithm security random hash

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

所以我的想法就是产生真正的"随机,但基于一些数据令牌如下:

  1. 创建127个字符的随机字符串
  2. 使用SHA-512
  3. 的哈希用户名
  4. 使用SHA-512
  5. 散列电子邮件
  6. 使用SHA-512
  7. 哈希名字
  8. 使用SHA-512
  9. 哈希姓氏
  10. 使用SHA-512
  11. 哈希当前时间戳
  12. 将哈希字符串组合并再次使用SHA-512哈希
  13. 组合随机字符串(127个字符)和散列5个字符串(128个字符)
  14. 所以我最终得到的是255个字符的字符串。这个令牌在每次登录时都会重新生成,所以它非常强大,并且#34;

    那么,是否有可能以更少的麻烦来实现相同的目标,或者这是实现大多数安全性的最佳方法"对于任何敏感数据?

    /**
     * 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);
    }
    

1 个答案:

答案 0 :(得分:0)

  

对于任何具有敏感信息的操作,我需要一个令牌,该令牌将足够安全以用作广播频道。

好的。

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

[snip]

     

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

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

这似乎很麻烦。

  

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

简单:

$token = bin2hex(random_bytes(32));

将一堆东西混在一起只会增加脚本的少量计算开销,实际上并不能确保任何安全。

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