php – 什么是生成一个随机的“网站盐”用于创建密码检索令牌的好方法?

我想创建一个网站范围的哈希值,用作创建密码检索令牌的盐.我一直在堆叠流中弹跳,试图找到最好的方法来做到这一点.

这是重置过程:

当用户请求密码重置电子邮件时,代码生成检索令牌:

$token = hash_hmac('sha256',$reset_hash*,$site_hash)

* $reset_hash是使用phpass HashPassword()函数创建的哈希值,保存在用户表中.

然后我将令牌发送到用户电子邮件地址的URL.他们在一小时内点击令牌超时.我将他们的提交与产生服务器端的挑战令相匹配.如果匹配,则被迫选择新密码,然后登录.

我想知道生成$site_key的最佳方式.我正在考虑使用由随机数字播种的另一个HMAC哈希:

$site_key = hash_hmac('sha256',MCRYPT_DEV_RANDOM,MCRYPT_DEV_RANDOM);

这样做会产生如下结果:

98bb403abbe62f5552f03494126a732c3be69b41401673b08cbfefa46d9e8999

这是否适合随机使用?我是否过度复述了这个问题,或是以错误的方式接近呢?

I was inspired to use HMAC by this answer

编辑:我试图避免一些我的同事敦促的一个“秘密问题”的步骤,所以我想重置链接提供一个重要的密码.因此,我担心这个过程是足够安全的,以保护含有敏感信息的系统.

解决了,现在:我将随着“Rook”所描述的一个随机存取为复位令牌.感谢大家的意见和反馈.

首先,你不是在谈论盐.你在说一个 Cryptographic Nonce,当你使用密码时,你应该使用加密随机数.在重置密码的情况下,它应该是存储在数据库中的随机数.具有“现场盐”是不利的.

首先我不喜欢uniqid(),因为这是一个时间沉重的计算和time is a very weak seed. rand() vs mt_rand(),spoiler:rand()是完全垃圾.

在Web应用程序中,安全秘密的一个好的来源是非阻塞访问熵池,如/ dev / urandom.从PHP 5.3起,程序可以使用openssl_random_pseudo_bytes(),Openssl库将根据您的操作系统选择最佳的熵源,在Linux下,这意味着应用程序将使用/ dev / urandom.这code snip from Scott is pretty good

function crypto_rand_secure($min,$max) {
        $range = $max - $min;
        if ($range < 0) return $min; // not so random...
        $log = log($range,2);
        $bytes = (int) ($log / 8) + 1; // length in bytes
        $bits = (int) $log + 1; // length in bits
        $filter = (int) (1 << $bits) - 1; // set all lower bits to 1
        do {
            $rnd = hexdec(bin2hex(openssl_random_pseudo_bytes($bytes)));
            $rnd = $rnd & $filter; // discard irrelevant bits
        } while ($rnd >= $range);
        return $min + $rnd;
}

function getToken($length=32){
    $token = "";
    $codeAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $codeAlphabet.= "abcdefghijklmnopqrstuvwxyz";
    $codeAlphabet.= "0123456789";
    for($i=0;$i<$length;$i++){
        $token .= $codeAlphabet[crypto_rand_secure(0,strlen($codeAlphabet))];
    }
    return $token;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


如何选择合适的 C++ Web 开发框架?
利用 C++ 框架构建高并发 Web 应用的策略
用 C++ 框架开发跨平台图形应用程序
golang框架中安全编码实践的最佳指南是什么?
golang框架与其他语言框架在设计理念上的区别有哪些?
C++ 图形框架与其他语言框架的比较
C++ 框架与其他 Web 开发框架的对比分析
使用 C++ 框架构建大型项目最佳实践
C++ 框架如何提高大型项目开发效率
C++ 框架中依赖注入的持续集成与部署工具
如何与社区协作和贡献到自定义 Golang 框架?
C++ 框架在大型项目中如何实现模块化开发
使用 C++ 框架开发跨平台 Web 应用
C++ 框架在大型项目中的优缺点
golang框架在性能上的优势体现在哪些方面?
C++ 框架在嵌入式系统内存优化中的优势
golang框架在人工智能与机器学习中的作用
如何扩展 Golang 框架以支持特定功能?
如何利用 Go Modules 和依赖项管理来自定义 Golang 框架?
Golang 框架中的性能优化技巧