如何用MD5加密数据库的敏感数据? 您所在的位置:网站首页 md5加解密是什么意思 如何用MD5加密数据库的敏感数据?

如何用MD5加密数据库的敏感数据?

2024-06-18 14:44| 来源: 网络整理| 查看: 265

在这里插入图片描述

一、MD5 是什么 ?

百度百科摘要:   MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。这套算法的程序在 RFC 1321 标准中被加以规范。

二、为什么要进行加密存储?

举个栗子:   我国落实信息安全等级保护制度以来的首例“罚单” —— CSDN网站用户数据泄露案   2011年12月21日上午有黑客在网上公开了开发者技术社区CSDN网站的用户数据库。包括600余万个注册邮箱账号和与之对应的明文密码。

什么是明文密码?

.  下面是我在mongoDB中生成的一些信息,可以直观的看到用户的姓名所对应的密码是直接可识别的,也就是说,这里的密码即是用户在登录过程中输入的真实密码。最终存储在数据库是未有进行任何加密操作的。首先这样明文存储的数据在未泄漏的前提下,DBA等后台工程师是可以直观识别用户及用户密码的,其次一旦发生数据泄露,结果可想而知。 明文密码 在这里插入图片描述   在这里插入图片描述

这是当时遭到曝光和外泄的明文注册邮箱账号和密码 在这里插入图片描述

三、什么是 MD5 加密?

栗子:这样的密码就是经过加密存储的 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 此时有朋友可能已经觉得虽然密码看上去和平常的"123456"这样的密码有了很大的差别,但是似乎还是明文的样子,而且用户登录难道也要用这样毫无关联的字符串吗?带着这样的疑问,我们就得好好看看MD5是如何加密的。

四、MD5加密特点

这里使用的MD5加密是函数型加密,因此每次的加密结果一定相同,没有随机位。 不管加密的文字长或短永远都是32位的混合字符串 MD5没有反函数破解的可能,也就是说MD5在数学上无法破解(无法反向破解)

六、代码实现

服务端接收用户的登录信息,我是通过Node.js来获取的并加密的。 首先Node使用MD5加密数据,不用下载模块,直接引入crypto模块即可。

let crypot = require("crypto"); // 加密操作模块

引入模块后,创建hash,使用update和digest加密数据

let md5 = crypot.createHash("md5"); let password = md5.update(pwdInit).digest("base64"); // pwdInit 用户原始登录密码 // password 加密后的MD5字符串

因此,MD5在这里加密存储数据的应用,其实表层逻辑很简单,即:当有用户注册时将用户的密码用MD5的方式加密"pwdInit"得到的"password"存储在数据库(例如:123456 => E10ADC3949BA59ABBE56E057F20F883E),这样用户真实的密码就不会别直接暴露出来。那么当有用户登录时同样,他只需要输入其原始设置的密码登录即可,原始的登录密码在服务端会通过MD5的方式转换为32位字符串格式,再找到对应用户名信息后再比对加密后的32位字符串密码,全部相同则意味着登录成功。至此,这样的加密数据即使暴漏出来,黑客是无法知道密文背后的真实密码的。

案例服务端代码:

let express = require("express"); let app = express(); let crypot = require("crypto"); // 加密操作模块 let db = require("./Mongo_DIY_modules") // Mgo 自定义封装模块 // 登录页面 app.use("/", express.static("./public")); // 登录路由 app.get("/checklogin", (req, res) => { let username = req.query.username; let userpwd = req.query.userpwd; // 根据填写的姓名,去数据库寻找该文档/集合 // 如过用户名存在,则读取密码进行比对,判断登录成功或失败 db.find({ "dbName": "homeDB", // 数据库名 "collectionName": "loginMD5", // 集合名 "json": { "name":username // 查询条件 }, "callback": function(err, result) { // 查询结果 if(result.length == 0){ res.send("用户名输入有误"); } else { if(result[0].pwd === MD5(userpwd)){ // 比对加密后的32位字符串密码 res.send(result[0].name + " 登录成功!") } else { res.send("密码错误"); } } } }); }); // 注册路由 (未作用户名同名判断) app.get("/regist", (req, res) => { console.log(req.query); db.insertOne("homeDB", "loginMD5", { "name":req.query.username, "pwd":MD5(req.query.userpwd) }, (err, result) => res.send(result)); }); // 运行服务器 app.listen(3000); function MD5(pwd) { let md5 = crypot.createHash("md5"); let password = md5.update(pwd).digest("base64"); return password; } 七、关于MD5的解密

一般的破解工具都是字典模式。通过列出大量的"明文-密码"的对应字典找到明码。也就是通过穷举字符组合的方式,创建了明文密文对应查询数据库。

什么是穷举字符组合的方式?   可以看下常见的在线MD5加密和解密的网站,如何做的: MD5加密: 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 可以看到加密的数据不论长短复杂,都可以加密成32位的字符串且每次的加密结果一定相同(MD5加密是函数型加密)

MD5解密: 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 通过在线网站的解密可以发现一般的数字是可以轻易的被破解的,而复杂的字符组合则难以破解。

所以,所谓的穷举解密实际上就是创建了明文密文对应查询数据库,庞大的数据先被加密成对应的密文存储起来,当有一串类似的MD5密文出现时,则去字典库中遍历查找,找到同样的密文,对应的明文自然就发现了。这种解密过程即是——穷举解密。

这是某个在线MD5揭秘网的解密范围 组合形式: 在这里插入图片描述 密文类型: 在这里插入图片描述 可以说解密网站对MD5的解密范围还是很高的。因此 通常我们使用MD5加密最好不要只使用一层加密,可以对明文使用MD5进行多层加密及添加其它字符相结合,以达到高度破解效果。比如:

let crypot = require("crypto"); // 这是MD5加密的封装方法 function MD5(pwd) { let md5 = crypot.createHash("md5"); let password = md5.update(pwd).digest("base64"); // base64 是网络上最常见的用于传输8Bit字节码的编码方式之一 return password; } let pwd = "123321"; MD5(pwd) // 对pwd进行一层加密 yIN7I/+Kqoot3pFUc84JkQ== 可轻易在线解密 MD5(MD5(pwd)) // 对pwd进行两层层加密 M9o6WW74mkgDA7Zma5Xc4g== 解密相对耗时 MD5(MD5(MD5(pwd))) // 对pwd进行三层层加密 lVKhRjOEZ45+9MVOXHBfYg== 解密困难 MD5(pwd + MD5(pwd)) // 组合自定义字符 B3S+VTISt62HgVFcL8m4Yg= 破解失败 八、总结

在数据库中存储敏感数据时永远不要用明码来存储,MD5的作用就在于将明码转为无法反向破解的字符串。这样可以有效的防止数据库被入侵而导致敏感数据直接泄漏。

MongoDB 安装即基本使用,可参考 MongoDB 数据库安装及基本使用-更多 MongoDB 简单操作,可参考 MongoDB 基本操作指令MongoDB DOA 层封装,可参考 一图理解 Node.js 访问 MongoDB DAO层封装前端后台到数据库操作,可参数 一个简单的 HTML + Node.js + MongoDB数据交互


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有