本文演示如何在 MongoDB Shell 中使用 hex_md5() 函数计算密码的 MD5 哈希值,并将其作为新字段保存到文档中。
创建示例数据(明文密码)
> db.addMd5HashValueDemo.insertOne({"UserName":"Adam","UserPassword":"Adam123456"});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd6a4c66d78f205348bc619") }
> db.addMd5HashValueDemo.insertOne({"UserName":"Chris","UserPassword":"Chris_121#"});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd6a4e46d78f205348bc61a") }
显示原始数据
> db.addMd5HashValueDemo.find();
{ "_id" : ObjectId("5cd6a4c66d78f205348bc619"), "UserName" : "Adam", "UserPassword" : "Adam123456" }
{ "_id" : ObjectId("5cd6a4e46d78f205348bc61a"), "UserName" : "Chris", "UserPassword" : "Chris_121#" }
计算 MD5 并保存到 Value 字段
> db.addMd5HashValueDemo.find().forEach( function(documentPass){
documentPass.Value = hex_md5(documentPass.UserPassword);
db.addMd5HashValueDemo.save(documentPass);
});
验证结果
> db.addMd5HashValueDemo.find();
{ "_id" : ObjectId("5cd6a4c66d78f205348bc619"), "UserName" : "Adam", "UserPassword" : "Adam123456", "Value" : "6523857c2bf79b63fd5fa0322575f7be" }
{ "_id" : ObjectId("5cd6a4e46d78f205348bc61a"), "UserName" : "Chris", "UserPassword" : "Chris_121#", "Value" : "3391ccbe33624258cafa23aa50301615" }
关键点说明
hex_md5()- MongoDB Shell 内置函数,返回 32 位十六进制 MD5 哈希字符串forEach()- 遍历游标,对每个文档执行操作save()- 保存整个文档(如果有 _id 则更新,否则插入)- 注意:生产环境不应存储明文密码,更不应使用 MD5(已不安全)
安全建议:生产环境密码存储
// ❌ 错误做法
{ password: "plaintext" }
{ password: hex_md5("plaintext") } // MD5 已被破解,不可用
// ✅ 正确做法:使用 bcrypt/scrypt/Argon2
// 在应用层(Node.js, Python 等)哈希后存储
{ passwordHash: "$2b$12$xxxxxxxxxxxxxxxxxxxxxx", algorithm: "bcrypt", cost: 12 }
MongoDB 4.0+ 更好的迁移方式:Aggregation Pipeline Update
db.addMd5HashValueDemo.updateMany(
{},
[
{ $set: {
PasswordHash: {
$function: {
body: function(pwd) { return hex_md5(pwd); }, // 仅演示,实际用 bcrypt
args: ["$UserPassword"],
lang: "js"
}
}
}}
]
);
其他哈希相关 Shell 函数
hex_md5()- MD5 (128-bit, 32 hex chars)hex_sha1()- SHA-1 (160-bit, 40 hex chars) - 也不安全ObjectId()- 生成唯一 ID (含时间戳)UUID()- 生成 RFC4122 UUID (MongoDB 3.6+)