前言
在我们日常的程序开发中, 或多或少会遇到一些加密 / 解密的场景, 比如在一些接口调用的过程中, 我们 (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 编码 / 解码测试
需要注意的是, BASE64Encoder 和 BASE64Decoder 并不是官方 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, 加密算法的水太深了, 欢迎大家拍砖指教,^_^
来源: http://www.jianshu.com/p/7c665d5f734e