2016 年最佳密码存储算法

2024-01-14

实际上我读了很多与算法相关的帖子,比如md5, sha1等等。但我仍然不确定哪一种是当今最安全且最好使用的。我是网络开发的初学者,我要求世界上所有最好的程序员来教我并向我展示。我希望你们能给我选择和使用它的例子。谢谢


顺便:2016 年如何安全存储用户密码 https://paragonie.com/blog/2016/02/how-safely-store-password-in-2016.

您的选择是:

  • Argon2(需要 PHP 7.2 或 PHP 扩展)
  • Scrypt(需要 PHP 扩展)
  • Bcrypt

如果您确实需要,也可以考虑 PBKDF2。

旧的备用:Bcrypt

鉴于您是初学者,您应该像这样编写密码验证:

// Creating your hashed password:
$hash = password_hash($userPassword, PASSWORD_DEFAULT);

// Checking a user-supplied password against a stored hash:
if (password_verify($userPassword, $hash)) {
    // Login successful.
    if (password_needs_rehash($hash, PASSWORD_DEFAULT)) {
        // Recalculate a new password_hash() and overwrite the one we stored previously
    }
}

bcrypt 的缺点:

  • 超过 72 个字符的密码将被截断。
  • 带有 NUL 字节的密码将被截断。

解决这些限制的权宜之计已内置于密码锁 https://github.com/paragonie/password_lock:它使用 SHA384 预先对密码进行哈希处理,然后对原始哈希值进行 Base64 编码,然后再传递给 PHP 的密码 API。

首先,创建一个加密密钥并存储它在文档根目录之外。 (否则,黑客就可以窃取密钥。)

$newKey = \Defuse\Crypto\Key::createNewRandomKey();
file_put_contents(
    '/outside/document/root/enckey.txt',
    $newKey->saveToAsciiSafeString()
);

现在,您可以将此密钥与您的密码结合使用:

$key = Key::loadFromAsciiSafeString(
    file_get_contents('/outside/document/root/enckey.txt')
);

// Hashing a password with PasswordLock:
$storeMe = PasswordLock::hashAndEncrypt($_POST['password'], $key);

// Verifying a password with PasswordLock:
if (PasswordLock::decryptAndVerify($_POST['password'], $storeMe, $key)) {
    // Success!
}

您现在可以使用 Argon2password_hash()在 PHP 7.2 中 https://framework.zend.com/blog/2017-08-17-php72-argon2-hash-password.html

新标准:Argon2(通过 Libsodium)

除非您使用的是 PHP 7.2 或更高版本,否则您需要安装 libsodium 和 PHP 扩展 https://paragonie.com/book/pecl-libsodium/read/00-intro.md#installing-libsodium使用Argon2。密码哈希是其中一项功能not由odium_compat 提供。

// Password hashing:
$hash_str = sodium_crypto_pwhash_str(
    $password,
    SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE,
    SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE
);
// Password verification:
if (sodium_crypto_pwhash_str_verify($hash_str, $password)) {
    // recommended: wipe the plaintext password from memory
    sodium_memzero($password);

    // Password was valid.
} else {
    // recommended: wipe the plaintext password from memory
    sodium_memzero($password);

    // Password was invalid.
}

中级:Scrypt

你需要scrypt 扩展 https://github.com/DomBlack/php-scrypt可通过 PECL 获得:

pecl install scrypt
echo "extension=scrypt.so" > /etc/php5/mods-available/scrypt.ini
php5enmod scrypt

一旦安装完毕,使用它就相当简单了:

// Hashing:
$hash = \Password::hash($userProvidedPassword);
// Validation:
if (\Password::check($userProvidedPassword, $hash)) {
    // Logged in successfully.
}

真正使用 scrypt 的唯一原因是兼容性;此时,请选择 Argon2 或 bcrypt。

可以接受但不太好:PBKDF2

我强烈推荐去Defuse Security 的跨平台密码哈希库 https://github.com/defuse/password-hashing如果您需要 PBKDF2。 (你应该考虑只使用password_*, 然而!)

$hash = PasswordStorage::create_hash($password);
if (PasswordStorage::verify_password($password, $hash)) {
    // Success
}

上述任何一个选择都是可以接受。 Argon2 可能是最安全的,但它尚未在 PHP 中广泛使用。任何未包含在该列表中的内容都应该以适当的怀疑态度来看待。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2016 年最佳密码存储算法 的相关文章

  • Laravel 5 通过外部 API 对用户进行身份验证

    我想知道是否可以扩展内置身份验证以使用外部 API 来对用户进行身份验证 我是 Laravel 新手 非常感谢您的帮助 我正在 Laravel 5 2 中为我的客户制作一个自定义应用程序 但我无法直接访问他们的数据库服务器 我只能调用他们的
  • 如何编写一个 SQL 查询来计算每月和每年的行数?

    有谁知道如何查询 vbulletin 数据库来生成每月 每年注册数量的报告 以获得如下结果 MM YYYY Count 01 2001 10 02 2001 12 感谢下面的这些答案 我的最终版本有效如下 SELECT COUNT as R
  • Flex 和 crossdomain.xml

    我想知道将 crossdomain xml 添加到应用程序服务器的根目录是否存在任何安全问题 它可以添加到服务器的任何其他部分吗 您是否知道任何不需要服务器放置此文件的解决方法 谢谢 达米安 通过添加 crossdomain xml 主要的
  • 如何使用 Laravel 5.3 注销并重定向到登录页面?

    我正在使用 Laravel 5 3 并尝试实现身份验证系统 我用了php artisan命令make auth来设置它 我根据我的布局编辑了视图 并将其重定向到我的仪表板页面而不是主页 在设置中设置为默认值 现在 当我尝试注销时 它向我抛出
  • 是否存在类似于适用于 Ruby 的 ActiveMerchant 的 PHP 项目?

    我很好奇是否有人知道 ActiveMerchant 中存在的具有类似通用支付处理器功能的 PHP 功能 如果您正在寻找类似 PHP 中的 Active Merchant 的内容 请检查this http github com akDevel
  • 递归树遍历 - 如何跟踪递归级别?

    我基本上试图从表示树结构的多维数组构建 html ul li 嵌套列表 下面的代码工作正常 但我想改进它 我需要一种方法来跟踪递归级别 以便我可以将不同的类应用于不同的级别 向生成的输出添加缩进等 function buildTree tr
  • nginx + php-fpm = 找不到文件

    当我尝试访问时info php我得到一个File not found error 我尝试了一些教程但无济于事 配置 默认 server listen 80 listen 80 default ipv6only on server name
  • MySQL ifnull 相当于 php

    我的场景 exTime get cfg var session gc maxlifetime get cfg var session gc maxlifetime 1440 我希望它像 mysql 一样 exTime isnull get
  • 如何使用Google API PHP SDK获取用户信息

    我正在尝试为拥有 Google 帐户的用户添加登录选项到我的网站 我已经能够实现这个 Facebook 但在使用 Google 获取用户帐户信息时遇到问题 我正在使用位于此处的 Google PHP SDK https github com
  • Gmail 搜索怎么这么快?

    搜索这么多字符的最有效方法是什么 你怎么认为 假设网站是用 PHP 和 MySQL 构建的 我应该学习什么才能尽可能有效地构建它 有什么我应该学习的算法吗 文本索引算法 https stackoverflow com questions 4
  • Preg在html标签之间匹配php中的文本

    您好 我想在 PHP 中使用 preg match 从 html 文档中解析出以下内容中的 所需文本 p class review Desired text p 通常我会使用 simple html dom 来做这样的事情 但在这种情况下它
  • parse_str():jwage/purl 中不推荐调用不带结果参数的 parse_str()

    public function postIndex url new Url https www dropbox com 1 oauth2 authorize url gt query gt setData response type gt
  • Laravel - 重复键批量插入更新大数据集

    我有大约 80k 条记录 每天需要多次运行插入 更新脚本 INSERT INTO my rankings id rank VALUES 1 100 2 99 3 102 80000 3 ON DUPLICATE KEY UPDATE ran
  • 将平面数组拆分为分组子数组,其中包含输入数组中连续键的值

    我有一个数组array diff函数 如下所示 Array 0 gt world 1 gt is 2 gt a 3 gt wonderfull 5 gt in 6 gt our 正如您所看到的 键 3 和键 5 之间有一个间隙 即没有键 4
  • 将延期交货库存状态添加到 Woocommerce 可变产品下拉列表中

    我想在下拉菜单中显示可变产品的库存状态 包括 缺货 因为我网站上的大多数产品都缺货 而不是 缺货 我已经尝试过答案如何将变体库存状态添加到 Woocommerce 产品变体下拉列表中 https stackoverflow com ques
  • 根据哈希值确认文件内容

    我需要 检查完整性 content文件数量 文件将写入 CD DVD 可能会被复制多次 这个想法是识别正确复制的副本 在从 Nero 等中删除它们之后 我对此很陌生 但快速搜索表明Arrays hashCode byte http down
  • 根据用户的时间设置问候语(早上好,下午好......)

    任何人都可以推断如何根据用户的时间设置实现基本的 晚上好 或 早上好 也许 PHP 会获取服务器时间 但我希望用基于时间的适当问候语来问候网站访问者 并考虑到他们一天中的时间 E G 早上好 晚上好 下午好 基于它 getHours 日期对
  • PHP:如何使用 nl2br() 和 HTML Purifier 保持换行?

    Issue 使用时HTML 净化器 http htmlpurifier org 为了处理用户输入的内容 换行符不会被转换为 br tags 考虑以下用户输入的内容 Lorem ipsum dolor sit amet This is ano
  • 在 PHP 上发送不带 SMTP 标头的 SMS

    我正在尝试使用以下对我有用的代码通过 PHP 发送短信验证码 但我越来越 email protected cdn cgi l email protecti
  • PHP Session Id 在页面之间发生变化

    我有一个问题 我在 2 个页面之间丢失了 PHP 会话 session start 包含在一个名为 session inc php 的文件中 该文件包含在每个需要设置会话的页面中 这适用于网站上除一个特定页面 member profile

随机推荐

  • Angular 代码味道“要么删除此导入,要么将其添加为依赖项。”当使用我编写的接口时。如何使我的代码合规?

    我是 UI 开发的新手 所以如果这不是有角度的 请原谅我 我在这里使用 Angular 8 和 typescript 无论如何 我创建了一个弹出模式 我不想在整个网站上使用它 它看起来很棒 但是当我像这样将它插入我的组件时 import I
  • 如何在 iPhone 模拟器中测试相机?

    有没有什么方法可以在模拟器中测试iPhone相机而无需在设备上部署 这看起来非常乏味 您必须在设备上测试许多特定于设备的功能 但这并不比使用模拟器难 只需为设备构建一个调试目标并将其连接到计算机即可 需要实际设备的操作列表 实际手机 相机
  • ASP.Net MVC3 下拉列表和传递数据

    我有这个控制器 public ActionResult Index IList
  • 实例初始值设定项单元测试失败并显示“存储未定义”

    生成示例应用程序后 ember new preloadtest cd preloadtest ember g instance initializer preload ember g model test data ember g rout
  • 未捕获的引用错误:d3 未定义

    我是 Web 开发新手 我正在尝试将基于 D3 的 JS 可视化上传到 Weebly 域 我已将所有必需的文件上传到我的 Weebly 站点 并在 JavaScript 中正确引用了它们 但在这一行中不断收到 Uncaught Refere
  • 素数测试,2 位数字

    我想打印所有两位数长的质数 这是我的代码 for int input 11 input lt 99 input 2 for int x 2 x lt int Math sqrt input 1 x if input x 0 System o
  • 检测 UISwipeGesture 后手指何时抬起[识别器]

    我已经设置了一个UISwipeGestureRecognizer UISwipeGestureRecognizer swipe UISwipeGestureRecognizer alloc initWithTarget delegate a
  • 如何撤消 git merge 挤压?

    我刚刚做了一个 git merge squash feature branch into my develop branch 问题是上面的命令更新了头部而没有创建新的提交 我的目的是创建一个单独的提交来应用于头部develop 简而言之 日
  • 对于这个 I/O 密集型操作,为什么 asyncio 库比线程慢?

    我正在编写一个 python 程序 用于枚举网站的域名 例如 a google com 首先 我使用了threading模块来执行此操作 import string import time import socket import thre
  • height/minHeight 和 display:flex 的行为

    我正在观察以下行为 这段代码 div div div div div div div div 结果是这样的 See 红色边框 看起来带有 id 地图的 d
  • 如何使用 VueJS 防止数字输入

    我需要创建一个验证来防止用户在文本框中输入数字 我找到了一些使用本机 JavaScript 的解决方案 但它在我这边不起作用 在我的文本框中我有这个触发器 v on keyup preventNumericInput event gt 在我
  • Node.js:EBADF,错误文件描述符

    如果我多次重新加载我的应用程序 从浏览器中使用重新加载按钮 例如50 reload 10 seconds它给了我这个错误 events js 45 throw arguments 1 Unhandled error event Error
  • 迁移工作项数据时出错[重复]

    这个问题在这里已经有答案了 迁移工作项数据时出现以下错误 由于以下原因 配置失败 com opshub exceptions DataVaIidationException OpsHub 012017 字段 映射名称 10 1 I 31XD
  • HTML 重复 ID

    我的控件是根据用户输入动态构建的 有nID 也是动态的文本框 然而 我没有预见到这个 HTML 会在同一 html 页面的其他地方重用 我现在面临的问题是重复的 ID 这导致我的 jQuery 函数无法正常工作 我确实明白 ID 应该是唯一
  • Math.Net 解值为 0 的线性方程组

    我试图在 Math Net 中求解矩阵 当矩阵的实际解之一为 0 时 但我得到 NaN 作为结果 这是一个示例矩阵 为简单起见已对其进行了简化 1 0 1 10000 0 1 1 1000 0 0 0 0 代码示例 public void
  • 重构 Form_for 创建多态关联中注释的方法

    我正在研究我的第一个多态关联关系 但在重构我的 form for 创建评论时遇到了麻烦 我尝试浏览多态协会 RailsCastshttp railscasts com episodes 154 polymorphic association
  • .htaccess,将404错误重写到其他域

    如何将所有 404 错误重定向到另一个域 我找到了 Error 404 http example com error html 但是我需要 if Error 404 http example com 1 我试过了 RewriteEngine
  • python 中的随机()

    在Python中的函数random 均匀地生成半开范围 0 0 1 0 内的随机浮点数 原则上它能生成 0 0 即零 和 1 0 即统一 吗 实际应用中是什么样的场景呢 0 0可以生成 1 0不能 因为它不在范围内 因此 相对于 生成概率0
  • 在 Swift 中将图像(或视频)发布到服务器

    您好 我正在使用 NSURLSession 快速将 json 数据发布到服务器 如下所示 var request NSMutableURLRequest URL NSURL string http mypath com var sessio
  • 2016 年最佳密码存储算法

    实际上我读了很多与算法相关的帖子 比如md5 sha1等等 但我仍然不确定哪一种是当今最安全且最好使用的 我是网络开发的初学者 我要求世界上所有最好的程序员来教我并向我展示 我希望你们能给我选择和使用它的例子 谢谢 顺便 2016 年如何安