前言


在我们日常的程序开发中,或多或少会遇到一些加密/解密的场景,比如在一些接口调用的过程中,我们(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编码


先看一段代码:

BASE64编码/解码测试

需要注意的是,BASE64EncoderBASE64Decoder并不是官方JDK实现类,如果需要使用,需要引入sun.misc包。

严格来说,BASE64并不是一种加密算法,而是一种编码格式。说白了,BASE64的作用是,将人肉眼可以识别的信息,转换为不可以识别的数据,并不是对数据进行加密,只是给数据换了一身衣服而已。(骗的了你的眼睛,骗不了程序)

原数据越大,那么BASE64生成的结果就越大,这是需要额外注意的点。

BASE64的生成结果始终由64个字符来组成。

由于BASE64的编码特性,在一些场景中有应用,比如有些网站会把图片的二进制流编码成BASE64传递给客户端;比如有些邮件服务器会将邮件的附件直接编码成BASE64连同邮件内容一起发送;比如在URL中有中文需要传递,可以先将中文进行BASE64编码,来避免传输过程中的乱码。

使用广泛的MD5


MD5,即Message Digest,信息摘要算法第5版。比如在和微信支付、支付宝支付接口交互的过程中,你就可以选择MD5算法来加密。

先来看一段代码:

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程序员的角度理解加密的那些事相关推荐

  1. Blender基础:从程序员的角度理解顶点组(Vertex Group)和权重(Weight)

    本文基于Blender 2.8正式版 参考官方文档Vertex Group 从程序员的角度看,一个**顶点组(Vertex Group)**实际上就是一个容器,容器中是顶点的引用(弱引用),一个模型可 ...

  2. Java程序员如何快速理解Kubernetes

    我们希望微服务是可复制的,可替换的工作节点,这样可以轻松进行升级或降级,同时无需任何停机时间,并花费最少代价的管理.我们可以说我们希望他们成为我们的小黄人(minions).本文我们将通过一个简单的例 ...

  3. 前后端分离时代,Java 程序员的变与不变!

    事情的起因是这样的,有个星球的小伙伴向邀请松哥在知乎上回答一个问题,原题是: 前后端分离的时代,Java后台程序员的技术建议? 松哥认真看了下这个问题,感觉对于初次接触前后端分离的小伙伴来说,可能都会 ...

  4. Java程序员需要注意的五大Docker误区

    Docker现在十分很火,容器技术看上不无所不能,但这实际上是一种误解,不要被炒作出来的泡沫迷住双眼,本文抛去炒作,理性地从Java程序员的角度,列举出Docker目前的五大误区,帮助你更好地理解Do ...

  5. 成为优秀的Java程序员要具备哪些技能?

    Java是热门的编程语言,热衷技术,掌握一门语言,我们最重要的是知识的积累和运用,那我们需要掌握哪些技能才能成为优秀的Java程序员呢?小编来为大家解答一波. 1.拥有扎实的基础和深刻理解能力 Jav ...

  6. java程序员入门_Java程序员入门:简介

    java程序员入门 背景 Go (通常称为" Golang")是一种相当新的编程语言,于2007年首次提出,并于2012年发布了1.0版.它的三位发明者目前都是Google员工,具 ...

  7. Java程序员入门:简介

    背景 Go (通常称为" Golang")是一种相当新的编程语言,于2007年首次提出,并于2012年推出了1.0版.它的三位发明者目前都是Google员工,具有令人称奇的声誉. ...

  8. Java程序员最常用的Linux命令

    大家都知道,Linux系统提供了非常多非常多的命令或工具,这些命令都各有所长,都是系统需要的.但我们精力有限,要掌握全部的命令不太现实,所以只需要掌握其中部分常用的命令即可.这里,我就从一个Java程 ...

  9. Java程序员最常用的Linxu命令

    大家都知道,Linux系统提供了非常多非常多的命令或工具,这些命令都各有所长,都是系统需要的.但我们精力有限,要掌握全部的命令不太现实,所以只需要掌握其中部分常用的命令即可.这里,我就从一个Java程 ...

最新文章

  1. Anaconda 使用的一些体验与困惑
  2. log4j2的xml的配置样例
  3. 很有必要看,这篇 解决 IndexError: list index out of range
  4. 人均奖金300万,2021年“科学探索奖”名单揭晓:高会军周昆上榜,女性获奖人8位创纪录...
  5. MySQL笔记5:如何创建和删除索引?
  6. redis 安装测试
  7. 句子相似度--余弦相似度算法的实现
  8. 406. 根据身高重建队列
  9. oracle11.2.0.4使用impdp导入时报错:ORA-39083 ORA-00439
  10. LINUX下Android NDK下载并配置
  11. Spring:ReflectionUtils工具类使用一:Field
  12. 虚拟地址与物理地址的转换
  13. 关于NBIoT的知识
  14. 基于android的线上教育app
  15. 破解Kotlin协程创建调用的那些事
  16. 使用redis incr处理并发问题
  17. 人工智能改变人力资源的11种方式
  18. 【python】通过信号机制对子进程进行控制
  19. static 和 automatic 修饰(systemverilog)
  20. 计算机基础——无处不网络(2)

热门文章

  1. Android 自定义viewpager 三张图片在同一屏幕轮播的效果
  2. 掉网问题的log分析
  3. eclipse调试报错,无法进入类
  4. 12款界面精美的 HTML5 CSS3 网站模板
  5. Silverlight 5 Beta 新特性预览
  6. 解读高效的神经架构搜索ENAS
  7. 吴恩达深度学习课程deeplearning.ai课程作业:Class 2 Week 1 3.Gradient Checking
  8. 6kyu Build a pile of Cubes
  9. python中可变参数args_python 可变参数 *args, **kwds
  10. linux 下的 initrd ramdisk