加密mongodb中的密码字段

时间:2015-03-09 06:23:56

标签: java mongodb encryption mongodb-query

我有以下代码,它将userNamepassword插入数据库 但密码以纯文本格式存储。我的意思是当我查看数据库时,我可以看到插入的密码。

我想以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);

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:14)

根据评论中的对话,您的意思是哈希密码,而不是加密密码。你通常会用盐来防止彩虹表攻击。在将密码存储在数据库中时,将密码存储为salted哈希是最佳实践标准。

从版本3.2开始,MongoDB没有像某些SQL数据库提供的密码散列本机支持,因此您必须使用Java实现它。

要生成新帐户或更改现有帐户的密码:

  1. 使用java.security.SecureRandom生成加密安全随机盐值。这个类就像标准随机数生成器java.util.Random(它是一个子类)一样工作,但是为了安全相关的上下文所需的更高级别的非可预测性来交换性能。
  2. 通过连接salt和密码
  3. 创建一个字符串
  4. 使用加密安全散列函数生成该字符串的散列。现成的Java提供了许多哈希函数,但是你想使用一个故意难以计算的函数来减慢攻击者的数据库访问速度,试图在他们的本地超级计算机集群上强制执行哈希。一个好的候选人是" PBKDF2WithHmacSHA1" javax.crypto.SecretKeyFactory类支持的算法。
  5. 使用字段usernamepassword_hashpassword_salt(当然还有您的实际应用数据)将文档保存到MongoDB。请勿保存原始密码。
  6. 要检索帐户:

    1. 阅读登录表单中输入的username_inputpassword_input个用户。
    2. 检索username与用户提供的username_input匹配的文档。
    3. 从该文档中获取password_salt字段
    4. 通过连接password_saltpassword_input来创建字符串,就像之前一样。
    5. 使用相同的加密安全散列函数生成该字符串的散列。
    6. 将哈希值与文档的password_hash字段进行比较。当它匹配时,用户输入了正确的密码。
    7. 您也可以只检索文档的password_hash和password_salt字段,而不是在用户通过身份验证之前加载其余字段,但我认为在现实世界中它会导致比保存更多的负载。成功登录通常会大大超过不成功的登录,除非您有攻击者试图暴力破解帐户。在这种情况下,您可以使用fail2ban或其他登录限制机制阻止攻击者。

答案 1 :(得分:0)

我猜这个问题很旧,但是现在似乎支持fields-level encryption。此方法的工作方式与mysql中的密码字段哈希处理显着不同。另外,部分mongodb字段级加密功能不是免费提供的。