当前位置: 首页 > 知识库问答 >
问题:

为什么传递给crypto.hashpassword的密码不应该加盐?

魏松
2023-03-14

因此,在ASP.NET中,

System.WebHelpers.Crypto.HashPassword("123456");

将创建一个每次都唯一的散列加盐字符串。这是伟大的;这意味着,如果有人设法获得了哈希密码(例如,在SQL注入攻击中),他们将无法使用查找表来查找原始密码。然而,据我所知,他们仍然能够轻松地编写代码,试图在本地强行使用它,而不涉及受害者的服务器,例如:

foreach(string passwordToTry in BigListOfCommonPasswords)
if (Crypto.VerifyHashedPassword(stolenHash,passwordToTry)) return passwordToTry;
System.WebHelpers.Crypto.HashPassword("123456"+getSaltFromWebConfig());

…,还是因为某种原因,这毫无意义?在我看来,让上述暴力攻击变得更加困难是值得的,但我从未在crypto.hashpassword的用法示例中看到过这种想法,所以我是否遗漏了什么?

编辑:这不是为了哈希隐藏盐的必要性的重复。这个问题是问一种不隐藏的盐是否对它有任何用处。我并不反对与散列密码存储在同一位置的salt是有用的,或者将未加盐的密码传递给crypto.hashpassword是有用的。我真正得到的是,添加您自己的、存储在其他地方的额外盐(即使对每个用户都是一样的),在crypto.hashpassword提供的保护之外提供了额外的一层保护。

在暴露数据库的SQL注入攻击的情况下,web.config文件中的附加salt仍然会受到保护(或者至少需要完全不同的攻击才能访问它)。

System.WebHelpers.Crypto.HashPassword("123456"+getSaltFromWebConfig());

使哈希密码对攻击者的用处远小于

System.WebHelpers.Crypto.HashPassword("123456");

对于某些类型的攻击,并且在计算能力或编程时间方面没有太多额外成本。

共有1个答案

呼延光明
2023-03-14

你所描述的盐通常被称为胡椒。关于是否使用胡椒的问题在这里已经得到了非常完整的回答:

最佳实践:加盐和加胡椒密码?

总之,您不应该使用辣椒,因为:

  • 不能更改pepper的值,因为哈希函数是单向的。
  • 添加pepper有效地改变了哈希算法,这只应由专家完成。

但是,如果获得静态秘密比获得密码哈希更难的假设成立,则存在另一种可以提高安全性的选择。而不是添加pepper,只需使用标准对称算法加密hash和salt的组合。这解决了上面提到的两个问题,同时如果加密密钥没有受到损害,仍然可以提高安全性。

 类似资料:
  • 问题内容: 在http://docs.docker.com/engine/reference/builder/#arg中,建议不要通过ARGS传递机密。 注意:不建议使用构建时变量来传递诸如github密钥,用户凭据等秘密信息。 通过构建时变量传递的机密在什么时候处于危险之中? 问题答案: 2018年8月更新: 您现在有了docker 。 2017年1月更新: Docker(swarm)1.13具

  • 问题内容: 我知道不推荐这样做,但是是否可以将用户密码传递给scp? 作为批处理作业的一部分,我想通过scp复制文件,接收服务器当然需要密码,不,我不能轻易地将其更改为基于密钥的身份验证。 问题答案: 您就可以使用一个工具脚本它预期(有得心应手绑定太像Pexpect的为Python)。

  • 问题内容: 为什么此代码无法编译? 为什么我不能将类变量传递给? 问题答案: 该操作符对引用类型,像,而不是对象,如。您可能想要类似 旁注:如果编写,您的代码将更加简洁 但是,我不确定是否需要某种方法。

  • 问题内容: 什么是@id? 在$ resource doc页面上,有人在下面说了这一点,但是我还是不明白。 如果参数值以@开头,则从数据对象中提取该参数的值(对非GET操作有用)。“这里的数据对象是指使用非GET” class“操作的对象,或者如果使用非GET实例操作,则为实例本身。 问题答案: 如果我正确理解了这一点,而我可能没有理解,则该参数说明了向url变量提供数据的另一种方式。 给定此方法

  • 我的老师让我这样做,但在评论区我被告知我不应该这样做。 为什么?

  • 这里是Gradle 2.14和Groovy 2.4.7。我有以下groovy: