当前位置:   article > 正文

Java 原生 Base64 编解码、Md5、SHA-1、SHA-256 加密摘要算法、AES、DES、RSA 加解密_base64的encode怎么确定结果是固定长度

base64的encode怎么确定结果是固定长度

目录

常用加密算法对比

Base64 编解码

MessageDigest 信息摘要

MD5 信息摘要算法

原生 AES、DES、RSA 加解密

国密算法加密、解密:SM2、SM3、SM4


常用加密算法对比

 常用加密算法对比
加密算法描述
SHA 安全散列算法。单向加密、数据不可逆(即不可恢复)。长度是固定的。
BASE64

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

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

3、在某些不方便使用中文的地方,可以通过 BASE64 编码成可见字符,需要中文时再解码回来即可,比如 url 地址,或者 Cookie.

MD5

信息摘要是安全的单向哈希函数,对大小的信息输出固定长度的哈希值,单向加密、数据不可逆。

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

DES

Data Encrytion Standard(数据加密标准) , 特点:1. 对称加密  2. 同一个 SECRET_KEY(密钥)

AES

Advanced Encrytion Standard(高级加密标准),特点:1. 对称加密  2. 一个 SECRET_KEY(密钥)扩展成多个子 SK,轮加密

RSA

1. 非对称加密,即:PK(PUBLIC_KEY 公钥) 与 SK( SECRET_KEY 密钥) 不是同一个

2. PK 加密时,必须用 SK 解密、反之  SK 加密时,必须用 PK 解密,

3. PK 决定 SK,但是 PK 很难算出 SK(数学原理:两个大质数相乘,积很难因式分解)

4. 速度慢,适合对少量数据加密

SM2国密算法,非对称算法,需要公钥和私钥,用来替换 RSA
SM3国密算法,摘要/杂凑算法,用来替换MD5、SHA-1、SHA-2
SM4国密算法,对称算法,分组密码算法,用于替代DES/AES等国际算法

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名称的由来。

码值字符码值字符码值字符码值字符
0A16Q32g48w
1B17R33h49x
2C18S34i50y
3D19T35j51z
4E20U36k520
5F21V37i531
6G22W38m542
7H23X39n553
8I24Y40o564
9J25Z41p575
10K26a42q586
11L27b43r597
12M28c44s608
13N29d45t619
14O30e46u62+
15P31f47v63/
  1. /**
  2. * BASE64 编码
  3. * BASE64 有自己的编码表,可编码,同时可解解码;长度是不固定的,随着源字符串的增加而增加
  4. * 1、比如登陆的密码单纯只有 BASE64 转码的话,是可以再解密的,但是用了 MD5 摘要之后则不能再返回了,
  5. * 2、在某些不方便使用中文的地方,可以通过 BASE64 转码成可见字符,需要中文时再解码回来即可,如 Cookie 中是不能存储中文的
  6. *
  7. * @param message 待编码的源数据
  8. * @return BASE64 编码后的字符串.
  9. */
  10. public static String base64Encode(String message) {
  11. String result = "";
  12. try {
  13. if (message == null || "".equals(message.trim())) {
  14. return result;
  15. }
  16. result = base64Encode(message.getBytes("UTF-8"));
  17. } catch (UnsupportedEncodingException e) {
  18. e.printStackTrace();
  19. }
  20. return result;
  21. }
  22. /**
  23. * BASE64Encoder 编码,重载方法.
  24. *
  25. * @param message
  26. * @return
  27. */
  28. public static String base64Encode(byte[] message) {
  29. String result = "";
  30. if (message == null || message.length <= 0) {
  31. return result;
  32. }
  33. /** BASE64Encoder 用于编码、BASE64Decoder 用于解码*/
  34. BASE64Encoder base64Encoder = new BASE64Encoder();
  35. result = base64Encoder.encode(message);
  36. return result;
  37. }
  38. /**
  39. * BASE64 解码
  40. * 1、BASE64 有自己的编码表,可编码,同时可解密;长度是不固定的,随着源字符串的增加而增加
  41. * 2、比如登陆的密码单纯只有 BASE64 的转码的话,是可以再解密返回的,但是用了 MD5 摘要之后则不能再返回了,
  42. * 3、在不方便使用中文的地方,可以通过 BASE64 转码成可见字符,需要中文时再解码回来即可,如 Cookie 中是不能存储中文的
  43. *
  44. * @param message 待解码的字符串,如果为空,则返回空字符串.
  45. * @return
  46. */
  47. public static String base64Decode(String message) {
  48. String result = "";
  49. try {
  50. if (message == null || "".equals(message.trim())) {
  51. return result;
  52. }
  53. /** BASE64Encoder 用于编码、BASE64Decoder 用于解码*/
  54. BASE64Decoder base64Decoder = new BASE64Decoder();
  55. byte[] decoderByte = base64Decoder.decodeBuffer(message);
  56. result = new String(decoderByte, "UTF-8");
  57. } catch (IOException e) {
  58. e.printStackTrace();
  59. }
  60. return result;
  61. }
  62. public static void main(String[] args) {
  63. String sourceMessage = "123456万里长城_&*$#.Nice";
  64. String encodeMsg = base64Encode(sourceMessage);
  65. String decodeMsg = base64Decode(encodeMsg);
  66. System.out.println("原字符:" + sourceMessage);//原字符:123456万里长城_&*$#.Nice
  67. System.out.println("base64 编码后:" + encodeMsg);//base64 编码后:MTIzNDU25LiH6YeM6ZW/5Z+OXyYqJCMuTmljZQ==
  68. System.out.println("base64 解码后:" + decodeMsg);//base64 解码后(可以解码):123456万里长城_&*$#.Nice
  69. }

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() 方法返回的字节数组的长度.
  1. /**
  2. * 将任意字符通过 MD5 摘要 与 Base64 进行定长加密
  3. *
  4. * @param message 待加密字符
  5. * @param algorithm 信息生成摘要的算法,默认为 md5,可选值有 SHA-1、SHA-256、MD5
  6. * @return 加密后字符
  7. */
  8. public static String digestEncryption(String message, String algorithm) {
  9. String result = "";
  10. try {
  11. algorithm = algorithm == null ? "MD5" : algorithm;
  12. //指定信息摘要算法提取摘要的哈希值. 哈希值字节数组,如果直接 new String(md5Byte) 是会乱码的
  13. MessageDigest messageDigest = MessageDigest.getInstance(algorithm);
  14. byte[] md5Byte = messageDigest.digest(message.getBytes());
  15. //使用 BASE64 进行定长编码
  16. BASE64Encoder base64Encoder = new BASE64Encoder();
  17. result = base64Encoder.encode(md5Byte);
  18. } catch (NoSuchAlgorithmException e) {
  19. e.printStackTrace();
  20. }
  21. return result;
  22. }
  23. public static void main(String[] args) {
  24. String sourceMessage = "123456万里长城_&*$#.Nice";
  25. System.out.println("原字符:" + sourceMessage);//原字符:123456万里长城_&*$#.Nice
  26. String md5Msg = digestEncryption(sourceMessage, "md5");
  27. String sha1Msg = digestEncryption(sourceMessage, "SHA-1");
  28. String sha256Msg = digestEncryption(sourceMessage, "SHA-256");
  29. //md5 + base64 加密后:rIJQEL19bo+eV5p7qPLlDg==
  30. System.out.println("md5 + base64 加密后:" + md5Msg);
  31. //md5 + base64 加密后:UYg5qBdsuCdloFP+0CVPasziIEU=
  32. System.out.println("SHA-1 + base64 加密后:" + sha1Msg);
  33. //md5 + base64 加密后:dqTa6BTTvZ4zLF5WNAH5Cv660RxYMEIJlBRIGKdNXmM=
  34. System.out.println("SHA-256 + base64 加密后:" + sha256Msg);
  35. }

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) 指定.

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

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

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

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

原生 AES、DES、RSA 加解密

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

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

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

国密算法加密、解密:SM2、SM3、SM4

https://blog.csdn.net/wangmx1993328/article/details/108888130

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/1020252
推荐阅读
相关标签
  

闽ICP备14008679号