这是一个关于我的安全流程是否适合我存储的信息的问题。
我正在使用带有SQL 后端的ASP.NET 4.0构建一个网站,并且需要知道我的安全性如何在密码和哈希等方面保持不变。
我不会将任何关键信息存储在某人身上 - 没有real names, addresses, credit card
个详细信息或类似的内容......只有email and username
。
目前,我故意遗漏一些细节,因为我不确定是否会告诉你他们会削弱我的安全性但如果不是,我可以稍微透露一下。
我是这样做的:
50 chars
长6 chars)
(我HTMLEn输入输入并使用parameterized
存储过程,因此我不会限制字符)SSL
...我理解在普通http
上发送身份验证详细信息的含义但我问过我主持人要添加证书,以便它很快就准备就绪。这是我需要确定的哈希位!
我从以下字符集创建一个随机100
字符盐(我只使用System.Random类,没有 cryptographic
) - abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ0123456789!£$%^*()_{}[]@~#<,>.?
< / p>
然后将其与密码合并,然后使用 SHA-512 (SHA512Managed class)
进行数万次哈希(几乎 2 seconds on my i7 laptop
以产生最终结果散列)。
然后将此最终散列转换为base64
字符串,并与数据库中已经散列的密码进行比较(salt也存储在数据库的另一列中)
一些问题(暂时忽略了SSL
的缺失,我还没有购买证书但它将在一周左右准备好了):
这会让你足够安全吗?我知道有一定程度的安全性,如果有足够的时间和资源,任何事情都是可以破解的,但考虑到我不存储关键数据,这看起来是否足够?
显示我散列密码的实际次数会削弱我的安全性吗?
100
字符盐是否与20
字符有任何区别?salt
,这是否会削弱我的安全性?答案 0 :(得分:4)
所以,让我们一个接一个地回答你的问题:
没有。 绝对不够“足够安全”。
没有看到代码,很难说更多。但事实上你正在进行直接SHA512
而不是做HMAC表明存在一个问题。不是因为您需要使用HMAC,而是因为大多数为此目的而设计的算法都使用HMAC(出于几个原因)。
似乎你正在做hash = SHA512(hash)
(仅从你的措辞中),这被证明是坏事。
所以没有看到代码,很难肯定地说,但它没有指向正确的方向......
不,不应该。如果是这样,那么算法中的其他地方就会出现问题。
不。所有的盐都是使哈希唯一(强制攻击者分别攻击每个密码)。你所需要的只是一个足够长的盐,在统计上是独一无二的。感谢Birthday Problem,128位对于1/10 ^ 12碰撞机会来说已经足够了。这对我们来说很充足。这意味着16个字符是盐效率的上限。
这并不意味着坏使用更长的盐。它只是意味着使它超过16个字符不会显着增加它提供的安全性......
如果确实如此,您的算法存在严重缺陷。如果是,则相当于Security Through Obscurity。
这里真正的答案是不重新发明轮子。像PBKDF2和BCRYPT这样的算法就是为了这个目的而存在的。所以使用它们。
答案 1 :(得分:2)
http://security.stackexchange.com有关于这个主题的一些主题,你应该检查一下。
一些额外的注意事项 - 严重的攻击者会比你的笔记本电脑更快地破解sha512哈希。例如,你可以从亚马逊或类似的地方租用一些带有几个特斯拉GPU的服务器,并以几十亿哈希/秒的速率开始破解。 Scrypt尝试通过使用内存密集型操作来防止这种情况。
密码最少6个字符是不够的,至少8个。一个相关的图像,我没有验证时间但它给出了一个粗略的估计并给你一般的想法(不包括字典攻击,可以更长的目标密码):