我正在使用Postgresql,hibernate和Java,我需要存储密码。有人可以建议我如何使用md5加密密码。否则,有更好的方法将安全密码存储在数据库中
由于
答案 0 :(得分:9)
您不应该使用md5进行密码散列。它专为速度而设计,更容易攻击。请改用bcrypt。此外,您不应该在存储密码后尝试解密密码。请参阅bcrypt页面上的示例,了解如何从用户输入验证密码。关于如何安全地存储密码的更多information。
jBcrypt也非常简单易用。这是您密码的方式:
BCrypt.hashpw(password_from_user, BCrypt.gensalt());
并验证它:
BCrypt.checkpw(password_from_user, hashed_password_from_database)
答案 1 :(得分:5)
MD5不是encryption algorithm - 它是cryptographic hash function。这是非常不同的!您可以将散列密码存储在数据库中,但不能(通常)从密码的散列中恢复密码。 这是设计的。
在某些情况下, 可以从哈希中获取密码 - 例如,如果密码是字典单词,则可以使用dictionary attack恢复。如果密码足够短并且使用有限范围内的字符,则brute force或rainbow table攻击可以恢复密码。当您存储哈希密码时,您应使用salt和key strengthening(例如PBKDF2)来使这些攻击更加困难。
您还应该知道MD5被认为已损坏,建议不要将其用于新应用程序。还有更好的选择,例如SHA-256。
答案 2 :(得分:2)
如果您要使用散列算法,则不会(不能)解密密码。您对密码进行哈希并存储哈希值。当用户将来提供密码时,您可以使用相同的算法对其进行哈希处理,并将新哈希值与之前存储的哈希值进行比较。
您可以使用Java中的MessageDigest类来散列值。参考:Get MD5 hash in a few lines of Java。
编辑:另外,我同意那些不再使用MD5的人。这是一种过去常见的旧算法,但它被攻击到无用(密码)。 MD5反向查找有各种在线资源。
答案 3 :(得分:2)
1)MD5没有解密 2)MD5是一项老技术,非常适合检查两根琴弦是否相同 3)MD5受到字典攻击 4)使用盐可以使MD5更安全 5)我们使用MD5实现低级别安全性,因为哈希可以跨平台轻松复制。 (C ++,vb.net,VB6,C#,php ...)
答案 4 :(得分:0)
如果您安装pgcrypto contrib模块,则可以在postgres中执行此操作。
然后你可以像这样加密密码:
update ... set passwordhash = crypt('new password', gen_salt('md5'));
当然你根本无法解密它!
正如其他人所指出的,这可能是一个坏主意,取决于你想要做什么。我之前被迫使用MD5,因为另一个应用程序要求它,但你不想向世界广播那个哈希。
答案 5 :(得分:0)
我发现Jasypt加密库非常有用。