使用Md5保存密码

问题描述 投票:5回答:6

我正在使用Postgresql,hibernate和Java,我需要存储密码。 有人可以建议我如何使用md5加密密码。 否则,有更好的方法在数据库中存储安全密码

谢谢

java sql database encryption password-protection
6个回答
9
投票

您不应该使用md5进行密码散列。 它专为速度而设计,更容易攻击。 请改用bcrypt 。 此外,您不应该在存储密码后尝试解密密码。 请参阅bcrypt页面上的示例,了解如何从用户输入验证密码。 有关如何安全存储密码的更多信息

jBcrypt也非常简单易用。 这是你如何散列密码:

BCrypt.hashpw(password_from_user, BCrypt.gensalt());

并验证它:

BCrypt.checkpw(password_from_user, hashed_password_from_database)

5
投票

MD5不是加密算法 - 它是加密哈希函数 。 这是非常不同的! 您可以将散列密码存储在数据库中,但不能(通常)从密码的散列中恢复密码。 这是设计的。

在某些情况下, 可以得到密码根据散列回来-例如,如果密码是一本字典的字可能采用回收字典攻击 。 如果密码足够短并且使用有限范围内的字符,则暴力彩虹表攻击可以恢复密码。 当您存储散列密码时,您应该使用salt密钥强化 (例如PBKDF2 )来使这些攻击更加困难。

您还应该知道MD5被认为已损坏,建议不要将其用于新应用程序。 有更好的选择,例如SHA-256


2
投票

如果您要使用散列算法,则不会(不能)解密密码。 您对密码进行哈希并存储哈希值。 当用户将来提供密码时,您可以使用相同的算法对其进行哈希处理,并将新哈希值与之前存储的哈希值进行比较。

您可以使用Java中的MessageDigest类来散列值。 参考: 在几行Java中获取MD5哈希值

编辑:此外,我同意其他人说不再使用MD5了。 这是一种过去常见的旧算法,但它被攻击到无用(密码)。 MD5反向查找有各种在线资源。


2
投票

1)MD5没有解密。
2)MD5是旧技术,非常适合检查两个字符串是否相同。
3)MD5受到字典攻击。
4)使用盐可以使MD5更安全。
5)我们使用MD5实现低级别安全性,因为哈希可以跨平台轻松复制。 (C ++,vb.net,VB6,C#,php ......)


0
投票

如果安装了pgcrypto contrib模块,可以在postgres中执行此操作。

然后,您可以加密这样的密码:

update ... set passwordhash = crypt('new password', gen_salt('md5'));

当然你根本无法解密!

正如其他人所指出的那样,这可能是一个坏主意,取决于你想要做什么。 我之前被迫使用MD5,因为另一个应用程序要求它,但你不想向世界广播那​​个哈希。


0
投票

我发现Jasypt加密库非常有用。

© www.soinside.com 2019 - 2024. All rights reserved.