使用bcrypt计算密码哈希值

  • 我们应该计算密码的哈希值而不是加密他,加密是双向算法,而哈希是单项算法
  • 目前公认的最安全的哈希算法是bcrypt
  • 开发web应用时,会在两处地方用到密码哈希API:注册和登录用户,以下为操作代码。
/**
 * 注册用户时 计算密码哈希值
 * 密码的哈希值应存储在VARCHAR(255)类型的数据库列中。便于以后存储比现在的bcrypt算法得到的哈希值更长的密码
 * @param string $id
 * @param string $password
 * @throws EXception
 */

function user_register($id, $password) {
    // 计算密码哈希值, PASSEWORD_DEFAULT表示使用bcrypt算法, cost——工作因子,表示计算次数
    $passwordHash = password_hash($password, PASSWORD_DEFAULT, ['cost' => 10]);
    if ($passwordHash === false) {
        throw new \EXception('Password hash failed');
    }
    //创建账户
    $user = new User();
    $user->id = $id;
    $user->password = $passwordHash;
    $user->save();
}

function user_login($id, $password) {
    //查找账户
    $user = User::findById($id);

    //验证密码和账户密码的哈希值是否匹配
    if (password_verify($password, $user->password) === false) {
        throw new \Exception("Invild password");
    }
    //如果需要重新计算密码的哈希值
    $currentHashAlgorithm = PASSWORD_DEFAULT;
    $currentHashOptions = array('cost' => 15);
    $passwordNeedRehash = password_needs_rehash($user->password, $currentHashAlgorithm, $currentHashOptions);

    if ($passwordNeedRehash === true) {
        $user->password = password_hash($password, $currentHashAlgorithm, $currentHashOptions);
        $user->save();
    }
}

try{
    user_register('allen', '666');
} catch (Exception $e) {
    echo $e->getMessage();
}

bcrypt 是一种密码哈希函数,它将密码进行加密并生成一个哈希值。每次加密相同的密码,都会生成不同的哈希值,这是为了增加密码的安全性。 在使用 bcrypt 进行密码加密时,通常会使用一个称为“盐”的随机字符串作为额外的输入。这个盐会与密码一起进行哈希计算,以增加密码的复杂性和安全性。 以下是一个使用 bcrypt 进行密码加密的示例: ```javascript const bcrypt = require('bcrypt'); const password = '111111'; bcrypt.genSalt(10, (err, salt) => { bcrypt.hash(password, salt, (err, hash) => { console.log(hash); }); }); ``` 在这个示例中,`bcrypt.genSalt` 生成一个盐,并将其作为参数传递给 `bcrypt.hash` 方法。`password` 是要加密的密码。`10` 是盐的复杂度,表示生成盐所需要的计算成本。生成哈希值将通过 `console.log` 输出。 请注意,由于 bcrypt 使用了随机盐和计算成本,每次运行代码时生成哈希值都会不同。因此,即使输入的密码相同,生成哈希值也会不同。 需要注意的是,由于哈希算法的特性,无法从哈希值中逆向推导出原始密码。这是哈希算法的一项重要特性,确保密码的安全性。因此,一般情况下,验证密码的方式是将用户提供的密码与存储的哈希值进行比较,而不是从哈希值中还原出原始密码。 希望这能帮助到你!如果有更多问题,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值