php原生密码加密及密码验证

php的密码加密与验证有好多方法, 大家用的也大多不一样, php在5.5之后本身已经有一个简单有效的方法了 方便且容易记所以平时使用这个就可以了

实现原理 password_hash()函数

/** 过滤容器 */
$clean = array();

/** 用户名及密码非空和长度判断略过 */
    //...

/**
 * 对密码计算散列
 * 参数二加密方式  7.0中又去除了 其中一个 建议使用默认
 */
$hashed_password = password_hash($_POST['password'], PASSWORD_DEFAULT);

/** 允许字母数字用户名 */
if (ctype_alnum($_POST['username']))
{
    $clean['username'] = $_POST['username'];

} else
{
    echo '用户错误';die();
}

/** 保存数据库 代码略过 */

password_hash() 使用足够强度的单向散列算法创建密码的散列(hash)。 password_hash() 兼容 crypt()。 所以, crypt() 创建的密码散列也可用于 password_hash()

  • 验证 password_verify()
/** 登录验证 */
/** 允许字母数字用户名 */
if (ctype_alnum($_POST['username']))
{
    $clean['username'] = $_POST['username'];

} else
{
    echo '用户错误';die();
}

$user = pdo_get('user', array('username' => $clean['username']));
if (!empty($user))
{
    $hashed_password = pdo_getColumn('user', array('id' => $user['id']), 'password');

} else
{
    echo '未找到用户信息';die();
}

if (password_verify($_POST['password'], $hashed_password))
{
    echo '登录失败';die();

} else
{
    echo '登录成功';die();
}

既然自带方法能实现 没有别的特殊的东西没必要用其他的方法, 有点就是系统方法容易调用和使用, 另外一点就是 相同明文也会生成不同的散列值, 而且转换成明文的计算成本也是相当大.

你可能感兴趣的:(php原生密码加密及密码验证)