目录

常用加密算法对比

Base64 编解码

MessageDigest 信息摘要

MD5 信息摘要算法


常用加密算法对比

常用加密算法对比

Base64 编解码

1、BASE64 有自己的编码表,可编码,也可解码;解码后能得到源内容。

2、BASE64 编码的长度是不固定的,随着源字符串的增加而增加。

3、比如登陆的密码单纯只用 BASE64 编码的话,是可以再解密复原的,但是用了 MD5 摘要之后则不能再复原了。

4、在某些不方便使用中文的地方,可以通过 BASE64 编码成可见字符,需要中文时再解码回来即可,如 Cookie 中是不能存储中文的。

5、BASE64Encoder 用于编码、BASE64Decoder 用于解码,都位于 sun.misc 包下。

6、Base64 编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式。 如果剩下的字符不足3个字节,则用0填充,输出字符使用'=',因此编码后输出的文本末尾可能会出现1或2个'='。为了保证所输出的编码为可读字符,Base64制定了一个编码表,以便进行统一转换。编码表的大小为2^6=64,这也是Base64名称的由来。

码值 字符 码值 字符 码值 字符 码值 字符
0 A 16 Q 32 g 48 w
1 B 17 R 33 h 49 x
2 C 18 S 34 i 50 y
3 D 19 T 35 j 51 z
4 E 20 U 36 k 52 0
5 F 21 V 37 i 53 1
6 G 22 W 38 m 54 2
7 H 23 X 39 n 55 3
8 I 24 Y 40 o 56 4
9 J 25 Z 41 p 57 5
10 K 26 a 42 q 58 6
11 L 27 b 43 r 59 7
12 M 28 c 44 s 60 8
13 N 29 d 45 t 61 9
14 O 30 e 46 u 62 +
15 P 31 f 47 v 63 /
    /*** BASE64 编码* BASE64 有自己的编码表,可编码,同时可解解码;长度是不固定的,随着源字符串的增加而增加* 1、比如登陆的密码单纯只有 BASE64 转码的话,是可以再解密的,但是用了 MD5 摘要之后则不能再返回了,* 2、在某些不方便使用中文的地方,可以通过 BASE64 转码成可见字符,需要中文时再解码回来即可,如 Cookie 中是不能存储中文的** @param message 待编码的源数据* @return BASE64 编码后的字符串.*/public static String base64Encode(String message) {String result = "";try {if (message == null || "".equals(message.trim())) {return result;}result = base64Encode(message.getBytes("UTF-8"));} catch (UnsupportedEncodingException e) {e.printStackTrace();}return result;}/*** BASE64Encoder 编码,重载方法.** @param message* @return*/public static String base64Encode(byte[] message) {String result = "";if (message == null || message.length <= 0) {return result;}/** BASE64Encoder 用于编码、BASE64Decoder 用于解码*/BASE64Encoder base64Encoder = new BASE64Encoder();result = base64Encoder.encode(message);return result;}/*** BASE64 解码* 1、BASE64 有自己的编码表,可编码,同时可解密;长度是不固定的,随着源字符串的增加而增加* 2、比如登陆的密码单纯只有 BASE64 的转码的话,是可以再解密返回的,但是用了 MD5 摘要之后则不能再返回了,* 3、在不方便使用中文的地方,可以通过 BASE64 转码成可见字符,需要中文时再解码回来即可,如 Cookie 中是不能存储中文的** @param message 待解码的字符串,如果为空,则返回空字符串.* @return*/public static String base64Decode(String message) {String result = "";try {if (message == null || "".equals(message.trim())) {return result;}/** BASE64Encoder 用于编码、BASE64Decoder 用于解码*/BASE64Decoder base64Decoder = new BASE64Decoder();byte[] decoderByte = base64Decoder.decodeBuffer(message);result = new String(decoderByte, "UTF-8");} catch (IOException e) {e.printStackTrace();}return result;}public static void main(String[] args) {String sourceMessage = "123456万里长城_&*$#.Nice";String encodeMsg = base64Encode(sourceMessage);String decodeMsg = base64Decode(encodeMsg);System.out.println("原字符:" + sourceMessage);//原字符:123456万里长城_&*$#.NiceSystem.out.println("base64 编码后:" + encodeMsg);//base64 编码后:MTIzNDU25LiH6YeM6ZW/5Z+OXyYqJCMuTmljZQ==System.out.println("base64 解码后:" + decodeMsg);//base64 解码后(可以解码):123456万里长城_&*$#.Nice}

src/main/java/com/wmx/thymeleafapp/utils/Base64Utils.java · 汪少棠/thymeleafapp - Gitee.com

MessageDigest 信息摘要

1、java.security.MessageDigest 类为应用程序提供信息摘要算法,如 SHA-1、SHA-256、MD5。

2、信息摘要是安全的单向哈希函数,其信息大小是任意的,且输出为固定长度的哈希值,所以通常会结合 BAse64 编码一起使用,将哈希值转换为可视字符。如果直接使用 new String(byte[] bytes) 是会乱码的

3、摘要好比指纹,每个人都是唯一的,相同的源数据,摘要也一样,不同的数据,摘要则不一样。摘要只是源数据的局部,所以想要解码回去恢复整个源数据是不行的,因为是不完整的。

java.security.MessageDigest 常用方法
方法 描述
MessageDigest getInstance(String algorithm) 返回实现指定摘要算法的 MessageDigest 对象。如 SHA-1、SHA-256、MD5
update(byte[] input) 使用指定的字节数组更新摘要。
byte[] digest() 通过执行最后的操作(如填充)来完成哈希计算,进行此调用后,将重置摘要。
byte[] digest(byte[] input) 使用指定的字节数组对摘要执行最终更新,然后完成摘要计算。相当于先调用 update(byte[] input),然后调用 digest()。
boolean isEqual(byte[] digesta, byte[] digestb) 比较两个摘要是否相等。进行简单的字节比较。如果摘要相等,则返回true,否则返回false。
reset() 重置摘要以供进一步使用。
String getAlgorithm() 返回算法名称
int getDigestLength() 返回摘要的长度(字节),就是 digest() 方法返回的字节数组的长度.
    /*** 将任意字符通过 MD5 摘要 与 Base64 进行定长加密** @param message   待加密字符* @param algorithm 信息生成摘要的算法,默认为  md5,可选值有  SHA-1、SHA-256、MD5* @return 加密后字符*/public static String digestEncryption(String message, String algorithm) {String result = "";try {algorithm = algorithm == null ? "MD5" : algorithm;//指定信息摘要算法提取摘要的哈希值. 哈希值字节数组,如果直接 new String(md5Byte) 是会乱码的MessageDigest messageDigest = MessageDigest.getInstance(algorithm);byte[] md5Byte = messageDigest.digest(message.getBytes());//使用 BASE64 进行定长编码BASE64Encoder base64Encoder = new BASE64Encoder();result = base64Encoder.encode(md5Byte);} catch (NoSuchAlgorithmException e) {e.printStackTrace();}return result;}public static void main(String[] args) {String sourceMessage = "123456万里长城_&*$#.Nice";System.out.println("原字符:" + sourceMessage);//原字符:123456万里长城_&*$#.NiceString md5Msg = digestEncryption(sourceMessage, "md5");String sha1Msg = digestEncryption(sourceMessage, "SHA-1");String sha256Msg = digestEncryption(sourceMessage, "SHA-256");//md5 + base64 加密后:rIJQEL19bo+eV5p7qPLlDg==System.out.println("md5 + base64 加密后:" + md5Msg);//md5 + base64 加密后:UYg5qBdsuCdloFP+0CVPasziIEU=System.out.println("SHA-1 + base64 加密后:" + sha1Msg);//md5 + base64 加密后:dqTa6BTTvZ4zLF5WNAH5Cv660RxYMEIJlBRIGKdNXmM=System.out.println("SHA-256 + base64 加密后:" + sha256Msg);}

src/main/java/com/wmx/thymeleafapp/utils/Md5EncodeUtils.java · 汪少棠/thymeleafapp - Gitee.com

4、除了上面使用 BASE64 将生成的摘要字节数组转换成可视字符串外,也可以使用将10进制字节数组转成 16 进制字符串的方式:16 进制转换在线源码:main/java/com/wmx/thymeleafapp/utils/DataTypeConvertUtils.java

MD5 信息摘要算法

1、压缩性:任意长度的数据,计算出来的 MD5 值都是固定的

2、容易计算: 从原数据计算出 MD5 值是非常方便的

3、抗修改性: 对原数据做任何改动,哪怕之修改1个字节,MD5 值都有很大区别

4、强抗碰撞: 已知原数据和其 MD5 值,想找到一个具有相同 MD5 值的数据(伪造数据)是非常困难的。

5、应用场景:文件一致性较验、数据签名、安全访问认证 等。

6、使用实例代码参考上面的 "MessageDigest 信息摘要",下面演示对文件提取摘要:

Md5、SHA-1、SHA-256 摘要算法使用都是同理,都是通过 MessageDigest.getInstance(String algorithm) 指定.

    /*** 对文件提取摘要** @param file      :待提取摘要的文件* @param algorithm 生成摘要的算法,默认为  md5,可选值有  SHA-1、SHA-256、MD5* @return*/public static String md5DigestByFile(File file, String algorithm) {String result = "";try {algorithm = algorithm == null ? "MD5" : algorithm;//构建文件输入流,然后获取文件通道。FileInputStream fileInputStream = new FileInputStream(file);//FileChannel 用于读取,写入,映射和操作文件的通道。FileChannel fileChannel = fileInputStream.getChannel();/*** map(MapMode mode,long position, long size):将此频道文件的区域直接映射到内存中。* position - 映射区域要启动的文件中的位置; 必须是非负的* size - 要映射的区域的大小; 必须是非负数,不得大于Integer.MAX_VALUE*/MappedByteBuffer byteBuffer = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, file.length());//指定信息摘要算法提取摘要的哈希值. 哈希值字节数组,如果直接 new String(md5Byte) 是会乱码的MessageDigest messageDigest = MessageDigest.getInstance(algorithm);//使用指定的 ByteBuffer 更新摘要.messageDigest.update(byteBuffer);//提取摘要,然后将十进制的字节数组转成 16 进制可视字符串.//通常在网上下载的资源,对方提供对照的 md5 码,或者 sha 码,也是使用 16 进制转换的.result = bytes2HexString(messageDigest.digest(), false);fileInputStream.close();} catch (Exception e) {e.printStackTrace();}return result;}/*** 10 进制字节数组转 16 进制字符串(因为16进制中含有A-F,所以只能用字符串表示)* 对应上面的 hexString2Bytes 方法** @param b           :待转换的10进制字节数组,如 new byte[]{69, 83, 67, 47, 86, 80, 46, 110, 101, 116, 16, 3, 0, 0, 0, 0};* @param isHaveBlank 转换的结果是否用空格隔开,true 时如 "45 5A 43 2F 56 00",false 时如 "455A432F5600"* @return 转换好的 16进制字符串,如 "45 53 43 2F 56 50 2E 6E 65 74 10 03 00 00 00 00 "*/private static String bytes2HexString(byte[] b, boolean isHaveBlank) {if (b == null || b.length <= 0) {System.out.println("bytes2HexString 参数错误,放弃转换.");return null;}StringBuffer result = new StringBuffer();String hex;for (int i = 0; i < b.length; i++) {hex = Integer.toHexString(b[i] & 0xFF);if (hex.length() == 1) {hex = '0' + hex;}if (isHaveBlank) {result.append(hex.toUpperCase() + " ");} else {result.append(hex.toUpperCase());}}return result.toString();}public static void main(String[] args) {new Md5EncodeUtils().test2();}public void test2() {File file = new File("C:\\Users\\Think\\Downloads\\commons-io-2.6-bin.tar.gz");String fileMd5Digest = md5DigestByFile(file, "SHA-256");System.out.println("fileMd5Digest: " + fileMd5Digest.toLowerCase());}

src/main/java/com/wmx/thymeleafapp/utils/Md5EncodeUtils.java · 汪少棠/thymeleafapp - Gitee.com

验证很简单,随便去 Apache 上下载一个资源,比如:Commons IO – Download Apache Commons IO

然后使用代码对它进行提取摘要,最后和 apache 提供的进行对比即可。

Java 原生 Base64 编解码、Md5、SHA-1、SHA-256 加密摘要算法相关推荐

  1. Java实现BASE64编解码

    Java实现BASE64编解码 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs BASE64和其它类似的编码算法通经常使用于转换二进制数据为文本数据,其目 ...

  2. Java对base64编解码总结

    概述 java对base64编解码的通用处理方法. 关于base64编码Encode和Decode编码的几种方式 Base64是一种能将任意Binary资料用64种字元组合成字串的方法,而这个Bina ...

  3. Base64编解码原理并用Java手工实现Base64编解码

    Base64编解码原理 目前Base64已经成为网络上常见的传输8比特字节代码的编码方式之一.在做支付系统时,系统之间的报文交互都需要使用Base64对明文进行转码,然后进行签名或加密,之后再次Bas ...

  4. base64 decode java_Java实现Base64编解码

    为什么要用Base64编码 在网络中传输数据都是使用ascii方式传输.对于一些图片.视频等数据,可能就会被编码成ascii中不可见部分的编码.网络中不同的路由设备处理方式不同,有可能就会把这部分数据 ...

  5. Jva编解码,加密工具类大全(Base64编解码,URL 编解码,sha56_Hmac加密,MD5对字符串进行加密,java自带类实现SHA-256方式加密)

    Base64编解码 /*** Base64编码.*/public static String encodeBase64(byte[] input) {return new String(Base64. ...

  6. Java 8实现BASE64编解码

    Java 8实现BASE64编解码 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs Java一直缺少BASE64编码 API,以至于通常在项目开发中会选用 ...

  7. 图片解码 java_Java 8实现图片BASE64编解码

    前言 Basic编码是标准的BASE64编码,用于处理常规的需求:输出的内容不添加换行符,而且输出的内容由字母加数字组成. 最近做了个Web模版,其中想用Base64背景图.虽然网络上有现成的编码器, ...

  8. 通过OpenSSL的接口实现Base64编解码

    对openssl genrsa产生的rsa私钥pem文件,使用普通的base64解码会有问题,如使用https://blog.csdn.net/fengbingchun/article/details ...

  9. python 图片base64 编解码,转换成Opencv,PIL.Image图片格式

    Python PIL.Image和OpenCV图像格式相互转换 二进制打开图片文件,base64编解码转成Opencv格式: # coding: utf-8 import base64 import ...

最新文章

  1. php 對象轉換成數組,PHP錯誤:陣列對象轉換成關聯數組
  2. 2021年春季学期-信号与系统-第七次作业参考答案
  3. Python3 turtle教程
  4. 细述hbase协处理器
  5. python可以做哪些东西_自己总结的一些东西
  6. LeetCode 347. 前 K 个高频元素(哈希/优先队列)
  7. 程序员的代码写的再牛也没有马伊琍文章的分手语牛!
  8. 1661Help Jimmy
  9. mysql几搜索引擎_详细介绍基于MySQL的搜索引擎MySQL-Fullltext
  10. MATLAB学习笔记 imagesc函数使用
  11. powergui 中“varargout“ 时,未对一个或多个输出参数赋值。
  12. Ubuntu 16.04安装sogou 拼音输入法
  13. vue乱码图片流显示图片_vue下载二进制流图片操作
  14. Python Qt GUI设计:做一款串口调试助手(实战篇—1)
  15. python和r语言哪个简单_python与r语言哪个简单
  16. css百分比定位和百分比尺寸
  17. 小米4c怎么添加语言怎么设置在哪,小米4c路由器设置教程
  18. 贼好用的 Java 工具类库! GitHub 星标 10k+,你在用吗?
  19. 不想打工在家创业这个生意让你月入过万
  20. 移动web开发--移动端常见布局+流式布局和flex布局+携程网首页案例

热门文章

  1. 百遍真人修炼日记-2022/8/31
  2. 用嵌套循环打印菱形图案
  3. 2022年网鼎杯题目整理
  4. 知识图谱的价值和应用
  5. Visual Studio报错解决方案:对路径...的访问被拒绝cmd.exe已退出,代码为3
  6. [App Store Connect帮助]七、在 App Store 上发行(2.5)设定价格与销售范围:向企业或教育机构分发您的 App...
  7. CUDA C++ | 向量加法并行计算
  8. win10计算机 工具在哪个文件夹,Win10系统内置万能工具 系统文件检查器使用教程...
  9. 4、4G杂项:lwip_网卡简述(以8910平台为例)
  10. Ubuntu 下安装deb包命令