Salt Generation 和开源软件

2024-01-14

据我了解,生成盐的最佳实践是使用源代码中存储的一些神秘公式(甚至魔术常数)。

我正在开发一个计划作为开源发布的项目,但问题是源代码带来了生成盐的秘密公式,因此能够在我们的网站上运行彩虹表攻击。

我认为很多人在我之前已经考虑过这个问题,我想知道最佳实践是什么。在我看来,如果代码是开源的,那么盐根本没有意义,因为盐可以很容易地进行逆向工程。

想法?


由于有关加盐哈希的问题经常出现,并且对该主题似乎存在相当大的困惑,因此我扩展了这个答案。

什么是盐?

盐是一个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 位值,将占用不到200 http://www.google.com/search?q=62%5E8+*+2%5E16+*+128+bits+%3D 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://security.stackexchange.com/users/655/)
如果任何安全专业人士发现问题,请发表评论或编辑此 wiki 答案。

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

Salt Generation 和开源软件 的相关文章

随机推荐

  • 使用本地文件在远程数据库中执行 COPY 命令

    我正在尝试执行 PostgresCOPY命令 COPY warehouse terminal test table FROM C file csv DELIMITERS E t CSV HEADER QUOTE E ESCAPE E NUL
  • 使用 Json.NET 从 Json String 反序列化嵌套 DataSet

    我尝试使用 Json NET 从 JSON 字符串反序列化数据集 Json 字符串包含我想要使用的状态 消息和表 status ok message table column1 value1 column2 value2 column1 v
  • 该网站如何知道我正在打开另一个选项卡?

    当我登录一个网站 这是我大学的 学习系统 时 我发现我无法打开打开同一网站的新选项卡 当我这样做时 该网站不知何故会意识到并显示以下消息 该网站到底如何知道我在计算机上打开了哪些选项卡 据我所知 前端代码不应该访问我的私人浏览器信息 该网站
  • Jquery hasClass + If 语句

    我希望以下 loadContent 函数仅在单击的链接具有特定类时加载目标 div 这是我到目前为止所想出的 function loadContent targetDIV sourceURL if this hasClass done ta
  • 如何清理 TeamCity 中旧的失败构建?

    我们在 TeamCity 中确实有数百个失败的构建 由于旧的失败设置重试 数量特别高 现在浏览历史记录非常痛苦 我只想清理旧的失败构建 TeamCity 中有办法做到这一点吗 正常的清理策略只允许在上次成功构建之前的 X 天进行清理 在 T
  • 执行默认信号处理程序

    我编写了一个应用程序 其中我为 linux 中的不同信号注册了多个信号处理程序 进程接收到信号后 控制权将转移到我注册的信号处理程序 在这个信号处理程序中 我做了一些我需要做的工作 然后我想调用默认信号处理程序 即SIF DFL or SI
  • Bash - 文件意外结束[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我一直在编写 bash 脚本来对程序运行测试 但我似乎无法找到语法错 误 当我使用 x 时 它告诉我它正在等待 但我找不到它 请参
  • 禁用 JSHint 警告:需要赋值或函数调用,但看到的是表达式 [重复]

    这个问题在这里已经有答案了 我有以下几行 imageUrl data imageUrl imageUrl 对于这一行 JSHint 抱怨道 Expected an assignment or function call and instea
  • 在非管理员用户下从远程运行 PS cmdlet - 访问被拒绝

    我正在尝试通过 Invoke Command 远程运行 Get ScheduledTask 该用户是非管理员 但属于 远程管理用户 的一部分 PS 远程处理工作正常 在本地运行命令效果很好 但是通过 Invoke Command 运行它会出
  • FSM actor 在转到相同状态后不会触发 onTransition

    根据Akka FSM 文档 http doc akka io docs akka snapshot scala fsm html 笔记 可以使用 goto S 或stay 实现相同状态转换 当前处于状态 S 时 它们之间的区别在于 goto
  • Osmdroid - 自定义离线图块源更改位置

    我使用此代码来显示离线 Osmdroid 地图图块 问题是 我已将图块存储在位置 sdcard emulated0 0 中 有什么方法可以将它传递到 XYTileSource 中吗 Thx myMapView setTileSource n
  • jQuery iframe 模式关闭表单提交

    我有一个 jQuery 模态对话框 其中包含一个 iframe 该 iframe 包含一个表单 当用户提交表单时 我想关闭模式对话框 我怎样才能做到这一点 index php 上的 jquery 模态脚本
  • 如何修复客户端首选项不接受服务器选择的协议版本 TLS10 [TLS12]

    我想使用 sql server 数据库运行 spring boot 应用程序 但是当我运行它时 出现以下错误 com microsoft sqlserver jdbc SQLServerException The driver could
  • Webstorm 6 - 如何使 scss 文件观察器忽略文件

    我希望 SCSS 文件的文件观察器忽略文件名以下划线开头的文件 例如 buttons scss 我该怎么做呢 首先向您想要忽略的文件添加 完成 来自文档 http sass lang com docs yardoc file SASS RE
  • 尝试设置 Laravel 4 给出“无法打开流:没有这样的文件或目录”

    尝试在 Mac 上设置 Laravel 4 我已经安装了 Composer 但是当我通过 XAMPP 进入公共文件夹时 我得到以下信息 警告 require Applications XAMPP xamppfiles htdocs lara
  • 在 Python 脚本中使用 FFProbe

    我对 python 相当陌生 这是我的第一个真正的项目 我遇到了障碍 我这里有一个 wmv 文件 我使用 FFprobe 从 wmv 文件中提取持续时间 以秒为单位 当我在 CMD 中运行以下命令时 ffprobe i Video2 wmv
  • 多对多关联。数据不删除

    我有这个模型 Entity Table name candidate XmlRootElement name candidate public class Candidate ManyToMany mappedBy candidates f
  • 同一个构造函数是否可以有不同的行为?

    我正在写一个 SQL 解释器 我需要区分编译时格式错误的表达式和运行时错误 我将给您提供一个应该格式良好但可能在运行时失败的示例 SELECT ColumnName first name AS name FROM TABLE people
  • 将 OpenXML 中的文本支架替换为图像

    下面的代码使用 OpenXML 在 word 文档的末尾插入图像 我需要做的是尝试在文档中找到名为 Image Holder 的项目 并将其替换为我传递的图像 这是将其添加到文档末尾的当前代码 var element new Drawing
  • Salt Generation 和开源软件

    据我了解 生成盐的最佳实践是使用源代码中存储的一些神秘公式 甚至魔术常数 我正在开发一个计划作为开源发布的项目 但问题是源代码带来了生成盐的秘密公式 因此能够在我们的网站上运行彩虹表攻击 我认为很多人在我之前已经考虑过这个问题 我想知道最佳