我正在进行一个php登录,我正在try 决定是使用SHA1还是Md5,还是在另一篇stackoverflow文章中读到的SHA256.他们中有谁比其他人更安全吗?对于SHA1/256,我还用盐吗?

另外,在MySQL中以散列形式存储密码是一种安全的方式吗?

function createSalt()
{
    $string = md5(uniqid(rand(), true));
    return substr($string, 0, 3);
}

$salt = createSalt();

$hash = sha1($salt . $hash);

推荐答案

都不是.你应该用bcrypt.您提到的散列都经过优化,在硬件上既快速又容易,因此破解它们具有相同的特性.如果您别无 Select ,至少要确保使用长盐并多次重新散列.

在PHP5.5中使用bcrypt+

PHP5.5提供new functions for password hashing.这是现代web应用程序中密码存储的推荐方法.

// Creating a hash
$hash = password_hash($password, PASSWORD_DEFAULT, ['cost' => 12]);
// If you omit the ['cost' => 12] part, it will default to 10

// Verifying the password against the stored hash  
if (password_verify($password, $hash)) {
    // Success! Log the user in here.
}

如果您使用的是PHPyou really should upgrade的旧版本,但在使用之前,您可以使用password_compat公开此API.

另外,请让password_hash()为您生成盐.它使用CSPRNG.

bcrypt的两个注意事项

  1. Bcrypt将自动截断任何超过72个字符的密码.
  2. Bcrypt将在任意NUL个字符后截断.

(此处的两个注意事项均为Proof of Concept.)

您可能会忍不住想在pre-hashing your passwords before running them through bcrypt之前解决第一个警告,但这样做可能会导致您的应用程序直接运行到第二个警告中.

不要编写自己的方案,而是使用由安全专家编写和/或判断的现有库.

TL;DR - Use bcrypt.

Php相关问答推荐

CodeIgniter AJAX表格提交中的CSRF token 再生问题

在PHP中替换数组中的文本并同时使用其他函数

WooCommerce产品按特定元数据的自定义数字排序选项

根据产品类型显示或隐藏WooCommerce管理产品自定义字段

Sylius php -如何将购物车传递到小枝模板(Sylius模板事件)

Laravel Nova不使用数组键作为筛选器中的选项值

PHP Laravel Web应用启动时间&>15秒

无额外字段的Laravel同步

未定义的类型';PDF';在Laravel 8

将自定义字段添加到管理产品中 WooCommerce 3.2+ 中的快速编辑

如何使用 AJAX、PHP 和 MYSQL 在 Select 项目时在文本框中填充数据

htaccess 重定向子域错误的 url

如何显示所有数组数据而不仅仅是最后的结果

Windows 身份验证在 IIS 中验证什么?我可以在我的情况下禁用匿名身份验证吗?

Woocommerce注册中的自定义复选框验证错误提示问题

在PHP WordPress插件中使用变量连接路径时的问题解决方法

如何在WooCommerce管理产品列表中显示运输类别列

如何在构建 PHP 类别数组树的递归函数中将父面包屑传递给子项?

Symfony 迁移判断器在我的工作中失控

如何使用属性创建属性预设?