【问题标题】:How can I check that password is correct if I add random salt?如果我添加随机盐,如何检查密码是否正确?
【发布时间】:2019-06-16 19:31:02
【问题描述】:

我正在尝试保护我的 c# 应用程序。我知道我们必须在数据库中存储密码哈希和盐。所以我的问题是:如果我使用随机盐,我如何比较该密码是否正确?(随机盐每次都会给出随机值)。 我也有下面的代码

 public static string HashPassword(string p, string s)
    {
        var combinedPassword = String.Concat(p, s);
        var sha256 = new SHA512Managed();
        var bytes = UTF8Encoding.UTF8.GetBytes(combinedPassword);
        var hash = sha256.ComputeHash(bytes);
        return Convert.ToBase64String(hash);
    }

    public static String GetRandomSalt()
    {
        var random = new RNGCryptoServiceProvider();
        var salt = new Byte[1024];
        random.GetBytes(salt);
        return Convert.ToBase64String(salt);
    }

总的来说,我愿意接受其他建议。

【问题讨论】:

标签: c# database hash passwords salt


【解决方案1】:

总的来说,我愿意接受其他建议。

我将在这篇文章的开头提出一个广泛的观点,但我相信它的广泛性足以不构成“意见”。

如果您这样做是为了“保护您的应用”,请立即停止。有更好的解决方案,例如 BCrypt、Scrypt 和 Argon,它们可以为您解决所有这些问题,并防止大多数人甚至没有考虑过的威胁。这些当然包括内部的盐,因此了解它们的用途以及它们的工作方式仍然是一项有用的工作。对于大致相同数量的代码,您将比发布的代码显示的更安全地处理凭据很多。谷歌他们了解详情。

如果您只是将其作为“了解其工作原理的练习”,请继续阅读。

那么究竟什么是盐,为什么它对保护安全有用?

盐是额外的熵,它不是用户密码的一部分,而是在密码被散列和存储时服务器已知或发明的。验证密码时,服务器必须知道生成的盐。有很多方法可以存储它。它可能是存储在数据库中的密码哈希的第一个/最后一个/中间/每 8 个/任何 n 个字符。它可能有自己独立的字段。它甚至可能基于其他不可变的事实,例如用户记录本身的主键。

可以这样描述它所防御的威胁模型。考虑一个被破坏并现在由恶意行为者持有的数据库。挑战在于,鉴于恶意行为者持有凭证(以散列形式),我们能否阻止他们猜测人们的密码(至少无需尝试某种字典或暴力猜测攻击。

如果您认为哈希解决了这个问题,那么我将给出两种可能的情况:

1.两个用户可以使用相同的密码

如果密码经过哈希处理但未加盐,则选择相同密码的两个用户最终会得到相同的哈希值。即使密码不是“可怕的”,其他用户也可能通过他们输入的“密码提示”来泄露您的密码。如果密码被加盐,那么密码提示泄露其他用户密码的事实并不会泄露相同密码可以在您的帐户上使用的事实。

2。彩虹桌

如果你有足够的时间和计算能力,你可以生成(或下载)一组彩虹表。这些基本上是键值对,其中键是哈希值,值是原始密码。这些是反向生成的。也就是说,取一个字符串,对其进行hash,加上hash为key,原始字符串为target。要查找,您只需查找哈希键并查看返回的值。马上就近了。但是,对于足够长的原始字符串,它不会被预先计算,因此它不会在彩虹表中受到影响。如果我知道您使用的盐和哈希算法,我仍然可以进行自己的字典攻击或蛮力攻击,但突然我需要依次尝试每个猜测,直到我幸运,所以如果你的密码很好,我不会在“合理的时间”找到它。

你提出的问题的准确答案

如果我使用随机盐,如何比较密码是否正确?

您的验证过程需要知道或准确得出为哈希过程选择的确切盐值。盐可能是随机生成的,但如果是这样,它需要记录使用的确切值。

【讨论】:

    【解决方案2】:

    首先,您必须通过用户名在数据库中获取盐,然后将其与发布的密码进行哈希处理,最后将其与存储在数据库中的密码进行比较

    【讨论】:

    • 是的,这是关键点,要验证密码,必须使用与计算密码哈希以进行存储时使用的相同的盐对其进行哈希处理。具有相同盐的哈希具有可比性。
    猜你喜欢
    • 1970-01-01
    • 2020-04-16
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 2023-03-17
    • 2015-12-28
    • 1970-01-01
    • 2011-04-30
    相关资源
    最近更新 更多