密码加密之消息摘要算法

简介: 密码加密之消息摘要算法

如果直接将用户填写的明文密码(原始密码)存储到数据库中,当出现数据库泄密,用户的账号安全就无法保障!所以,需要将明文密码进行加密,在数据库中,实际存储的会是密文(加密后的结果),即使数据库泄密,被看到也只是密文,如果无法通过密文还原出原文(原始密码),则不会影响账号安全。


假设,某用户的原始密码是1234,假设使用非常简单的规则:“将每位数字增加1”,就可以得到2345,最终,会将2345存储到数据库中,即使出现数据库泄密,别人能看到的也只是2345,如果这个规则设计得更加复杂,无法将2345这种密文还原成1234这种原文,至少能保障用户账号安全(不被他人登录等)。


当使用了这样的加密处理后,并不影响程序的正常使用,例如,用户注册时进行了以上的加密处理,在后续登录时,用户依然提交1234这种原始密码,在验证登录时,程序会对1234使用相同的规则进行运算,得到2345,然后,再与数据库中记录的2345进行对比即可。


在处理加密时,加密规则越复杂越好,或者说,根据密文还原出原文的难度越大越好!一般来说,都应该使用成熟的算法,而不需要自行设计算法!


在实现密码加密时,不要使用任何加密算法,因为所有加密算法在设计时就已经决定了它是可逆向运算的,也就是说“所有的加密算法都可以解密”!加密算法的主要应用领域只是“保障传输过程的安全”,并不保证“存储数据的安全”。


推荐使用消息摘要算法对密码进行加密并存储,因为所有的消息摘要算法都是不可逆向运算的。


常用的消息摘要算法有MD(Message Digest)系列和SHA(Secure Hash Argorithm)家族算法,例如MD2、MD4、MD5、SHA-1、SHA-256、SHA-384、SHA-512等。


Java语言本身就可以支持各种算法进行运算,原生API的使用相对麻烦,Spring框架默认就提供了MD5运算的API:


@Test

public void md5() {

   String password = "123456";

   String digest = DigestUtils.md5DigestAsHex(password.getBytes());

   System.err.println(digest);

}


关于消息摘要算法,有几个特点:


使用固定的算法,消息相同时,摘要必然相同;


使用固定的算法,无视消息的长度,摘要的长度固定;


使用固定的算法,消息不同时,摘要几乎不会相同。


例如:

屏幕快照 2021-11-22 下午11.08.04.png

因为消息的长度是没有限制的,所以,消息的种类可以是无限种!但是,摘要的长度是固定的,所以,摘要的种类就是有限的!综合来看,理论上来说,可以有N个不同的消息对应相同的摘要!如果找到2个完全不同的消息,运算得到的摘要却完全相同,则称之为发生了“碰撞”!


但是,虽然存在碰撞概率,但是,概率却不一定高,以MD5为例,摘要的长度固定为32位,其本质是32个十六进制数,如果还原成二进制数,将是一个128位长度的二进制数,所以,MD5算法是128位算法。理论上来说,发生碰撞的概率是3.40282E+38分之一。


同时,在实际应用中,如果是使用消息摘要算法对密码进行“加密”时,用户提交的原始密码其实是有限的种类(允许使用的只有数字、字母、符号,且通常会限制长度),就不存在上述的“无限对应有限”的现象,在“有限对应有限”的应用场景中,发生碰撞的概率将更低,甚至根本就不存在!这样来看,使用消息摘要算法用于“密码加密”的数据处理是安全有效的!


关于消息摘要的破解,首先,学术上的“破解”指的是“研究某种消息摘要算法的碰撞概率”,并不是讨论所谓的“逆向运算”,只要是消息摘要算法,都是不可以被逆向运算的!


另外,在网络上,还有一些网站提供了“在线破解”,其实,这些网站是在数据库中收录了大量消息与摘要的对应结果,当网友尝试破解时,这些网站是“通过网友提供的摘要查询对应的原文”,并不是真正意义的“破解”!由于这些网站收录的消息与摘要的对应结果是有限的,所以,相当复杂的密码都不会被这些网站破解!


在实际设计项目时,为了最大化保障用户密码的安全,应该:


要求用户使用安全强度更高的密码;

对密码进行循环加密;

对密码进行“加盐”处理;

选取位数更长的摘要算法;

综合以上做法。


目录
相关文章
|
12月前
|
Java 数据安全/隐私保护
对称加密、非对称加密与哈希摘要
本内容介绍了对称加密、非对称加密和哈希摘要的基本概念与区别。对称加密使用同一密钥加解密,速度快但需妥善保管密钥;非对称加密使用公钥加密、私钥解密,安全性高但速度较慢;哈希摘要通过提取数据特征用于完整性校验,能有效区分不同数据。
362 2
|
存储 搜索推荐 算法
加密算法、排序算法、字符串处理及搜索算法详解
本文涵盖四大类核心技术知识。加密算法部分介绍了对称加密(如 AES)、非对称加密(如 RSA)、哈希摘要(如 SHA-2)、签名算法的特点及密码存储方案(加盐、BCrypt 等)。 排序算法部分分类讲解了比较排序(冒泡、选择、插入、归并、快排、堆排序)和非比较排序(计数、桶、基数排序)的时间复杂度、适用场景及实现思路,强调混合排序的工业应用。 字符串处理部分包括字符串反转的双指针法,及项目中用正则进行表单校验、网页爬取、日志处理的实例。 搜索算法部分详解了二分查找的实现(双指针与中间索引计算)和回溯算法的概念(递归 + 剪枝),以 N 皇后问题为例说明回溯应用。内容全面覆盖算法原理与实践
353 0
|
数据安全/隐私保护
解释对称加密、非对称加密、哈希摘要
加密技术分为对称加密与非对称加密。对称加密使用同一密钥进行加解密,速度快但需严保管密钥;非对称加密则用公钥加密、私钥解密,安全性高但速度较慢。哈希摘要用于验证数据完整性,代表原始数据特征。
334 0
|
算法 数据安全/隐私保护
基于混沌加密的遥感图像加密算法matlab仿真
本项目实现了一种基于混沌加密的遥感图像加密算法MATLAB仿真(测试版本:MATLAB2022A)。通过Logistic映射与Baker映射生成混沌序列,对遥感图像进行加密和解密处理。程序分析了加解密后图像的直方图、像素相关性、信息熵及解密图像质量等指标。结果显示,加密图像具有良好的随机性和安全性,能有效保护遥感图像中的敏感信息。该算法适用于军事、环境监测等领域,具备加密速度快、密钥空间大、安全性高的特点。
|
存储 算法 测试技术
【狂热算法篇】探秘图论之 Floyd 算法:解锁最短路径的神秘密码(通俗易懂版)
【狂热算法篇】探秘图论之 Floyd 算法:解锁最短路径的神秘密码(通俗易懂版)
|
算法 安全 调度
【动态规划篇】穿越算法迷雾:约瑟夫环问题的奇幻密码
【动态规划篇】穿越算法迷雾:约瑟夫环问题的奇幻密码
|
存储 人工智能 算法
【深度优先搜索篇】走迷宫的魔法:算法如何破解迷宫的神秘密码
【深度优先搜索篇】走迷宫的魔法:算法如何破解迷宫的神秘密码
|
存储 缓存 Java
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
2691 3
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
|
机器学习/深度学习 存储 算法
解锁文件共享软件背后基于 Python 的二叉搜索树算法密码
文件共享软件在数字化时代扮演着连接全球用户、促进知识与数据交流的重要角色。二叉搜索树作为一种高效的数据结构,通过有序存储和快速检索文件,极大提升了文件共享平台的性能。它依据文件名或时间戳等关键属性排序,支持高效插入、删除和查找操作,显著优化用户体验。本文还展示了用Python实现的简单二叉搜索树代码,帮助理解其工作原理,并展望了该算法在分布式计算和机器学习领域的未来应用前景。