我有以下代码,它插入userName
and password
进入数据库
但密码以纯文本格式存储。我的意思是,当我查看数据库时,我可以看到插入的密码。
我想存储password
in encrypted
format
MongoClient client = new MongoClient("localhost",27017);
DB db = client.getDB("Test");
DBCollection collection = db.getCollection("EncryptionDemo");
BasicDBObject documentDetail = new BasicDBObject();
documentDetail.put("userName", "admin12");
documentDetail.put("password", "12345");
collection.insert(documentDetail);
我怎样才能实现这个目标?
根据评论中的对话,你的意思是hashing密码,不是加密密码。您通常会使用盐来防止彩虹表攻击。在数据库中存储密码时,将密码存储为加盐哈希是最佳实践标准。
从版本 3.2 开始,MongoDB 不再像某些 SQL 数据库那样提供对密码哈希的本机支持,因此您必须使用 Java 来实现它。
要生成新帐户或更改现有帐户的密码:
- 生成加密安全的随机盐值java.security.SecureRandom https://docs.oracle.com/javase/8/docs/api/java/security/SecureRandom.html。该类的工作原理与标准随机数生成器类似java.util.Random http://docs.oracle.com/javase/8/docs/api/java/util/Random.html(它是一个子类),但以性能换取更高级别的不可预测性,这是安全相关上下文所需的。
- 通过连接盐和密码创建一个字符串
- 使用加密安全哈希函数生成该字符串的哈希值。 Java 提供了许多开箱即用的哈希函数,但您希望使用一种故意难以计算的哈希函数,以减缓具有数据库访问权限的攻击者试图在本地超级计算机集群上暴力破解您的哈希值的速度。一个很好的候选者是“PBKDF2WithHmacSHA1”算法,该算法由javax.crypto.SecretKeyFactory http://docs.oracle.com/javase/8/docs/api/javax/crypto/SecretKeyFactory.html class.
- 将文档与字段一起保存到 MongoDB
username
, password_hash
and password_salt
(当然还要加上您的实际应用数据)。不要保存原始密码。
要找回帐户:
- 阅读
username_input
and password_input
被指控的用户输入了您的登录表单。
- 检索文档所在位置
username
匹配username_input
用户提供的。
- Get the
password_salt
该文档中的字段
- 通过连接创建字符串
password_salt
and password_input
就像你以前做的那样。
- 使用相同的加密安全哈希函数生成该字符串的哈希值。
- 将哈希值与
password_hash
文档的字段。当匹配时,用户输入了正确的密码。
您也可以只检索文档的password_hash 和password_salt 字段,而不在用户经过身份验证之前加载其余部分,但我认为在现实世界中,它会导致比节省的负载更多的负载。成功登录的数量通常会远远超过不成功登录的数量,除非攻击者试图暴力破解帐户。在这种情况下,您将阻止攻击者fail2ban http://www.fail2ban.org/wiki/index.php/Main_Page或其他登录限制机制。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)