algorithm - 密码,盐和安全概念

标签 algorithm security encryption hash

介绍
今天,我做了很多研究,学习了很多关于散列和加密的知识(以及两者之间的重要区别)。我学到的一件事是:人们对腌制的功效意见不一。
在对这个question的回复中(尤其是在对接受答案的评论中),人们得出结论-似乎-在数据库中哈希密码旁边存储随机生成的salt是保护密码的最佳方法。有几个资源表明了这一点,这将是我提出问题的基础。
在这个question中,公认的答案是,通过访问所有可能的散列数据值,salt不会做太多的事情-从经济学上讲-使事情变得更安全(尽管,这将是一个不易实现的大量存储数据)。盐类和散列算法的目的是增加单个密码输入的可能性,使对数据库的基于字典的攻击的效率成倍下降(这里,我更自由地使用“基于字典”一词,指的是-实际上-指的是一个表,无论它是彩虹表,还是一个使用的表对于暴力攻击(每次重新计算),或一个简单的查找表。
零碎的东西
据我所知,一个加密良好的密码需要三件事:
要散列。
与盐一起搅拌。
与随机salt一起进行散列(每个密码项一个salt)
为了让破解者理解存储的哈希,他或她需要四(4)件事:
散列算法的知识
盐的知识
正确的明文密码值(可能作为基于字典的攻击的输入提供(通过与salt结合的算法运行字典))。
安全位
分歧似乎围绕着如何处理盐,即在哪里储存盐我经常看到的一句话是“晦涩难懂的安全”——这似乎是salt的前提(“让我们减少这一点信息的‘可视性’”);然而,从我的阅读中,我明白了晦涩难懂的安全并不真正起作用其前提似乎是:如果攻击者有权访问算法和salt(如果有),他或她就可以找到它。
安全性的前提不只是混合和改变值,而是指数据库、事务或服务器停止攻击的类型:
把盐交给攻击者
允许攻击者强行使用数据库
另一个用户评论说,如果代码暴露给攻击者,作为好代码或者好的安全算法,会阻止攻击成功,这并不重要。
所以,安全是三(3)个因素的组合:
阻止访问存储所有内容的服务器
创建一个防止强行进入数据库的算法
加密事务信息
散列(模糊)敏感数据
对功效盐的担忧似乎源于攻击者有权访问数据库本身的假设。
场景:我有一本字典,你的盐,还有你的散列算法抓取你的密码应该不会有什么麻烦(这就是我们阻止暴力攻击的原因)。
因此,作为这些结论的结果,我的问题(现在在堆栈溢出截断块上)是:
问题
安全性是否也包括对代码位置的保护,例如对散列算法的访问?
为什么为每个密码生成一个随机salt很重要,特别是在数据库已经暴露的情况下,即salt随机性真的会增加信息的安全性吗?这仅仅是由于随机盐(例如,使攻击不那么吸引人)导致攻击的时间呈指数增长的问题吗?
盐的安全性似乎在于攻击者没有盐,而不是严格意义上的随机性。
为什么要把盐储存在数据库里呢?
从本质上说,所有这些安全“东西”(关于散列的功效等)都只是神话吗?也许我只是在回应这样一个想法:没有什么真正的东西是完全防黑客的(我们只是尽我们所能)?
为什么我要问
在我看来,如果你的数据库暴露了,salt-随机与否-并不重要,特别是如果数据库存储了salt。
因此,最佳实践是双重的(盐只会增加一点安全性):(1)敏感信息的散列;(2)在这个问题的背景下,保护数据库免受暴力攻击。似乎有很多错误的信息漂浮在周围(其中一些可能存在于我的上述理解中)。
在这里,我假设对跨站点脚本等的防范已经到位。

最佳答案

与散列存储的信息相比,安全性更重要的是保护代码的位置吗?
安全性是为攻击向量构建缓解措施。有许多类型的攻击和许多类型的缓解措施。你偶然发现了其中一些。
Salt(随散列一起存储的随机字符串)可防止特定的攻击向量——恶意用户通过访问整个表而启动的rainbow attack
Pepper(存储在不同位置的加密随机的秘密salt值)可防止其他攻击——恶意用户发起的dictionarybrute force攻击,该用户可以访问特定用户的散列值和salt,但不能访问其他系统(尤其是存储Pepper的系统)。
如果你仔细阅读,你会发现很多专家认为胡椒或多或少是无用的,相当于“默默无闻的安全”。他们这样认为的原因是,至少在原则上,他们相信如果一个饼干可以访问你的数据库,那么他几乎肯定可以访问存放胡椒的存储位置。
为什么为每个(在本例中)密码生成一个随机salt很重要,特别是在数据库已经暴露的情况下,即salt随机性真的会增加信息的安全性吗?
为了理解为什么这很重要,您必须了解如何使用rainbow table来加速攻击使用rainbow表,cracker可以计算所有已知的常用密码散列值,并扫描整个数据库表以找到它们。这比对每个入口的暴力攻击要快得多。如果一个salt与密码结合在一起,它将使rainbow表无用最后,这一切都是为了通过使问题在计算上不可行来减缓破解速度。
盐的安全性似乎在于攻击者没有它,而不是它的随机性。
这绝对不正确它的全部功能是将哈希的输入从可预测的(例如字典中的一个单词)更改为不可预测的(一个单词与一个随机字符串组合在一起),这又是为了阻挠彩虹表。
为什么要把盐储存在数据库里呢?
当用户登录时,他提供密码而不是盐(他甚至不知道盐)。输入的值必须与salt组合,然后进行散列系统将此哈希与存储在数据库中的哈希进行比较。如果存在完全匹配,则系统可以推断哈希值是使用用户输入的相同密码创建的,因此验证验证尝试。
因为用户不知道盐,所以数据库必须存储它。

关于algorithm - 密码,盐和安全概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26432597/

相关文章:

algorithm - 如何在 3D 网格中线性迭代?

string - 为字符串生成校验和

android - Android 安全项目的想法

java - 如何将 AES 加密中使用的 key 共享给其他应用程序进行解密?

java - 在旋转数组中找到最小值。了解实现

php - 如何防止 PHP 中的 SQL 注入(inject)?

asp.net-mvc - asp.net mvc 的区域级安全性

c# - 如何使用 Rfc2898DeriveBytes 解密以下函数字符串?

java - Apache Tomcat/7.0.35 SSL 证书安装

C# 对 2 个索引进行二分查找