从Java程序员的角度理解加密的那些事
前言
在我们日常的程序开发中,或多或少会遇到一些加密/解密的场景,比如在一些接口调用的过程中,我们(Client)不仅仅需要传递给接口服务(Server)必要的业务参数,还得提供Signature(数字签名)以供Server端进行校验(是否是非法请求?是否有篡改?);Server端进行处理后返回给Client的响应结果中还会包含Signature,以供校验。本篇博客将从Java程序员的角度出发,通俗理解加密、解密的那些事!
理解一些术语:单向、对称、非对称
假设场景:client需要发送一段消息"hello world"给server
单向加密
所谓单向加密是指client将消息"hello world"加密的过程不需要server参与,即加密不依赖server;同时,server将收到的消息解密成"hello world"的过程也不依赖client。
例如,咱们知道的MD5就是一种单向加密算法,是一种不可逆的算法。
对称加密
client加密消息需要依赖server,双方可以相互解密。
非对称加密
client加密消息需要依赖server,但是双方不能相互解密。
不可不知的Base64编码
先看一段代码:
需要注意的是,BASE64Encoder和BASE64Decoder并不是官方JDK实现类,如果需要使用,需要引入sun.misc包。
严格来说,BASE64并不是一种加密算法,而是一种编码格式。说白了,BASE64的作用是,将人肉眼可以识别的信息,转换为不可以识别的数据,并不是对数据进行加密,只是给数据换了一身衣服而已。(骗的了你的眼睛,骗不了程序)
原数据越大,那么BASE64生成的结果就越大,这是需要额外注意的点。
BASE64的生成结果始终由64个字符来组成。
由于BASE64的编码特性,在一些场景中有应用,比如有些网站会把图片的二进制流编码成BASE64传递给客户端;比如有些邮件服务器会将邮件的附件直接编码成BASE64连同邮件内容一起发送;比如在URL中有中文需要传递,可以先将中文进行BASE64编码,来避免传输过程中的乱码。
使用广泛的MD5
MD5,即Message Digest,信息摘要算法第5版。比如在和微信支付、支付宝支付接口交互的过程中,你就可以选择MD5算法来加密。
先来看一段代码:
MD5破解?
如前文所说,MD5是一种不可逆的算法,但是为什么存在破解呢?其实,所谓的破解,并不是真正的破解,只不过是大数据查询的一个碰撞而已。比如,有一台服务器存储了大量key以及key的MD5编码的信息,那么就可以拿着数据去进行比对。
那么实际场景中,一般我们如何防止这种暴力破解呢?
答案:进行二次加密。
比如client在调用server接口的时候,server分配给client一个Token,每次client调用server接口的时候,需要对Token以及业务参数一起进行MD5加密。其实这就是所谓的一个“加盐”的过程。
MD5的一些特性分析
第一,我们知道BASE64随着原数据的增大而导致编码后的结果长度变大,而MD5结果的长度值是固定的,就是32位。也就是MD5的压缩性很好。
第二,从原数据计算出MD5是一个快速且容易的过程,不可逆。
第三,要找到2个不同的数据,它们计算后的MD5一致,这是非常困难的。这是MD5的弱碰撞性,也即是说想要伪造数据太困难了。
第四,对原数据的任何修改,哪怕只改动一个字节数据,也会导致MD5值发生很大变化,说明MD5的抗修改性非常好,非常适合密码、业务数据校验、文件比对等。
了解SHA
SHA,即Security Hash Algorithm,安全散列算法,比如,我们的程序开发完毕,我们发布的时候,想指定的人才可以使用,该怎么办呢?这个时候就可以考虑使用SHA算法。SHA是公认的比MD5更加安全的加密算法,在数字签名领域应用广泛。
好了,到这里,初步介绍了下和咱们JAVA程序员有关的一些加密的知识,重点介绍了BASE64和MD5,加密算法的水太深了,欢迎大家拍砖指教,^_^
作者:张丰哲
链接:https://www.jianshu.com/p/7c665d5f734e
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
从Java程序员的角度理解加密的那些事相关推荐
- Blender基础:从程序员的角度理解顶点组(Vertex Group)和权重(Weight)
本文基于Blender 2.8正式版 参考官方文档Vertex Group 从程序员的角度看,一个**顶点组(Vertex Group)**实际上就是一个容器,容器中是顶点的引用(弱引用),一个模型可 ...
- Java程序员如何快速理解Kubernetes
我们希望微服务是可复制的,可替换的工作节点,这样可以轻松进行升级或降级,同时无需任何停机时间,并花费最少代价的管理.我们可以说我们希望他们成为我们的小黄人(minions).本文我们将通过一个简单的例 ...
- 前后端分离时代,Java 程序员的变与不变!
事情的起因是这样的,有个星球的小伙伴向邀请松哥在知乎上回答一个问题,原题是: 前后端分离的时代,Java后台程序员的技术建议? 松哥认真看了下这个问题,感觉对于初次接触前后端分离的小伙伴来说,可能都会 ...
- Java程序员需要注意的五大Docker误区
Docker现在十分很火,容器技术看上不无所不能,但这实际上是一种误解,不要被炒作出来的泡沫迷住双眼,本文抛去炒作,理性地从Java程序员的角度,列举出Docker目前的五大误区,帮助你更好地理解Do ...
- 成为优秀的Java程序员要具备哪些技能?
Java是热门的编程语言,热衷技术,掌握一门语言,我们最重要的是知识的积累和运用,那我们需要掌握哪些技能才能成为优秀的Java程序员呢?小编来为大家解答一波. 1.拥有扎实的基础和深刻理解能力 Jav ...
- java程序员入门_Java程序员入门:简介
java程序员入门 背景 Go (通常称为" Golang")是一种相当新的编程语言,于2007年首次提出,并于2012年发布了1.0版.它的三位发明者目前都是Google员工,具 ...
- Java程序员入门:简介
背景 Go (通常称为" Golang")是一种相当新的编程语言,于2007年首次提出,并于2012年推出了1.0版.它的三位发明者目前都是Google员工,具有令人称奇的声誉. ...
- Java程序员最常用的Linux命令
大家都知道,Linux系统提供了非常多非常多的命令或工具,这些命令都各有所长,都是系统需要的.但我们精力有限,要掌握全部的命令不太现实,所以只需要掌握其中部分常用的命令即可.这里,我就从一个Java程 ...
- Java程序员最常用的Linxu命令
大家都知道,Linux系统提供了非常多非常多的命令或工具,这些命令都各有所长,都是系统需要的.但我们精力有限,要掌握全部的命令不太现实,所以只需要掌握其中部分常用的命令即可.这里,我就从一个Java程 ...
最新文章
- Anaconda 使用的一些体验与困惑
- log4j2的xml的配置样例
- 很有必要看,这篇 解决 IndexError: list index out of range
- 人均奖金300万,2021年“科学探索奖”名单揭晓:高会军周昆上榜,女性获奖人8位创纪录...
- MySQL笔记5:如何创建和删除索引?
- redis 安装测试
- 句子相似度--余弦相似度算法的实现
- 406. 根据身高重建队列
- oracle11.2.0.4使用impdp导入时报错:ORA-39083 ORA-00439
- LINUX下Android NDK下载并配置
- Spring:ReflectionUtils工具类使用一:Field
- 虚拟地址与物理地址的转换
- 关于NBIoT的知识
- 基于android的线上教育app
- 破解Kotlin协程创建调用的那些事
- 使用redis incr处理并发问题
- 人工智能改变人力资源的11种方式
- 【python】通过信号机制对子进程进行控制
- static 和 automatic 修饰(systemverilog)
- 计算机基础——无处不网络(2)
热门文章
- Android 自定义viewpager 三张图片在同一屏幕轮播的效果
- 掉网问题的log分析
- eclipse调试报错,无法进入类
- 12款界面精美的 HTML5 CSS3 网站模板
- Silverlight 5 Beta 新特性预览
- 解读高效的神经架构搜索ENAS
- 吴恩达深度学习课程deeplearning.ai课程作业:Class 2 Week 1 3.Gradient Checking
- 6kyu Build a pile of Cubes
- python中可变参数args_python 可变参数 *args, **kwds
- linux 下的 initrd ramdisk