加密mongodb中的密码字段
我有以下代码,它将userName
和password
插入数据库,但密码以纯文本格式存储。 我的意思是当我查看数据库时,我可以看到插入的密码。
我想以encrypted
格式存储password
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);
我怎样才能做到这一点?
根据评论中的对话,你的意思是散列密码,而不是加密密码。 你通常会用盐来防止彩虹表攻击。 将密码存储为salted哈希是将密码存储在数据库中的最佳实践标准。
从版本3.2开始,MongoDB没有像某些SQL数据库提供的密码散列本机支持,因此您必须在Java中实现它。
要生成新帐户或更改现有帐户的密码,请执行以下操作:
- 使用
java.security.SecureRandom
生成加密安全的随机salt值。 这个类就像标准的随机数生成器java.util.Random
(它是一个子类)一样工作,但是为了安全相关的上下文所需的更高级别的非可预测性来交换性能。 - 通过连接salt和密码创建一个字符串
- 使用加密安全散列函数生成该字符串的散列。 现成的Java提供了许多哈希函数,但是你想使用一个故意难以计算的函数来减慢攻击者的数据库访问速度,试图在他们的本地超级计算机集群上强制使用哈希值。 一个很好的候选者是
javax.crypto.SecretKeyFactory
类支持的“PBKDF2WithHmacSHA1”算法。 - 使用域名
username
,password_hash
和password_salt
(当然还有您的实际应用程序数据)将文档保存到MongoDB。 不保存原始密码。
要检索帐户:
- 阅读
username_input
登录表单中输入的username_input
和password_input
。 - 检索
username
username_input
与用户提供的username
匹配的文档。 - 从该文档中获取
password_salt
字段 - 通过连接
password_salt
和password_input
创建一个字符串,就像之前一样。 - 使用相同的加密安全散列函数生成该字符串的散列。
- 将哈希值与文档的
password_hash
字段进行比较。 匹配时,用户输入了正确的密码。
您也可以只检索文档的password_hash和password_salt字段,而不是在用户通过身份validation之前加载其余字段,但我认为在现实世界中它会导致比保存更多的负载。 成功登录通常会大大超过不成功登录的次数,除非您有攻击者试图暴力破解帐户。 在这种情况下,您可以使用fail2ban或其他登录限制机制来阻止攻击者。