一、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数据交互

如何用MD5加密数据库的敏感数据?相关推荐

  1. md5加密数据表中的密码php,JSP_使用MD5加密数据库中的用户密码(一),我们知道,现在网络上一般的 - phpStudy...

    使用MD5加密数据库中的用户密码(一) 我们知道,现在网络上一般的网站,稍微完善一点的,往往都需要用户先注册,提供诸如电子邮件.账号.密码等信息以后,成为网站栏目的注册用户,才可以享受网站一些特殊栏目 ...

  2. 使用MD5加密数据库中的用户密码介绍

    使用MD5加密数据库中的用户密码介绍 ●前言 我们知道,现在网络上一般的网站,稍微完善一点的,往往都需要用户先注册,提供诸如电子邮件.账号.密码等信息以后,成为网站栏目的注册用户,才可以享受网站一些特 ...

  3. 数据库级别的MD5加密(建议收藏)

    数据库级别的MD5加密 ​ MD5消息摘要算法是一种广泛使用的散列函数,它产生128-比特哈希值.尽管MD5最初被设计为用作加密散列函数,但已经发现它存在广泛的漏洞.它仍然可以用作校验和核实数据完整性 ...

  4. python md5加密_如何用python“优雅”的调用有道翻译?

    前言 其实在以前就盯上有道翻译了的,但是由于时间问题一直没有研究(我的骚操作还在后面,记得关注),本文主要讲解如何用python调用有道翻译,讲解这个爬虫与有道翻译的js"斗争"的 ...

  5. 《MySQL》入门基础知识点大全:数据库操作、增删改查、联表查询、常用函数、MD5加密、事务特性、隔离级别

    MySQL基础知识大全 1.操作数据库 1.1 创建表 1.2 修改表名 1.3 增加表的字段 1.4 修改表的字段 1.4.1 修改表的字段 1.4.2 修改表名 1.5 删除表的字段 1.6 删除 ...

  6. php mysql md5加密_php 用户密码MD5加密存入数据库问题//

    比如说用户注册后,后台给用户密码MD5加密了在存入数据库,用户在登入的时候输入的密码要与数据库保存的密码对比.我想问的是,用户登入时,后台要把密码用MD5加密后才能与数据库的密码比较吗? 对,确实如此 ...

  7. 数据库(DataBase)-数据库级别MD5加密

    3.数据库级别MD5加密(拓展项) 什么是MD5? MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节 ...

  8. 数据库密码MD5加密、加盐的理解

    一.MD5加密 1)为什么?如果数据库里用户账号的密码没有加密处理,如果数据库被盗,密码被知道导致用户数据被窃取,这是很危险的.数据库里存放密码的密文会安全一点,密码安全性高的话破解也需要时间. 2) ...

  9. 数据库级别的MD5加密使用

    md5简单的使用 明文密码通过md5进行加密 CREATE TABLE student_s(`id` int(11) NOT NULL,`name` varchar(10) COLLATE utf8_ ...

最新文章

  1. 计算机32位操作系统最大识别到内存,win7 32位系统可以支持多大的内存_win7 的32位系统最大支持多少g的内存...
  2. 怎么把线稿提取出来_抠线稿,三种提取漫画线稿的方式
  3. 最近的一次敏捷项目Scrum经验总结
  4. 也说翟鸿燊忽悠的一面
  5. 百度SEO站群MTF直播整合导航网站源码 整合各类直播平台
  6. 发布npm包时遇到的问题及解决方法
  7. github代码_GitHub代码空间如何提高生产力和降低障碍
  8. 【Kafka】Kafka Producer整体架构概述及源码分析
  9. Unity NGUI中动态添加和删除sprite
  10. Educational Codeforces Round 52: D. Three Pieces(记忆化搜索)
  11. 中国生物能源行业运行现状调研及未来发展前景预测报告2022-2028年版
  12. downloadmedia php,PHP 利用MediaWiki 实现中文简繁互转代码 完美支持大陆、香港、台湾及新加坡...
  13. 关于音频情感分类的随笔(3)
  14. R语言使用BOOT重抽样获取回归方程系数95%可信区间(1)
  15. PACP学习笔记三:PCAP方法说明
  16. 全球与中国螺旋拉刀市场深度研究分析报告
  17. tf_Course6循环神经网络
  18. 1.13 golang中的Map
  19. 深度神经网络:WX+b-vs-XW+b
  20. Linux下mpstat命令下,linux mpstat命令详解

热门文章

  1. CommaFeed:仿Google Readerd的RSS阅读器
  2. [Pico]读取新建写入文本文件
  3. 给大学后端小白的一些忠告
  4. 每日算法 - 列出24点游戏的所有解法
  5. transformers5--t5模型中encoder与decoder内容不同解读
  6. java在控制台用星号打印出圆形
  7. 批量手机号归属地查询
  8. CSS实现鼠标悬浮时下拉菜单栏功能
  9. 运维信息系统 (Devops Information System)开发日志
  10. 用canvas画了个多啦A梦