【问题标题】:BCrypt generated + hard-coded Salt: Is this more safety?BCrypt 生成 + 硬编码 Salt:这样更安全吗?
【发布时间】:2019-05-22 03:56:30
【问题描述】:

我发现了一篇关于 BCrypt 的博文,但我不确定在密码中添加硬编码的 Salt "^Y8~JJ" 的好处是什么?

包含盐和加密密码的“hashToStoreInDatabase”,但不包含硬编码盐“Y8~JJ”。所以,如果有人窃取了数据库,黑客用盐(包含在数据库中)和散列密码生成自己的彩虹表是没有用的,因为他们永远不会得到硬编码的盐“Y8~JJ”。

(我知道将盐和密码哈希保存在一起已经很安全了,因为生成彩虹表很昂贵)

是否推荐使用 BCrypt?

引用自:https://www.codeproject.com/articles/475262/useplusbcryptplustoplushashplusyourpluspasswords

private void SetPassword(string user, string userPassword)
{
   string pwdToHash = userPassword + "^Y8~JJ"; // ^Y8~JJ is my hard-coded salt
   string hashToStoreInDatabase = BCrypt.HashPassword(pwdToHash, BCrypt.GenerateSalt());
   using (SqlConnection sqlConn = new System.Data.SqlClient.SqlConnection(...)
   {
     sqlConn.Open();
     SqlCommand cmSql = sqlConn.CreateCommand();
     cmSql.CommandText = "UPDATE LOGINS SET PASSWORD=@parm1 WHERE USERNAME=@parm2";
     cmSql.Parameters.Add("@parm1", SqlDbType.Char);
     cmSql.Parameters.Add("@parm2", SqlDbType.VarChar);
     cmSql.Parameters["@parm1"].Value = hashToStoreInDatabase;
     cmSql.Parameters["@parm2"].Value = user;
     cmSql.ExecuteNonQuery();
   }
 }

private bool DoesPasswordMatch(string hashedPwdFromDatabase, string userEnteredPassword)
{
    return BCrypt.CheckPassword(userEnteredPassword + "^Y8~JJ", hashedPwdFromDatabase);
}

【问题讨论】:

    标签: cryptography bcrypt salt


    【解决方案1】:

    实际上叫pepper。盐存储在 DB 中,但胡椒存储在 DB 之外的其他地方。

    维基百科称;

    辣椒的作用与盐类似,但盐不是秘密的(只是唯一的)并且可以与散列输出一起存储,而辣椒是秘密的,不能不能与输出一起存储强>。哈希和盐通常存储在数据库中,但辣椒必须单独存储(例如在配置文件中),以防止在数据库泄露的情况下被攻击者获取。

    当数据库被黑后,攻击者无法访问辣椒,因此即使是弱密码也无法进行密码搜索。

    简而言之,是的,推荐。

    但是,Bcrypt 已经过时了。应该使用 Argon2 作为password hashing competition.的获胜者

    【讨论】:

    • 谢谢,这对我理解作者在密码中添加这些字符的原因很有帮助!
    • 并注意112 bits is recommended by NIST
    猜你喜欢
    • 2016-05-28
    • 2014-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多