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ệusave(): 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(): MD5hex_sha1(): SHA-1 (cũng yếu)- Không có SHA-256/512 built-in