加密mongodb中的密码字段

PVH*_*PVH 8 java encryption mongodb mongodb-query

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

我想存储passwordencrypted格式

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);
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Phi*_*ipp 14

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

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

要生成新帐户或更改现有帐户的密码,请执行以下操作:

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

要检索帐户:

  1. 阅读username_inputpassword_input在登录表单中输入所谓的用户.
  2. 检索usernameusername_input用户提供的匹配项的文档.
  3. password_salt从该文档中获取字段
  4. 通过串联创建一个字符串password_salt,并password_input就像你以前那样.
  5. 使用相同的加密安全散列函数生成该字符串的散列.
  6. 将哈希值与password_hash文档字段进行比较.匹配时,用户输入了正确的密码.

您也可以只检索文档的password_hash和password_salt字段,并在用户通过身份验证之前不加载其余字段,但我认为在现实世界中它会导致比保存更多的负载.成功登录通常会大大超过不成功的登录,除非您有攻击者试图暴力破解帐户.在这种情况下,您可以使用fail2ban或其他登录限制机制来阻止攻击者.