Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Thêm giá trị hash MD5 vào collection MongoDB

MongoDB Shell cung cấp hàm hex_md5() để tính toán hash MD5 của chuỗi. Có thể sử dụng kết hợp với forEach() để duyệt collection và lưu hash vào trường mới.

Tạo dữ liệu mẫu

> 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") }

Xem dữ liệu

> db.addMd5HashValueDemo.find();

Tính MD5 và lưu vào trường Value

> db.addMd5HashValueDemo.find().forEach( function(documentPass){ 
  documentPass.Value = hex_md5(documentPass.UserPassword); 
  db.addMd5HashValueDemo.save(documentPass); 
});

Kết quả

{ "_id" : ObjectId("5cd6a4c66d78f205348bc619"), "UserName" : "Adam", "UserPassword" : "Adam123456", "Value" : "6523857c2bf79b63fd5fa0322575f7be" }
{ "_id" : ObjectId("5cd6a4e46d78f205348bc61a"), "UserName" : "Chris", "UserPassword" : "Chris_121#", "Value" : "3391ccbe33624258cafa23aa50301615" }

Giải thích

  • hex_md5(string): Hàm built-in MongoDB Shell trả về MD5 hex string (32 ký tự)
  • forEach(): Duyệt từng tài liệu
  • save(): Cập nhật tài liệu (thay thế toàn bộ document)
  • ⚠️ Cảnh báo: save() thay thế toàn bộ document, có thể gây mất dữ liệu nếu có concurrent update

Cách an toàn hơn: updateOne với $set

db.addMd5HashValueDemo.find().forEach(function(doc) {
  db.addMd5HashValueDemo.updateOne(
    {_id: doc._id},
    {$set: {Value: hex_md5(doc.UserPassword)}}
  );
});

Cách hiện đại: Aggregation + $merge (MongoDB 4.2+)

db.addMd5HashValueDemo.aggregate([
  {$addFields: {Value: {$function: {
    body: function(password) { return hex_md5(password); },
    args: ["$UserPassword"],
    lang: "js"
  }}}},
  {$merge: {into: "addMd5HashValueDemo", on: "_id", whenMatched: "merge"}}
]);

Lưu ý: $function yêu cầu MongoDB 4.4+, và hex_md5 có thể không có sẵn trong aggregation context.

Ứng dụng thực tế

  • Lưu hash mật khẩu (MD5 đã yếu, nên dùng bcrypt/scrypt/Argon2)
  • Tạo fingerprint cho dữ liệu (checksum)
  • Deduplication: phát hiện bản ghi trùng lặp
  • Cache key generation

⚠️ Cảnh bảo mật quan trọng

MD5 không an toàn cho mật khẩu! MD5:

  • Rất nhanh → dễ brute-force
  • Có collision vulnerability
  • Không có salt

Thay thế: Sử dụng bcrypt, scrypt, Argon2, hoặc PBKDF2 ở application layer (Node.js, Python, Java...), không phải trong MongoDB Shell.

Các hàm hash khác trong MongoDB Shell

  • hex_md5(): MD5
  • hex_sha1(): SHA-1 (cũng yếu)
  • Không có SHA-256/512 built-in