time() 是好盐吗?

2024-01-28

我正在查看一些我自己没有编写的代码。该代码尝试使用 SHA512 对密码进行哈希处理,并仅使用time()作为盐。是time()盐太简单了还是这个代码安全?

感谢您的回答和评论。我在这里为新读者总结一下:

  • 每个用户的盐应该不同,因此如果2个用户同时注册,他们的盐将不会是唯一的。这是一个问题,但不是一个大问题。
  • 但盐不应该与用户有任何关系,所以 time() 不是一个好的盐。
  • "使用随机、均匀分布的高熵盐。“——这太拗口了,那么什么样的代码可能会生成一个random, evenly distributed, high entropy salt?

好的,那么我用一个 32 个字符长的随机字符串替换 time() 怎么样?随机字符串可以通过对一组字母字符循环 32 次来生成。听起来不错吗?


简短回答:

No, time()不是好盐。

长答案:

copied from my answer to Salt Generation and open source software https://stackoverflow.com/questions/1645161/salt-generation-and-open-source-software/1645190#1645190

什么是盐?

盐是一种random添加到哈希算法的输入的固定长度的字节集。

为什么加盐(或播种)哈希有用?

向哈希值添加随机盐可确保相同的密码产生许多不同的哈希值。盐通常与哈希函数的结果一起存储在数据库中。 对哈希进行加盐处理有很多好处:

  1. 加盐大大增加了预计算攻击的难度/成本(包括彩虹桌 http://en.wikipedia.org/wiki/Rainbow_table#Rainbow_tables)
  2. 加盐可确保相同的密码不会产生相同的哈希值。 这可确保您无法确定两个用户是否具有相同的密码。和,更重要的是,您无法确定同一个人是否在不同系统上使用相同的密码。
  3. Salting increases the complexity of passwords, thereby greatly decreasing the effectiveness of both Dictionary- http://en.wikipedia.org/wiki/Dictionary_attack and Birthday attacks http://en.wikipedia.org/wiki/Birthday_attack. (This is only true if the salt is stored separate from the hash).
  4. 适当加盐greatly增加了预计算攻击的存储需求,直至不再实用。 (8 个字符区分大小写的字母数字密码,具有 16 位盐,散列为 128 位值,将占用 exabytes http://en.wikipedia.org/wiki/Exabyte没有彩虹减少)。

盐没有必要保密。

盐不是秘密密钥,而是盐通过使哈希函数特定于每个实例来“工作”。使用加盐哈希,则没有one哈希函数,但每个可能的盐值都有一个。这可以防止攻击者进行攻击N哈希密码的时间小于N倍于攻击一个密码的成本。这就是盐的重点。
“秘密盐”不是盐,它被称为“密钥”,这意味着你不再计算哈希值,而是计算消息验证码 http://en.wikipedia.org/wiki/Message_authentication_code(苹果)。计算 MAC 是一件棘手的事情(比简单地将键和值组合成哈希函数要棘手得多),而且它完全是一个非常不同的主题。

必须是随机的对于使用它的每个实例。这确保攻击者必须单独攻击每个加盐哈希。
如果您依赖您的盐(或加盐算法)的秘密,那么您就进入了以下领域:通过默默无闻实现安全 http://en.wikipedia.org/wiki/Security_through_obscurity#Arguments_against(行不通)。最有可能的是,您不会从盐保密中获得额外的安全性;你只会得到温暖而模糊的安全感。因此,它不但不会让您的系统更加安全,反而会分散您对现实的注意力。

那么,为什么盐必须是随机的呢?

从技术上讲,盐应该是unique。盐的要点是每个散列密码都是不同的。这意思是全世界。由于没有中央组织可以按需分配独特的盐,因此我们必须依赖下一个最好的方法,即使用不可预测的随机生成器进行随机选择,最好是在足够大的盐空间内以使得碰撞不可能发生(两个实例使用相同的盐)盐值)。

人们很容易尝试从一些“可能是唯一的”数据(例如用户 ID)中派生出盐,但此类方案通常会因一些令人讨厌的细节而失败:

  1. 如果你使用例如用户 ID,一些攻击不同系统的坏人可能只是集中资源并为用户 ID 1 到 50 创建预先计算的表。用户 ID 是唯一的全系统但不是全世界.

  2. 这同样适用于username:每个 Unix 系统都有一个“根”,但世界上有很多根。 “root”的彩虹表是值得付出努力的,因为它可以应用于数百万个系统。更糟糕的是,还有许多“bob”,其中许多人没有接受过系统管理员培训:他们的密码可能非常弱。

  3. 唯一性也是暂时的。有时,用户会更改密码。对于每个新密码, a new salt必须被选择。否则,攻击者获得旧密码的哈希值和新密码的哈希值可能会尝试同时攻击两者。

使用从加密安全、不可预测的 PRNG 中获得的随机盐可能有点矫枉过正,但至少它provably保护您免受所有这些危险。这并不是为了阻止攻击者知道什么是个人盐是,它是关于不要给他们一个大而胖的目标,而这个目标将用于大量的潜在目标。随机选择使目标尽可能薄。

综上所述:

使用随机、均匀分布的高熵盐。每当您创建新密码或更改密码时,请使用新的盐。将盐与散列密码一起存储。喜欢大盐(至少 10 个字节,最好是 16 个或更多)。

盐不会将坏密码变成好密码。它只是确保攻击者至少要付出字典攻击的代价each他破解了错误的密码。


有用的来源:
stackoverflow.com:密码哈希值的非随机盐 https://stackoverflow.com/questions/536584/non-random-salt-for-password-hashes/536756#536756
布鲁斯·施奈尔:实用密码学 http://www.schneier.com/book-practical.html (book)
又野保安:彩虹表够了 http://chargen.matasano.com/chargen/2007/9/7/enough-with-the-rainbow-tables-what-you-need-to-know-about-s.html
usenix.org:Unix crypt 自 1976 年起就使用 salt http://www.usenix.org/events/usenix99/provos/provos_html/node9.html
owasp.org http://www.owasp.org/: 为什么要加盐 http://www.owasp.org/index.php/Hashing_Java#Why_add_salt_.3F
openwall.com http://www.openwall.com/: Salts http://www.openwall.com/lists/john-users/2005/12/18/1

免责声明:
我不是安全专家。 (虽然这个答案是由托马斯·波宁 https://stackoverflow.com/users/254279/thomas-pornin)
如果任何安全专业人员发现错误,请发表评论或编辑此 wiki 答案。


As for what seems to be a good source for your random salt
Also read: What is the most secure seed for random number generation? https://stackoverflow.com/questions/3436376/what-is-the-most-secure-seed-for-random-number-generation/3532136#3532136
In the absence of dedicated, hardware based, random generators, the best way of obtaining random data is to ask the operating system (on Linux, this is called /dev/random or /dev/urandom [both have advantages and problems, choose your poison]; on Windows, call CryptGenRandom())

If for some reason you do not have access to the above mentioned sources of random, in PHP you could use the following function:
From the source of phpass v0.3 http://www.openwall.com/phpass/

<?php
/**
 * Generate pseudo random bits
 * @copyright: public domain
 * @link http://www.openwall.com/phpass/
 * @param int $length number of bits to generate
 * @return string A string with the hexadecimal number
 * @note don't try to improve this, you will likely just ruin it
 */
function random_bits($entropy) {
    $entropy /= 8;
    $state = uniqid();
    $str = '';
    for ($i = 0; $i < $entropy; $i += 16) {
        $state = md5(microtime().$state);
        $str .= md5($state, true);
    }
    $str = unpack('H*', substr($str, 0, $entropy));
    // for some weird reason, on some machines 32 bits binary data comes out as 65! hex characters!?
    // so, added the substr
    return substr(str_pad($str[1], $entropy*2, '0'), 0, $entropy*2);
}
?>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

time() 是好盐吗? 的相关文章

  • 如何使用CSS将背景图像放入选择选项标签中

    我有一个从 json 响应接收的国家 地区下拉列表 并且想要在国家 地区名称旁边添加相应的国家 地区国旗图标 也从 json 响应获取图像 我已经尝试了不同的 jQuery 和 bootstrap 插件 但他们所做的是破坏我以前的选择框样式
  • 运行没有扩展名的 PHP 页面

    我想在 apache Web 服务器上运行我的 PHP 网页 而不需要 php扩大 所以我添加了以下代码 RewriteEngine on RewriteBase Rewritecond REQUEST URI NC RewriteRule
  • 为什么我不能在 TCPDF 表中使用 č,ć,đ 图表?

    我正在为我的网站构建一个 tcpdf 文件 该 tcpdf 文件中有一个包含一些数据的表格 但我无法使该章程正常工作 对于编码 我使用 windows 1250 宪章女巫不起作用 我已经尝试过 utf 8 但仍然没有得到这个章程 tcpdf
  • 从 octobercms 中的非 ajax 表单获取输入值

    我正在尝试构建一个简单的搜索功能 下面是我的搜索表格
  • 通过 facebook graph API 检索 facebook 用户的邮政编码

    我正在尝试使用 facebook graph API 检索用户的邮政编码 我正在使用以下代码 代码在php ini中 facebook new Facebook array appId gt APP ID secret gt APP SEC
  • 如何在 Web 表单中进行 Html.Encode

    我有一个 ASP NET Web 窗体应用程序 有一个带有文本框的页面 用户在其中输入搜索词用于查询数据库 我知道我需要防止 JavaScript 注入攻击 我该怎么做呢 在 MVC 中我会使用Html Encode Web 表单中似乎无法
  • 限制自己超载外部 API 的速率

    我发现了很多信息和脚本示例 展示了如何对 API 用户进行速率限制 但我无法找到任何示例来说明在施加这些限制时如何对您自己的 API 请求进行速率限制 我总是用诸如以下的代码来限制我的脚本sleep or usleep命令 但感觉这是一种低
  • 如何解码 eval( gzinflate( base64_decode(

    我已将此代码注入到我的网站中 如何解码尾随字符串 我需要知道发生了什么以及其背后的代码是什么 这应该输出将被执行的代码eval 我希望这就是您正在寻找的
  • Laravel 5 中的自定义验证器

    我正在将 Laravel 应用程序从 4 升级到 5 但是 我有一个自定义验证器 但无法运行 在L4中 我做了一个验证器 php文件并将其包含在全局 php using require app path validators php 我尝试
  • 使用php将数据存储到文本文件中?

    我正在尝试将数据存储在文本文件中 例如使用 php 将数组存储到文本文件中 而不是存储到 mysql 数据库中 例如 这里是要存储在文本文件中的数据 name gt john age gt 25 location gt australia
  • 如何仅使用 PHP5 RecursiveDirectoryIterator 类递归显示具有特定文件类型的文件夹和子文件夹

    您好 我正在尝试使用 FilterIterator 上的扩展来获取 RecursiveDirectoryIterator 类 但由于某种原因 它仅在根目录上进行迭代 我的代码是这样的 class fileTypeFilter extends
  • PHP 数组通过 JSON 转为 jquery 数组

    我有点困惑为什么以下不起作用 get php
  • 检查条件并通过 Zend 中的 Regex 识别 url 中的模式

    我正在实现 Zend Regex 路由 并且必须对 url 执行多次检查 例如 如果这是我的网址 http localhost application public index php module controller action 这是
  • 从数据库填充复选框

    我有两个表 第一个由与名称关联的 id 组成 1 汽车 2 火车 3 普通 ETC 第二个表由两个字段 user id 和第一个表中的 id 组成 例如 1 1 2 1 3 当用户转到该页面时 我试图重新填充选定的复选框 首先 您查询数据库
  • 如何在 Zend Framework 3 中注册自定义表单视图助手

    我正在将继承的 Zend Framework 2 应用程序迁移到 Zend Framework 3 并且在注册自定义表单视图助手时遇到了一些困难 这些助手在应用程序使用版本 2 时起作用 主要用于添加标签属性以实现可访问性 例如 这是一个自
  • 如何使用 PHP 对字符串进行 rot13 处理?

    我有一个很大的 php 代码 我想手动对其进行编码和解码 我的问题是 php 代码里面有很多单引号和双引号 因此我在使用时出现错误str rot13 功能如下 那么正确的语法是什么以及如何使用下面的函数进行编码 str rot13 That
  • 从 PHP 数组生成 HTML 表

    我不明白这一点 我需要解决看似简单的问题 但这超出了我的逻辑 我需要编写一个函数 table columns input cols 它将输出一个表 示例 input array apple orange monkey potato chee
  • 如何在laravel中注册后自动登录

    我在 laravel 中注册用户时遇到问题 user假设是包含所有数组元素的数组 同时自动登录以下代码结果false 数据库中保存的密码是hash make password user id this gt user model gt ad
  • 使用 php-ews(Exchange Web 服务)在特定日期后获取电子邮件

    在我的 PHP 脚本中 我需要弄清楚如何检索指定消息 ID 之后或特定日期之后的所有电子邮件 两者都可以 我只需要检索自上次抓取收件箱以来的新电子邮件 这个收件箱每天收到数千封电子邮件 而且我在 30 天内无法删除任何电子邮件 对于初始导入
  • 为什么我的会话仍然存在?

    我一定很愚蠢 因为似乎一件相当明显的事情现在让我完全困惑 我有一个会议 ie SESSION handbag id 在某个时刻 我需要彻底终止这个会话 ie at the start of the page session start el

随机推荐

  • 如何判断 Froyo 中何时发生配置更改?

    在我的应用程序中 我希望播放一个媒体文件 并且在用户旋转屏幕 破坏 Activity 时继续播放 但如果用户移动到不同的 Activity 或另一个 Activity 出现在该 Activity 上 我希望它停止播放 他们按下后退按钮 无论
  • 如何使一种形式保持在另一种形式之上?

    我已经找到了Form TopMost属性 但它将表单置于所有内容之上 包括不属于我的应用程序的内容 我怀疑我在这里遗漏了一些明显的东西 是Form非模式对话框的正确基类 使用对话框窗体的 Form Owner 属性并将其设置为主窗体 在这里
  • 强制将 XML 字符实体放入 XmlDocument 中

    我有一些如下所示的 XML
  • 无法安装测试飞行中的应用程序。此请求有错误

    在装有 iOS 8 3 的 iPhone 5 上 重置所有设置 后 我无法通过 TestFlight 安装测试版 azimov 问题来自 OS 8 3 我们只有 OS 8 3 上的设备才会遇到同样的问题 我个人尝试过重新邀请 更改苹果账户
  • 未捕获的引用错误:React 未定义

    您好 我知道此类问题已被问过很多次 但我无法得到答案 我正在尝试编写一个 React hello world 示例 我只有两个文件 一个是 app jsx 另一个是 homepage jsx 我正在使用 webpack 来捆绑文件 但是当我
  • 当 FlowDocument 放置在带有自定义玻璃的窗口中时,子元素中的 ClearType 会丢失

    因此 新的 WPF 4 文本渲染看起来很棒 但在窗口上启用航空玻璃效果需要将背景更改为透明 这当然会禁用 ClearType 渲染 使用提供的 RenderOptions ClearTypeHint Enabled 允许您指定子元素以从树中
  • 如何解决Wordpress中阻止具有来源的框架访问跨来源框架错误? [复制]

    这个问题在这里已经有答案了 我正在开发一个 WordPress 网站 其中安装了很多 WordPress 插件 WordPress网站上安装的插件有以下选项 当我点击查看详情选项 我得到如下图所示的空白屏幕 但是当我在新窗口或选项卡中打开时
  • PhoneGap 捕捉 iPhone 的“Go”按下事件

    我想知道如何使用 PhoneGap 捕获 Go 按下事件 我有一个带有 2 个输入字段的表单 当用户按下键盘中的 Go 时 如何捕获 我尝试将输入字段对接Form并添加了一个onSubmit方法 在我的 Js 中我有这个方法 functio
  • 使 Swing 组件同步

    我正在阅读Java线程第三版 作者 Oaks 和 Wong O Reilly 2004 他们在整本书中都有一个 Swing 打字游戏的例子 他们定义的类大多是自定义子类javax swing JComponent 在我看来 非常错误的是他们
  • ArrayList中ensureCapacity方法中使用的逻辑

    我正在浏览ArrayList的源代码 我遇到了 EnsureCapacity 方法 它增加了内部使用的数据数组的容量 其中 数据阵列的新容量是根据逻辑增加的int newCapacity oldCapacity 3 2 1 其中旧容量是当前
  • 我们可以继承并更改odoo中的noupdate =“1”吗?

    是否可以继承一个 xml 并更改其可更新性 我尝试继承 检查操作规则 将 interval number 从 4 小时更改为 1 小时 让它每小时运行一次 我认为它可能不起作用 因为 noupdate 1 有人对此有任何想法吗 是的 您可以
  • 如何从 Textmate 2 的项目抽屉中删除 SCM 文件状态

    我可以从项目抽屉中的文件中删除这些状态图标吗 即下图中的红色 x 和绿色 我尝试从 Textmate 中删除一些 SCM 捆绑包 但这并没有成功 我正在使用最新版本的 Textmate 2 你可以加scmStatus false到您的 Te
  • 参数号无效:致命错误

    News Feed Data public function newsFeed db getDB stmt db gt prepare SELECT user id as id user nome as nome app id as app
  • 在 Swift 中使用 AVAudioEngine 保存更改时间音调的音频文件

    目前 我正在尝试更改文档文件夹中现有音频文件的时间音调 然后使用 AVAudioEngine 用修改后的文件覆盖旧文件 我已经使用 AVAudioPlayerNode 和 AVAudioUnitTimePitch 完成了第一部分的工作 不过
  • jsp页面如何将int值转换为字符串

    我有一个包含 Map 的地图 我使用它在 jsp 页面上迭代它
  • jQuery/JavaScript - 拥有大量小 .js 文件时的性能问题?

    我有一个包含大量引用的 js 文件的网站 这些是相当小的文件 但我想将我的方法按主题 功能分开 将所有方法保存在一个 js 文件中是否更好 或者拥有许多 20 30 个小文件都只包含一些行没有问题 无论如何 将它们分开进行开发 但您应该考虑
  • ios 11 自定义导航栏位于状态栏下方

    刚刚下载了 xcode 9 我遇到了这个奇怪的问题 在 ios 11 上 我的自定义导航栏似乎只有一半大小 位于状态栏下方 在 ios 10 上工作正常 所以这是我的代码 let newNavbar UINavigationBar UINa
  • 启用 AOP 会破坏我对带有字符串的工厂 bean 的依赖注入

    启用 AOP 会破坏我对带有字符串的工厂 bean 的依赖注入 这是上下文文件中的片段
  • R类型转换表达式()函数()

    我一直在尝试用 R 编写一个程序来实现牛顿法 我基本上是成功的 但有两个小障碍一直困扰着我 这是我的代码 Newton lt function f f guess f lt readline prompt Function f lt rea
  • time() 是好盐吗?

    我正在查看一些我自己没有编写的代码 该代码尝试使用 SHA512 对密码进行哈希处理 并仅使用time 作为盐 是time 盐太简单了还是这个代码安全 感谢您的回答和评论 我在这里为新读者总结一下 每个用户的盐应该不同 因此如果2个用户同时