加解密与HTTPS(3) 加密解密
wxin55 2024-12-25 16:08 7 浏览 0 评论
您好,我是湘王,这是我的头条号「湘王说」,欢迎您来,欢迎您再来~
除了对称加密算法和非对称加密算法,再就是最后的一种加密算法了:不可逆加密算法。
对称加密算法和非对称加密算法在处理明文的过程中需要使用密钥,而不可逆加密算法就不需要,因为正如其名,密文都不能再转变成明文了,还要密钥干嘛呢。
不可逆加密算法的验证和其他加密方法不同,它的「解密」其实就是加密:也就是把明文再按加密算法加密一次,如果加密后的结果和密文相等,就认为解密成功(MD5的加密验证就是这么干的)。
常用的不可逆加密算法包括两种:
1、MD5
2、SHA
MD5全称Message-Digest Algorithm 5(消息摘要算法5),是一种Hash散列算法,MD5将任意长度的字符串变换成一个128位的大整数。理论上它是不可能被破解的,但实际上已经被清华大学和山东大学的双聘教授王小云破解了,不仅如此,王教授还顺带破解了和MD5一道,被称为HAVAL-128、 MD4和RIPEMD等国际著名密码算法,由美国国家标准技术研究院与美国国家安全局设计专门制定密码算法SHA-1也被她破解了。
MD5的使用极其广泛,大多数互联网应用中的用户密码加密就是用的MD5。
SHA全称安全散列算法(Secure Hash Algorithm),是一系列加密算法的简称,有SHA-1/2/3/224/256/384/512这一系列类别,较为常用的是SHA-2、SHA-256,早期版本的MongoDB的加密算法默认就是SHA-1,现在已经换成了SHA-2。
SHA和MD5一样,也属于Hash散列算法,将任意长度的字符串变换为长度较短、位数固定的输出序列值。
MD5和SHA都属于Hash算法,那到底什么是Hash算法呢?
在理解Hash算法之前,需要先澄清一个非常容易产生歧义的地方:Hash算法与Hash表。
Hash算法是一种数学函数,简单地说,就是将一串数据/信息K通过Hash函数进行转换/摘要,输出另一段固定长度但更精简的数据/信息V,作为K的「指纹」。
而Hash表是一种将「键」与「值」对应起来的数据存储结构,Java中的HashMap就是这种数据存储结构。
Hash算法的核心思想就是「散列」,什么是散列?——让数据尽可能「散开」、「排列」在不同的位置。就像这样:
北京五环中「散列」中不同的商家店铺,不然全挤在一个地方既拥挤又没啥生意。
所以,Hash算法的特点包括“
1、确定性:如果两个散列值(地址)不同,那么原始输入(业态)也是不同的;
2、防碰撞:即使散列值(地址都在同一幢楼)相同,原始输入(业态)也可能不同;
3、不可逆:一个散列值可能对应无数个明文,理论上并不能确切地知道原始输入,即使穷尽目前一切计算资源也不可能;
4、混淆性:原始输入有一点点微小的改变,散列值都会差别巨大,又叫雪崩性。
有些小伙伴可能会经常听见所谓「密码盐」,这是啥呢?
日常生活中,食盐是必不可少的,否则食物就没有味道。而前面也提过,MD5、SHA等密码加密算法已经被破解了,所以现在如果只是简单地使用MD5等加密方法,密码会很容易被破解。可以试试一些在线的MD5破解网站,例如:
所以,为了给MD5提供更安全的保护,可以通过在密码任意固定位置插入特定字符串,使得加密后的结果和原始加密结果不同。例如密码是e10adc3949ba59abbe56e057f20fe,那么在第八个字符之后再加入一些特殊字符「123456」后就是
e10adc3912345649ba59abbe56e057f20fe
这种插入特定字符串的过程就被称之为给密码加盐。
在早期的互联网应用中,用户表中通常只用password这个字段存储加密后的密码。在MD5被破解后,为了让MD5更安全,用户表中就新增了一个字段:Salt(盐)。Salt可以是任意字母、数字、或是字母或数字的组合,但必须是随机产生的,每个用户的Salt都不一样。一般常用用户账户名或昵称作为Salt。
验证过程是:
1、前端通过HTTP方法传输经过MD5加密后的密码PWD1
2、后端执行PWD2 = MD5(PWD1 + Salt)
3、如果PWD2 == password,那么验证通过,否则失败
这一过程各位可以自行实践。
感谢您的大驾光临!咨询技术、产品、运营和管理相关问题,请关注后留言。欢迎骚扰,不胜荣幸~
相关推荐
- Java中List 和 Map、Set 的区别(list和set和map)
-
hello,大家好,我是霖仔java集合的大家了解,我再给大家说一下他们的区别,希望能够帮助到大家结构特点:List和Set是存储单列数据的集合,Map是存储键和值这样的双列数据的集合;Lis...
- Java 集合框架全面解析:选对数据结构,提升开发效率
-
上一章我们详细介绍了各种常用的数据结构情况(参考:数据结构复杂度全览:如何选择最优结构?),本文结合关键数据结构,从列表(List)、队列(Queue)、集合(Set)、映射(Map)四个维度,深入解...
- LinkedList竟然比ArrayList慢了1000多倍?(动图+性能评测)
-
数组和链表是程序中常用的两种数据结构,也是面试中常考的面试题之一。然而对于很多人来说,只是模糊的记得二者的区别,可能还记得不一定对,并且每次到了面试的时候,都得把这些的概念拿出来背一遍才行,未免有些麻...
- LinkedList 底层源码深度解析(linkedlist底层数据结构)
-
目录1.引言2.LinkedList概述2.1类继承体系图2.2各个接口作用3.与ArrayList的对比4.底层数据结构5.核心方法源码解析5.1add()方法5.2a...
- List的用法和实例详解——Java进阶知识讲义系列(四)
-
序欢迎来到全网最完整的Java进阶知识系列教程!!!每天定时更新!!!本期是Java进阶知识系列的第四讲,将分享Java常用的数据容器——集合类。集合类也分很多类型,比如:List、Set、Map、Q...
- Rust高效集合操作(rust基本操作)
-
集合的分类Rust的集合类型主要分布在标准库的std::collections模块中,同时也包括语言内置的数组和字符串类型序列容器序列容器维护元素的顺序,适合需要按索引访问或顺序遍历的场景向量(...
- Java八股文:核心知识点梳理(java八股文是啥)
-
一、Java基础1.Java基本数据类型8种基本类型:整型:byte(1),short(2),int(4),long(8)浮点型:float(4),double(8)字符型:char(2)布...
- 为什么我不推荐研发人员使用 LinkedList?
-
在Java集合框架中,LinkedList作为List的实现之一,经常被认为是ArrayList的替代方案。然而,在大多数实际场景下,我们并不推荐使用LinkedList,原因主要集中...
- ArrayList 、 LinkedList、Vector的区别
-
ArrayList、LinkedList、Vector的区别如下:ArrayListLinkedListVector结构动态数组双向链表动态数组是否线程安全否否是效率遍历查找快,插入删除慢插入删除...
- (2020 )Java最新面试笔试题答案解析(一)
-
Java中的集中基本数据类型是什么?各占用多少字节?【数值型】—(整数类型)byte(1字节)short(2字节)int(4字节)long(8字节)拓展:Java中的数据类型除了上面的基本...
- 超简单五步实现Linux虚拟机CentOS 7系统Root密码忘记重置
-
环境:CentOS7.5重置root密码:1.CentOS7虚拟机开机,将鼠标光标移动至虚拟机内。2.在虚拟机中使用键盘上↑和↓键将选择行设置为第一行(背景高亮即为选中),按下键盘上的e,进...
- 吊轨门和推拉门哪个好?北京今朝区别介绍看完不入坑
-
厨房到底使用什么门好?相信这是大多数业主都比较抓狂的事情,其实在装修中材料的选择最终还是要依据空间而定,那么吊轨门和推拉门哪个好呢?下面就跟随北京装修网一起来看看吧!吊轨门与推拉门介绍吊轨门吊轨门的特...
- 〖省钱宝典〗不花冤枉钱,少走弯路!居家中推拉门如何设计?
-
想要空间最大程度的显大?想要充足的光线?又想拥有合理的区域划分?那么推拉门是你绝对不能错过的好选择。推拉门的设计轻盈简洁,绝对是室内每个空间的福音。它不仅可以最大化地节省空间,方便了居室的功能划分和利...
- 吊趟门与推拉门有什么区别?(吊趟门贵还是推拉门贵)
-
吊趟门与推拉门的区别很多人在购买的时候并不清楚,有些客人甚至根本分不清吊趟门和推拉门,今天小编就给大家讲讲吊趟门与推拉门的相关内容,看看吊趟门与推拉门的区别有哪些?1、推拉门采用以门扇下滑轮为主支撑点...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- Java中List 和 Map、Set 的区别(list和set和map)
- Java 集合框架全面解析:选对数据结构,提升开发效率
- LinkedList竟然比ArrayList慢了1000多倍?(动图+性能评测)
- LinkedList 底层源码深度解析(linkedlist底层数据结构)
- List的用法和实例详解——Java进阶知识讲义系列(四)
- Rust高效集合操作(rust基本操作)
- Java八股文:核心知识点梳理(java八股文是啥)
- 面试题:ArrayList和LinkedList有什么区别?
- 为什么我不推荐研发人员使用 LinkedList?
- ArrayList 、 LinkedList、Vector的区别
- 标签列表
-
- hive行转列函数 (63)
- sourcemap文件是什么 (54)
- display none 隐藏后怎么显示 (56)
- 共享锁和排他锁的区别 (51)
- httpservletrequest 获取参数 (64)
- jstl包 (64)
- qsharedmemory (50)
- watch computed (53)
- java中switch (68)
- date.now (55)
- git-bash (56)
- 盒子垂直居中 (68)
- npm是什么命令 (62)
- python中+=代表什么 (70)
- fsimage (51)
- nginx break (61)
- mysql分区表的优缺点 (53)
- centos7切换到图形界面 (55)
- 前端深拷贝 (62)
- kmp模式匹配算法 (57)
- jsjson字符串转json对象 (53)
- jdbc connection (61)
- javascript字符串转换为数字 (54)
- mybatis 使用 (73)
- 安装mysql数据库 (55)