ski*_*iwi 1 security passwords sha
目前我正在使用特定的方案来保护密码,我认为我有一些需要改进的地方.实现是在Java中,所以我更喜欢使用SHA-2 512作为加密形式.
目前我有一个客户端 - 服务器模型,所以这些事情可能发生:
我有这些问题:
当想要破解密码时,攻击者通常会创建冲突攻击.但是碰撞攻击如何足够?如果密码需要用于其他应用程序,如Outlook.com,Facebook或其他任何应用程序(可能使用另一种盐,因为它们与我的应用程序无关),那么碰撞攻击如何呢?你不需要真正的密码吗?
SHA-2 512是否已经使用迭代?即使如此,我是否应该更改加密方法以自动使用多次迭代以及首选多少次迭代?我还读过关于使用随机数量的迭代(在一个范围内),如何确定性地存储随机因子?
我应该为服务器代码中的每次迭代存储系统机密吗?请参见http://blog.mozilla.org/webappsec/2011/05/10/sha-512-w-per-user-salts-is-not-enough/.我可以存储一个数组,它会为每次迭代保留一个静态秘密,第n个秘密用于第n次迭代.没有人能够知道秘密,它们被计算一次(我想加密一些随机字符串),然后基本上存储在服务器的RAM中.
目前我将输入的密码从客户端发送到服务器,只需SHA-2_512(密码),是否应该改进此过程,如果是,如何进行?我不能使用盐,因为客户没有盐.
问候.
TLDR:您需要使用加密通道(如TLS)发送密码.考虑使用bcrypt进行密码散列.
SHA-2 512不是加密算法,它是一种消息摘要算法.加密算法需要密钥和消息才能加密.它产生密文.重要的是加密算法具有解密算法.
ciphertext = E(key, plaintext);
plaintext = D(key, ciphertext);
Run Code Online (Sandbox Code Playgroud)
消息摘要采用一段明文并生成消息摘要.没有相应的反向机制来获取消息摘要并检索原始消息.也没有秘密密钥.
digest = hash(plaintext);
Run Code Online (Sandbox Code Playgroud)
如果攻击者能够访问具有哈希值的数据库,则攻击者可以通过强制攻击检索原始密码,尝试使用哈希算法进行大量猜测.
digest1 = hash(guess1);
digest2 = hash(guess2); //repeat with lots of guesses
Run Code Online (Sandbox Code Playgroud)
首先,通过网络发送哈希值并不安全.它需要通过SSL等安全通信机制发送.如果攻击者可以通过通信拦截哈希,他们就可以计算出原始密码.
一个哈希冲突是不一样的暴力破解密码.当两个不同的消息产生相同的消息摘要时,会引起哈希冲突.
digest1 = hash(plaintext1);
digest2 = hash(plaintext2);
if ( ( plaintext1 != plaintext2 ) && ( digest1 == digest2 ) )
// hash collision
Run Code Online (Sandbox Code Playgroud)
SHA-512没有旨在防止暴力破坏的迭代.SHA算法集旨在提高效率.散列密码时添加迭代的原因是为了增加强制密码所需的时间.与拥有数百万个密码的攻击者相比,执行合法登录尝试和执行100次迭代的成本是微不足道的,每个密码需要100次迭代.添加更多迭代有助于降低提高处理器速度的影响(这将有助于攻击者更快地尝试更多迭代).
您应该将迭代次数设置为针对每个用户存储的可配置限制.因此,您为每个用户存储密码哈希,盐和迭代计数.这意味着将来您可以增加迭代次数以考虑增加的硬件功率.
以纯文本格式发送SHA-2 512并不安全.您应该在加密通道(例如SSL)中发送它.
说了这么多,SHA-2并不是一个密码散列算法.它专为消息验证而设计,效率很高.考虑使用专用的密码散列算法.一个例子是bcrypt.它的设计计算难度很大,并且内置了盐和迭代.
归档时间: |
|
查看次数: |
185 次 |
最近记录: |