我的密码存储技术是否足够强大

时间:2013-05-28 09:13:51

标签: asp.net security passwords

这是一个关于我的安全流程是否适合我存储的信息的问题。

我正在使用带有SQL 后端的ASP.NET 4.0构建一个网站,并且需要知道我的安全性如何在密码和哈希等方面保持不变。

我不会将任何关键信息存储在某人身上 - 没有real names, addresses, credit card个详细信息或类似的内容......只有email and username

目前,我故意遗漏一些细节,因为我不确定是否会告诉你他们会削弱我的安全性但如果不是,我可以稍微透露一下。

我是这样做的:

  1. 用户使用其电子邮件和唯一的用户名注册,最长为50 chars
  2. 他们使用键盘上的任何字符创建一个密码(最小6 chars)(我HTMLEn输入输入并使用parameterized存储过程,因此我不会限制字符)
  3. 我向他们发送了一封电子邮件,上面有链接以验证他们是否真实。
  4. 我使用FormsAuthentication来设置身份验证Cookie,但我目前还没有使用SSL ...我理解在普通http上发送身份验证详细信息的含义但我问过我主持人要添加证书,以便它很快就准备就绪。
  5. 这是我需要确定的哈希位!

    我从以下字符集创建一个随机100字符盐(我只使用System.Random类,没有 cryptographic ) - abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ0123456789!£$%^*()_{}[]@~#<,>.? < / p>

    然后将其与密码合并,然后使用 SHA-512 (SHA512Managed class) 进行数万次哈希(几乎 2 seconds on my i7 laptop 以产生最终结果散列)。

    然后将此最终散列转换为base64字符串,并与数据库中已经散列的密码进行比较(salt也存储在数据库的另一列中)

    一些问题(暂时忽略了SSL的缺失,我还没有购买证书但它将在一周左右准备好了):

    1. 这会让你足够安全吗?我知道有一定程度的安全性,如果有足够的时间和资源,任何事情都是可以破解的,但考虑到我不存储关键数据,这看起来是否足够?

    2. 显示我散列密码的实际次数会削弱我的安全性吗?

    3. 100字符盐是否与20字符有任何区别?
    4. 通过揭示我如何加入密码和 salt ,这是否会削弱我的安全性?

2 个答案:

答案 0 :(得分:4)

所以,让我们一个接一个地回答你的问题:

这会让你足够安全吗?我知道有一定程度的安全性,如果有足够的时间和资源,任何事情都是可以破解的,但鉴于我没有存储关键数据,它看起来是否足够?

没有。 绝对不够“足够安全”。

没有看到代码,很难说更多。但事实上你正在进行直接SHA512而不是做HMAC表明存在一个问题。不是因为您需要使用HMAC,而是因为大多数为此目的而设计的算法都使用HMAC(出于几个原因)。

似乎你正在做hash = SHA512(hash)(仅从你的措辞中),这被证明是坏事。

所以没有看到代码,很难肯定地说,但它没有指向正确的方向......

会泄露密码的实际次数会削弱我的安全性吗?

不,不应该。如果是这样,那么算法中的其他地方就会出现问题。

100个字符的盐是否会产生任何差异,例如20个字符?

不。所有的盐都是使哈希唯一(强制攻击者分别攻击每个密码)。你所需要的只是一个足够长的盐,在统计上是独一无二的。感谢Birthday Problem,128位对于1/10 ^ 12碰撞机会来说已经足够了。这对我们来说很充足。这意味着16个字符是盐效率的上限。

这并不意味着使用更长的盐。它只是意味着使它超过16个字符不会显着增加它提供的安全性......

通过揭示我如何加密密码和盐,这会削弱我的安全性吗?

如果确实如此,您的算法存在严重缺陷。如果是,则相当于Security Through Obscurity

真实答案

这里真正的答案是不重新发明轮子。像PBKDF2和BCRYPT这样的算法就是为了这个目的而存在的。所以使用它们。

更多信息(请注意,这些谈论PHP,但概念100%适用于ASP.NET和C#):

答案 1 :(得分:2)

  1. 理论上,你的哈希方案听起来不错。在实践中,听起来你有rolled your own crypto,这很糟糕。使用bcryptscryptpbkdf2。所有这些都是由安全专业人员设计的。
  2. 不是真的,但我认为无论如何都不需要知道。
  3. 否。它只需要对每个用户都是唯一的。盐的目的是防止哈希/彩虹表攻击的预先计算。
  4. 一旦您使用bcrypt(或scrypt或pbkdf2),这不适用
  5. http://security.stackexchange.com有关于这个主题的一些主题,你应该检查一下。

    一些额外的注意事项 - 严重的攻击者会比你的笔记本电脑更快地破解sha512哈希。例如,你可以从亚马逊或类似的地方租用一些带有几个特斯拉GPU的服务器,并以几十亿哈希/秒的速率开始破解。 Scrypt尝试通过使用内存密集型操作来防止这种情况。

    密码最少6个字符是不够的,至少8个。一个相关的图像,我没有验证时间但它给出了一个粗略的估计并给你一般的想法(不包括字典攻击,可以更长的目标密码): Password cracking times