目前,我正在使用一种特殊的方案来保护密码,我认为我有一些改进的地方。实现是用Java实现的,所以我更喜欢使用SHA-2 512作为加密形式。
目前,我有一个客户机-服务器模型,因此这些事情可以发生:
我有以下问题:
致以问候。
发布于 2013-05-19 11:53:01
TLDR:您需要使用加密通道(如TLS )发送密码。考虑使用bcrypt进行密码散列。
沙-2 512不是加密算法,而是一种消息摘要算法.加密算法需要密钥和消息来加密。它产生密文。重要的是加密算法有解密算法。
ciphertext = E(key, plaintext);
plaintext = D(key, ciphertext);消息摘要获取一段明文并生成消息摘要。没有相应的反向机制来获取消息摘要并检索原始消息。也没有秘密钥匙。
digest = hash(plaintext);如果攻击者能够使用散列访问数据库,攻击者可以通过蛮力强制检索原始密码,并尝试使用哈希算法进行大量猜测。
digest1 = hash(guess1);
digest2 = hash(guess2); //repeat with lots of guesses首先,通过网络发送哈希是不安全的。它需要通过一些安全的通信机制(如SSL )发送。如果攻击者能够通过通信拦截哈希,他们可能会找到原始密码。
散列碰撞与强行强制密码不一样。当两个不同的消息生成相同的消息摘要时,会导致哈希冲突。
digest1 = hash(plaintext1);
digest2 = hash(plaintext2);
if ( ( plaintext1 != plaintext2 ) && ( digest1 == digest2 ) )
// hash collision沙-512没有设计用来防止蛮力的迭代.SHA算法集的设计是有效的。在散列密码时添加迭代的原因是为了增加强制密码所需的时间。与拥有数百万密码的攻击者相比,执行合法登录尝试和执行100次迭代所需的成本很小,每个密码都需要100次迭代。增加更多的迭代有助于减少提高处理器速度的影响(这将帮助攻击者更快地尝试更多的迭代)。
您应该将迭代次数作为针对每个用户存储的可配置限制。因此,您存储每个用户的密码哈希、salt和迭代计数。这意味着,在未来,您可以增加迭代次数,以考虑到硬件功率的增加。
以明文方式发送SHA-2 512是不安全的。您应该在加密通道(如SSL )中发送它。
尽管如此,SHA-2并不是设计成一个密码哈希算法.它是为消息验证而设计的,并且是高效的。考虑使用目的构建的密码哈希算法。bcrypt就是一个例子。它被设计成计算困难,并内置盐和迭代。
https://stackoverflow.com/questions/16634295
复制相似问题