我有以下代码,它将userName
和password
插入数据库
但密码以纯文本格式存储。我的意思是当我查看数据库时,我可以看到插入的密码。
我想以password
格式
encrypted
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);
我怎样才能做到这一点?
答案 0 :(得分:14)
根据评论中的对话,您的意思是哈希密码,而不是加密密码。你通常会用盐来防止彩虹表攻击。在将密码存储在数据库中时,将密码存储为salted哈希是最佳实践标准。
从版本3.2开始,MongoDB没有像某些SQL数据库提供的密码散列本机支持,因此您必须使用Java实现它。
要生成新帐户或更改现有帐户的密码:
java.security.SecureRandom
生成加密安全随机盐值。这个类就像标准随机数生成器java.util.Random
(它是一个子类)一样工作,但是为了安全相关的上下文所需的更高级别的非可预测性来交换性能。javax.crypto.SecretKeyFactory
类支持的算法。username
,password_hash
和password_salt
(当然还有您的实际应用数据)将文档保存到MongoDB。请勿保存原始密码。要检索帐户:
username_input
和password_input
个用户。username
与用户提供的username_input
匹配的文档。password_salt
字段password_salt
和password_input
来创建字符串,就像之前一样。password_hash
字段进行比较。当它匹配时,用户输入了正确的密码。您也可以只检索文档的password_hash和password_salt字段,而不是在用户通过身份验证之前加载其余字段,但我认为在现实世界中它会导致比保存更多的负载。成功登录通常会大大超过不成功的登录,除非您有攻击者试图暴力破解帐户。在这种情况下,您可以使用fail2ban或其他登录限制机制阻止攻击者。
答案 1 :(得分:0)
我猜这个问题很旧,但是现在似乎支持fields-level encryption。此方法的工作方式与mysql中的密码字段哈希处理显着不同。另外,部分mongodb字段级加密功能不是免费提供的。