Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MongoDB

在 MongoDB 集合中添加 MD5 哈希值字段

本文演示如何在 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+)