查看原文
其他

从Java程序员的角度理解加密的那些事

专注于编程、互联网动态。最终将总结的技术、心得、经验(数据结构与算法、源码分析等)享给大家,这里不只限于技术!还有职场心得、生活感悟、以及面经点击上方 "程序员小乐" ,关注公众号,第一时间送达!

每日英文 

Sometimes it sucks being strong.Because when people know that you are strong, they think that it is okay to hurt you, over and over again. 

有时候坚强并不是什么好事情,因为有些人会认为你坚强,所以伤害你问题不大,于是一再的伤害你。


乐乐有话说 

做人不要那么敏感,也不要那么心软,太敏感和太心软的人,肯定过得也不快乐,别人随便的一句话,你都要胡思乱想一整天。或许太重感情的人,日子终究不会好过,分分钟把你虐的万劫不复。


来自:张丰哲

链接:https://www.jianshu.com/p/7c665d5f734e

封面来自网络

00 前言  

在我们日常的程序开发中,或多或少会遇到一些加密/解密的场景,比如在一些接口调用的过程中,我们(Client)不仅仅需要传递给接口服务(Server)必要的业务参数,还得提供Signature(数字签名)以供Server端进行校验(是否是非法请求?是否有篡改?);Server端进行处理后返回给Client的响应结果中还会包含Signature,以供校验。本篇博客将从Java程序员的角度出发,通俗理解加密、解密的那些事!

01 理解一些术语:单向、对称、非对称  

假设场景:client需要发送一段消息"hello world"给server

单向加密

所谓单向加密是指client将消息"hello world"加密的过程不需要server参与,即加密不依赖server;同时,server将受到的消息解密成"hello world"的过程也不依赖client。


例如,咱们知道的MD5就是一种单向加密算法,是一种不可逆的算法。

对称加密

client加密消息需要依赖server,双方可以相互解密。

非对称加密

client加密消息需要依赖server,但是双方不能相互解密。

02 不可不知的Base64编码  

先看一段代码:

BASE64编码/解码测试

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


严格来说,BASE64并不是一种加密算法,而是一种编码格式。说白了,BASE64的作用是,将人肉眼可以识别的信息,转换为不可以识别的数据,并不是对数据进行加密,只是给数据换了一身衣服而已。(骗的了你的眼睛,骗不了程序)
原数据越大,那么BASE64生成的结果就越大,这是需要额外注意的点。


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


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

03 使用广泛的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,加密算法的水太深了,欢迎大家拍砖指教,^_^

如果您觉得不错,请别忘了转发、分享、点赞让更多的人去学习, 您的举手之劳,就是对小乐最好的支持,非常感谢!

如何您想进技术群交流,关注公众号在后台回复 “加群”,或者 “学习” 即可

著作权归作者所有,欢迎大家投稿


推荐阅读

阿里、腾讯、百度、华为、京东最新面试题汇集

十大经典排序算法(动图演示,看了都说好)
动画+原理+代码,解读十大经典排序算法
时间复杂度和大O表示法


看完本文有收获?请转发分享给更多人
关注「程序员小乐」,提升技能

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存