java实现Base64加密解密算法

作者:wangxp 时间:2023-11-25 08:07:27 

Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045~RFC2049,上面有MIME的详细规范。Base64编码可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。

此时,采用Base64编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到。
java的加密方式有很多中,现在给大家分享一个Base64加密的方式


package com.crypt;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
/**
*  BASE64加密解密
* @author YUANWEi
*/
public class BASE64 {
 /**
  * BASE64解密
  *
  * @param key
  * @return
  * @throws Exception
  */
 public static byte[] decryptBASE64(String key) throws Exception {
   return (new BASE64Decoder()).decodeBuffer(key);
 }

/**
  * BASE64加密
  *
  * @param key
  * @return
  * @throws Exception
  */
 public static String encryptBASE64(byte[] key) throws Exception {
   return (new BASE64Encoder()).encodeBuffer(key);
 }
}

为什么要使用Base64加密呢?

Base64编码的作用:由于某些系统中只能使用ASCII字符。Base64就是用来将非ASCII字符的数据转换成ASCII字符的一种方法。它使用下面表中所使用的字符与编码。

而且base64特别适合在http,mime协议下快速传输数据。

base64其实不是安全领域下的加密解密算法。虽然有时候经常看到所谓的base64加密解密。其实base64只能算是一个编码算法,对数据内容进行编码来适合传输。虽然base64编码过后原文也变成不能看到的字符格式,但是这种方式很初级,很简单。

Base64编码方法要求把每三个8Bit的字节转换为四个6Bit的字节,其中,转换之后的这四个字节中每6个有效bit为是有效数据,空余的那两个 bit用0补上成为一个字节。因此Base64所造成数据冗余不是很严重,Base64是当今比较流行的编码方法,因为它编起来速度快而且简单。

知识补充:

标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,而这些“%”号在存入数据库时还需要再进行转换,因为ANSI SQL中已将“%”号用作通配符。

为解决此问题,可采用一种用于URL的改进Base64编码,它不在末尾填充'='号,并将标准Base64中的“+”和“/”分别改成了“*”和“-”,这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。

另有一种用于正则表达式的改进Base64变种,它将“+”和“/”改成了“!”和“-”,因为“+”,“*”以及前面在IRCu中用到的“[”和“]”在正则表达式中都可能具有特殊含义。

此外还有一些变种,它们将“+/”改为“_-”或“._”(用作编程语言中的标识符名称)或“.-”(用于XML中的Nmtoken)甚至“_:”(用于XML中的Name)。

Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。

标签:java,Base64,加密解密
0
投稿

猜你喜欢

  • SpringBoot实现PPT格式文件上传并在线预览功能

    2023-07-22 14:44:56
  • SpringBoot注入自定义的配置文件的方法详解

    2021-12-24 02:28:06
  • redis与ssm整合方法(mybatis二级缓存)

    2022-02-27 22:14:27
  • Eclipse新建Android项目报错解决方案详细汇总

    2022-12-12 10:53:56
  • Springboot 如何指定获取出 yml文件里面的配置值

    2022-08-29 21:04:48
  • java身份证合法性校验工具类实例代码

    2022-09-10 18:36:55
  • C#实现控制电脑注销,关机和重启

    2021-10-28 14:21:15
  • Java技能点之SimpleDateFormat进行日期格式化问题

    2023-09-09 01:50:26
  • Android SwipeRefreshLayout超详细讲解

    2023-08-22 13:43:28
  • Android实现文字滚动播放效果的代码

    2021-07-15 22:35:15
  • android Tween Animation属性设置方法实例

    2022-07-12 22:25:19
  • c#中判断字符串是不是数字或字母的方法

    2023-02-10 06:08:49
  • gradle使用maven-publish发布jar包上传到私有maven配置

    2022-11-22 07:07:54
  • 关于C# 类的封装详情

    2023-11-29 05:38:20
  • Java简单实现约瑟夫环算法示例

    2023-04-04 09:59:41
  • Java实现HDFS文件上传下载

    2022-05-18 15:08:06
  • Android编程使用GestureDetector实现简单手势监听与处理的方法

    2021-11-18 17:07:43
  • windows系统配置Java开发环境变量

    2022-03-07 23:28:07
  • C#中使用JSON.NET实现JSON、XML相互转换

    2022-12-11 04:34:12
  • Flutter底部导航栏的实现方式

    2023-11-05 18:21:36
  • asp之家 软件编程 m.aspxhome.com