Java语言实现 Base64 加密 & 解密


Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。

Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。

采用Base64编码具有不可读性,需要解码后才能阅读。

Base64由于以上优点被广泛应用于计算机的各个领域。

本文讲解如何使用Java语言实现Base64的加密和解密。(基于 JDK 1.8 的新增功能 Base64 特性)


初始版本

代码如下:

import java.io.UnsupportedEncodingException;
import java.util.Base64; /**
* @author Miracle Luna
* @version 1.0
* @date 2019/7/3 18:55
*/
public class Base64Converter { final static Base64.Encoder encoder = Base64.getEncoder();
final static Base64.Decoder decoder = Base64.getDecoder(); /**
* 给字符串加密
* @param text
* @return
*/
public static String encode(String text) {
byte[] textByte = new byte[0];
try {
textByte = text.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
String encodedText = encoder.encodeToString(textByte);
return encodedText;
} /**
* 将加密后的字符串进行解密
* @param encodedText
* @return
*/
public static String decode(String encodedText) {
String text = null;
try {
text = new String(decoder.decode(encodedText), "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return text;
} public static void main(String[] args) throws UnsupportedEncodingException { String username = "Miracle Luna";
String password = "p@sSW0rd"; // 加密
System.out.println("==== [加密后] 用户名/密码 =====");
System.out.println(Base64Converter.encode(username));
System.out.println(Base64Converter.encode(password)); // 解密
System.out.println("\n==== [解密后] 用户名/密码 =====");
System.out.println(Base64Converter.decode(Base64Converter.encode(username)));
System.out.println(Base64Converter.decode(Base64Converter.encode(password)));
}
}

运行结果如下:

====  [加密后] 用户名/密码  =====
TWlyYWNsZSBMdW5h
cEBzU1cwcmQ= ==== [解密后] 用户名/密码 =====
Miracle Luna
p@sSW0rd

改进版本(推荐)

代码如下:

import java.nio.charset.StandardCharsets;
import java.util.Base64; /**
* @author Miracle Luna
* @version 1.0
* @date 2019/7/3 18:55
*/
public class Base64Util { final static Base64.Encoder encoder = Base64.getEncoder();
final static Base64.Decoder decoder = Base64.getDecoder(); /**
* 给字符串加密
* @param text
* @return
*/
public static String encode(String text) {
// byte[] textByte = text.getBytes(StandardCharsets.UTF_8);
// String encodedText = encoder.encodeToString(textByte);
// return encodedText;
return encoder.encodeToString(text.getBytes(StandardCharsets.UTF_8));
} /**
* 将加密后的字符串进行解密
* @param encodedText
* @return
*/
public static String decode(String encodedText) {
return new String(decoder.decode(encodedText), StandardCharsets.UTF_8);
} public static void main(String[] args) { String username = "Miracle Luna";
String password = "p@sSW0rd"; // 加密
System.out.println("==== [加密后] 用户名/密码 =====");
System.out.println(Base64Util.encode(username));
System.out.println(Base64Util.encode(password)); // 解密
System.out.println("\n==== [解密后] 用户名/密码 =====");
System.out.println(Base64Util.decode(Base64Util.encode(username)));
System.out.println(Base64Util.decode(Base64Util.encode(password)));
}
}

运行结果如下:

====  [加密后] 用户名/密码  =====
TWlyYWNsZSBMdW5h
cEBzU1cwcmQ= ==== [解密后] 用户名/密码 =====
Miracle Luna
p@sSW0rd

PS:

改进版本使用了 StandardCharsets.UTF_8 代替了 "UTF-8"。

所以,没有抛出初始版本的 UnsupportedEncodingException 异常。

StandardCharsets.java 源码如下:

/*
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
* ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*/
package java.nio.charset; /**
* Constant definitions for the standard {@link Charset Charsets}. These
* charsets are guaranteed to be available on every implementation of the Java
* platform.
*
* @see <a href="Charset#standard">Standard Charsets</a>
* @since 1.7
*/
public final class StandardCharsets { private StandardCharsets() {
throw new AssertionError("No java.nio.charset.StandardCharsets instances for you!");
}
/**
* Seven-bit ASCII, a.k.a. ISO646-US, a.k.a. the Basic Latin block of the
* Unicode character set
*/
public static final Charset US_ASCII = Charset.forName("US-ASCII");
/**
* ISO Latin Alphabet No. 1, a.k.a. ISO-LATIN-1
*/
public static final Charset ISO_8859_1 = Charset.forName("ISO-8859-1");
/**
* Eight-bit UCS Transformation Format
*/
public static final Charset UTF_8 = Charset.forName("UTF-8");
/**
* Sixteen-bit UCS Transformation Format, big-endian byte order
*/
public static final Charset UTF_16BE = Charset.forName("UTF-16BE");
/**
* Sixteen-bit UCS Transformation Format, little-endian byte order
*/
public static final Charset UTF_16LE = Charset.forName("UTF-16LE");
/**
* Sixteen-bit UCS Transformation Format, byte order identified by an
* optional byte-order mark
*/
public static final Charset UTF_16 = Charset.forName("UTF-16");
}

推荐一个在线 Base64 加密&解密的网页:https://base64.supfree.net/

对 p@sSW0rd 进行加密,效果如下:

加密前:

加密后:

Java语言实现 Base64 加密 & 解密的更多相关文章

  1. Java中使用BASE64加密&解密

    package com.bao.tools.encryption; import java.io.IOException; import org.junit.Test; import sun.misc ...

  2. Java android DES+Base64加密解密

    服务器与客户端加密解密传输, 中间遇到各种坑,客户端无论用AES还是DES解密时都会出现错误,后来才看到好多人说要用AES/DES加完密后还要BASE64加密,照做时发现android和java的Ba ...

  3. Java Base64 加密解密

    使用JDK的类 BASE64Decoder  BASE64Encoder package test; import sun.misc.BASE64Decoder; import sun.misc.BA ...

  4. password学3——Java BASE64加密解密

    Base64是网络上最常见的用于传输8Bit字节代码的编码方式之中的一个,大家能够查看RFC2045-RFC2049.上面有MIME的具体规范.Base64编码可用于在HTTP环境下传递较长的标识信息 ...

  5. Java 语言实现 MD5 加密

    Java 语言实现 MD5 加密 背景说明 在实际项目中,为了安全性考虑,经常要求账号密码是以加密后的密文形式,保存到数据库中. 这样,即使有人获取到了数据库中的密文密码,也不知道明文密码信息是什么, ...

  6. C# Java间进行RSA加密解密交互

    原文:C# Java间进行RSA加密解密交互 这里,讲一下RSA算法加解密在C#和Java之间交互的问题,这两天纠结了很久,也看了很多其他人写的文章,颇受裨益,但没能解决我的实际问题,终于,还是被我捣 ...

  7. C# Java间进行RSA加密解密交互(二)

    原文:C# Java间进行RSA加密解密交互(二) 接着前面一篇文章C# Java间进行RSA加密解密交互,继续探讨这个问题. 在前面,虽然已经实现了C# Java间进行RSA加密解密交互,但是还是与 ...

  8. C# Java间进行RSA加密解密交互(三)

    原文:C# Java间进行RSA加密解密交互(三) 接着前面一篇C# Java间进行RSA加密解密交互(二)说吧,在上篇中为了实现 /** * RSA加密 * @param text--待加密的明文 ...

  9. SM4加密算法实现Java和C#相互加密解密

    SM4加密算法实现Java和C#相互加密解密 近期由于项目需要使用SM4对数据进行加密,然后传给Java后台,Java后台使用的也是SM4的加密算法但是就是解密不正确,经过一步步调试发现Java中好多 ...

随机推荐

  1. CUDA和TensorFlow的版本匹配问题

    CUDA和TensorFlow的版本匹配问题 部分转载自博客:https://blog.csdn.net/MahoneSun/article/details/80809042 列举一些CUDA和Ten ...

  2. K nearest neighbor cs229

    vectorized code 带来的好处. import numpy as np from sklearn.datasets import fetch_mldata import time impo ...

  3. js实现购物车数量的增加与减少,js实现购物车数量的自增与自减

    js实现购物车数量的增加与减少,js实现购物车数量的自增与自减 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//E ...

  4. Netty入门 零基础

    因为接下来的项目要用到netty,所以就了解一下这个程序,奈何网上的教程都是稍微有点基础的,所以,就写一篇对于netty零基础的,顺便也记录一下. 先扔几个参考学习的网页: netty 官方API:  ...

  5. 网络摘抄-深入浅出JVM调优

    基本概念: JVM把内存区分为堆区(heap).栈区(stack)和方法区(method).由于本文主要讲解JVM调优,因此我们可以简单的理解为,JVM中的堆区中存放的是实际的对象,是需要被GC的.其 ...

  6. k8s知识2

    kubernetes到底有多难?看下面的白话: service 网络通信原理service 由k8s外面的服务作为访问端 内部里面其实是pod————————————————————————————— ...

  7. 《剑指offer》算法题第五天

    今日题目: 反转链表 合并两个排序的链表 树的子结构 二叉树的镜像 对称二叉树 今日重点是1反转链表,3树的子结构,以及5对称二叉树. 1. 反转链表 题目描述: 输入一个链表,反转链表后,输出链表的 ...

  8. 数位dp入门(内容一样,新版格式)

    顾名思义,数位dp,是一种用来计数的dp,就是把一个数字拆成一个一个数位去统计 如果现在给你一道题,需要你求在区间[l,r]内满足条件的解的个数,我们很容易想到去暴力枚举,但要是数据范围太大这种办法就 ...

  9. codeforces402B

    Trees in a Row CodeForces - 402B The Queen of England has n trees growing in a row in her garden. At ...

  10. 消费端ACK和重回队列

    使用场景 消费端ACK和重回队列 消费端ACK使用场景: 1.消费端进行消费的时候,如果由于业务异常我们可以进行日志记录,然后进行补偿. 2.由于服务器宕机等严重问题,那我们就需要手工进行ACK保障消 ...