数据加解密之Java实现Base64加密

https://blog.csdn.net/slvayf/article/details/83377834
本文知识点引自上方链接
//--------------------------------划重点(知道在Java中有加密这么一回事即可,会使用base64加密)
可直接看实现方式

明文:准备加密的信息

加密:把明文处理为密文的过程

加密算法:具体实现明文转为密文的算法

加密密钥:通过加密算法进行加密操作需要的密钥

密文:被加密的明文

解密:将密文转为明文的过程

解密算法:具体实现密文转为明文的算法

解密密钥:通过解密算法进行解密操作需要的密钥

密码分析、主动攻击、被动攻击、密码体制(五部分)、密码协议(安全协议)、密码系统、柯克霍夫原则(现代密码学设计的基本原则)
时间:古典密码(以字符为基本加密单元)、现代密码(以信息块为基本加密单元)

保密内容:受限制算法(算法保密)(属于古典密码)、基于密钥算法(算法公开)(属于现代密码)

密码体制:对称密码(加解密密钥相同)、非对称密码(加密密钥和解密秘钥不同)

散列函数: 单向函数,验证数据完整性(长度不受限制、哈希值容易计算、运算过程不可逆)
消息摘要算法(MD类,如MD5)、安全散列算法(SHA)、消息认证算法(MAC)

数字签名: 主要是针对以数字形式存储的消息进行的处理
具体内容见我的另一篇文章

OSI与TCP/IP安全体系:
引用:ISO/OSI网络体系结构和TCP/IP协议模型

引用:OSI与TCP IP安全体系参考模型

Java的安全组成
JCA(Java Cryptography Architectrue)Java加密体系 (API)

提供基本的加密框架,如(消息摘要、数字签名)
JCE(Java Cryptography Extension)Java加密拓展 (API)

在JCA的基础上提供扩展,提供更多加密算法和密钥管理的功能
JSSE (Java Secure Socket Extesion)Java安全套接字拓展

提供基于SSL的加密功能,主要用于网络传输的过程中
JAAS(Java Authentication and Authentication Service)Java认证和认证服务

提供了在Java这个平台上进行用户身份验证的能力

引用:Java安全组成、包及第三方扩展

Java安全相关的包:
java.security:提供消息摘要算法,源码可见

javax.crypto:提供安全消息摘要、消息认证(鉴别)码

java.net.ssl:安全套接字,和网络传输相关的加解密操作,常用类(HttpsURLConnection、SSLContext)

Java安全相关第三方扩展
Bouncy Castle:开源,两种使用方式(配置、API调用)

Commons Codec:开源,Apache提供,Base64,URL编码解码,字符集编码

Base64算法: 百度百科
Base64算法的应用场景:E-Mail、密钥、证书文件

产生的历史原因:邮件的“历史问题” 当时,邮件在传输一些非ASCLL码的值,在一些不同的网关或者网络会出现问题。

定义:基于64个字符的编码算法 (RFC 2045关于Base算法的基本规范)

   Base64就是基于英文字母(大小写各26个共52个)+数字(10个)+两个特殊字符(+ /)来实现编码替换的加密方式。它并非是一个严格意义的加解密的算法,只是一种编码的替换格式,而且对应的编码和值是公开的,比较容易破解,违反柯克霍夫原则。如果加上一些扰码,安全性会稍高一些。

在Java中的实现方式:

—JDK(不推荐使用)

   使用JDK进行Base64的加密解密都是使用sun.misc包下的BASE64Encoder及BASE64Decoder的sun.misc.BASE64Encoder和BASE64Decoder类。这个类是sun公司的内部方法,并没有在java api中公开过,不属于JDK标准库范畴,但在JDK中包含了该类,可以直接使用。如果在Eclipse和MyEclipse中直接使用,却找不到该类。

解决方法:解决Eclipse中无法直接使用Base64Encoder的问题

package practice;

public class Base64Test {

private static String str = "test text";

public static void main(String[] args) {
	jdkBase64();
}

public static void jdkBase64() {
	BASE64Encoder encoder = new BASE64Encoder();
	String encoder = encoder.encode(str.getBytes());
	System.out.println(encoder);
	BASE64Decoder decoder = new BASE64Decoder();
	System.out.println(new String(decoder.decodeBuffer(encoder)));
}

}
—Commons Codec

提前导入的.jar包:commons-codec-1.10.jar

下载jar包

package practice;

import org.apache.commons.codec.binary.Base64;

public class Base64Test {

private static String str = "test text";

public static void main(String[] args) {
	commonsCodecBase64();
}

public static void commonsCodecBase64() {
	String encode = new String(Base64.encodeBase64(str.getBytes()));
	System.out.println(encode);

	String decode = new String(Base64.decodeBase64(encode));
	System.out.println(decode);
}

}
—Bouncy Castle

提前导入的.jar包:bcprov-jdk15on-149.jar

package practice;

import org.bouncycastle.util.encoders.Base64;

public class Base64Test {

private static String str = "test text";

public static void main(String[] args) {
	bouncyCastleBase64();
}

public static void bouncyCastleBase64() {
	String encode = new String(Base64.encode(str.getBytes()));
	System.out.println(encode);

	String decode = new String(Base64.decode(encode));
	System.out.println(decode);
}

}
封装起来:(用着舒服)

package pers.slvayf.aio.verification;

import org.bouncycastle.util.encoders.Base64;

/******************************************************************************************

  • 2018.10.25
  • Release
  • By slvayf.
  • Eclipse Java Oxygen & JDK-9.0.4 & bcprov-jdk15on-149.jar
  • Base64文本预处理工具类
  • 利用 bouncycastle扩展类为系统提供Base64算法能力,对参数文本进行Base64处理并return

*/
public class Base64Tools {

public static String bouncyCastleEn(String str) {
	String encryption = new String(Base64.encode(str.getBytes()));
	return encryption;
}

public static String bouncyCastleDe(String str) {
	String decrypt = new String(Base64.decode(str));
	return decrypt;
}

}
调用一下:(静态方法,直接调用就行)

// 加密
String encryption = Base64Tools.bouncyCastleEn(str);
// 解密
String decryptGet = Base64Tools.bouncyCastleDe(str);

引用的资料
https://blog.csdn.net/htyurencaotang/article/details/11473015
ISO/OSI网络体系结构和TCP/IP协议模型

  1. ISO/OSI的参考模型共有7层,由低层至高层分别为:物理层、数据链路层、网络层、传输层、会话层、表示层、

    应用层。各层功能分别为:

(1)物理层

     提供建立、维护和拆除物理链路所需的机械、电气、功能和规程的特性;提供有关在传输介质上传输非结构的位流

    及物理链路故障检测指示。在这一层,数据还没有被组织,仅作为原始的位流或电气电压处理,单位是比特。

(2)数据链路层

    负责在两个相邻结点间的线路上,无差错地传送以帧为单位的数据,并进行流量控制。每一帧包括一定数量的数据

    和一些必要的控制信息。与物理层相似,数据链路层要负责建立、维持和释放数据链路的连接。在传送数据时,如

    果接收点检测到所传数据中有差错,就要通知发方重发这一帧。

(3)网络层

     为传输层实体提供端到端的交换网络数据传送功能,使得传输层摆脱路由选择、交换方式、拥挤控制等网络传输

     细节;可以为传输层实体建立、维持和拆除一条或多条通信路径;对网络传输中发生的不可恢复的差错予以报告。

     网络层将数据链路层提供的帧组成数据包,包中封装有网络层包头,其中含有逻辑地址信息——源站点和目的站点

    地址的网络地址。

(4)传输层

     为会话层实体提供透明、可靠的数据传输服务,保证端到端的数据完整性;选择网络层的最适宜的服务;提供建

     立、维护和拆除传输连接功能。传输层根据通信子网的特性,最佳的利用网络资源,为两个端系统的会话层之间提

     供建立、维护和取消传输连接的功能,并以可靠和经济的方式传输数据。在这一层,信息的传送单位是报文。

(5)会话层

     为彼此合作的表示层实体提供建立、维护和结束会话连接的功能;完成通信进程的逻辑名字与物理名字间的对应;

     提供会话管理服务。

(6)表示层

      为应用层进程提供能解释所交换信息含义的一组服务,即将欲交换的数据从适合于某一用户的抽象语法,转换为

      适合于OSI系统内部使用的传送语法,提供格式化的表示和转换数据服务。数据的压缩,解压缩,加密和解密等

      工作都由表示层负责。

(7)应用层

      提供OSI用户服务,即确定进程之间通信的性质,以满足用户需要以及提供网络与用户应用软件之间的接口服务。

简言之,各层的作用:

 物理层:在物理媒体上传输原始的数据比特流。

数据链路层:将数据分成一个个数据帧,以数据帧为单位传输。有应有答,遇错重发。

网络层:将数据分成一定长度的分组,将分组穿过通信子网,从信源选择路径后传到信宿。

传输层:提供不具体网络的高效、经济、透明的端到端数据传输服务。

会话层:进程间的对话也称为会话,会话层管理不同主机上各进程间的对话。

表示层: 为应用层进程提供格式化的表示和转换数据服务。

应用层:提供应用程序访问OSI环境的手段。

  1. ISO/OSI参考模型与TCP/IP协议模型中各层的对应关系:

  2. 数据的封装和解封:

  3. OSI网络体系结构各层协议:

(1)应用层:TELNET、FTP、TFTP、SMTP、SNMP、HTTP、BOOTP、DHCP、DNS
(2)表示层:
文本:ASCII,EBCDIC
图形:TIFF,JPEG,GIF,PICT
声音:MIDI,MPEG,QUICKTIME

(3)会话层:NFS、SQL、RPC 、X-WINDOWS、ASP(APPTALK会话协议)、SCP
(4)传输层:TCP、UDP、SPX
(5)网络层:IP、IPX、ICMP、RIP、OSPF(Open Shortest Path First开放式最短路径优先)
(6)数据链路层:SDLC、HDLC、PPP、STP(Spanning Tree Protocol)、帧中继
(7)物理层:EIA/TIA RS-232、EIA/TIA RS-449、V.35、RJ-45

  1. 常用端口(每个协议都有一个缺省端口)

配合加密加密的知识需要网络传输 相关知识,网络安全相关专业的就必须要熟练使用
(了解即可)

https://blog.csdn.net/chengqiuming/article/details/78714624
引用:Java安全组成、包及第三方扩展
java安全组成、包及第三方扩展
2017年12月04日 22:21:10 chengqiuming 阅读数:367
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chengqiuming/article/details/78714624
一 Java安全组成
JCA:Java Cryptography Architecture
JCE:Java Cryptography Extension
JSSE:Java Secure Socket Extension
JAAS:Java Authentication and Authencication Service

二 Java安全扩展

三 配置文件

四 JDK相关Java包和类
java.security:消息摘要
javax.crypto:安全消息摘要、消息认证(鉴别)码
java.net.ssl:安全套接字

五 第三方Java扩展
1、Bouncy Castle
两种支持方案:1)配置;2)调用
2、Commons Codec
Apache
Base64、二进制、十六进制、字符集编码
URL编码/解码

六 Java编程中常用类
1、消息编码
BASE64Encoder、BASE64Decoder
2、消息摘要
MessageDigest
3、对称密码
KeyGenerator、SecretKey、Cipher
4、非对称密码
KeyPairGenerator、KeyFactory、KeyPair、PublicKey、PrivateKey、Cipher
5、数字签名
Signature

https://baike.baidu.com/item/bouncy castle/2966441
Bouncy Castle:开源,两种使用方式(配置、API调用)
bs官网(使用bc ,jdk是有版本限制的,需要注意)
https://www.bouncycastle.org/
用于Java 的Bouncy Castle Crypto API包括以下内容:

轻量级加密API。

Java加密扩展(JCE)和Java加密体系结构(JCA)的提供程序。

Java安全套接字扩展(JSSE)的提供程序。

JCE 1.2.1的洁净室实现。

用于读取和编写编码的ASN.1对象的库。

用于TLS(RFC 2246,RFC 4346)和DTLS(RFC 6347 / RFC 4347)的轻量级API。

版本1和版本3 X.509证书,版本2 CRL和PKCS12文件的生成器。

版本2 X.509属性证书的生成器。

用于S / MIME和CMS的生成器/处理器(PKCS7 / RFC 3852)。

OCSP的发生器/处理器(RFC 2560)。

TSP的生成器/处理器(RFC 3161和RFC 5544)。

CMP和CRMF的生成器/处理器(RFC 4210和RFC 4211)。

OpenPGP的生成器/处理器(RFC 4880)。

用于扩展访问控制(EAC)的生成器/处理器。

数据验证和认证服务器(DVCS)的生成器/处理器 - RFC 3029。

用于基于DNS的命名实体认证的发生器/处理器(DANE)。

用于RFC 7030安全传输(EST)注册的生成器/处理器。

签名的jar版本适用于JDK 1.4-1.8和Sun JCE。

Commons Codec:开源,Apache提供,Base64,URL编码解码,字符集编码
https://baike.baidu.com/item/Commons codec/5191235
使用例子
https://www.cnblogs.com/tingzi/archive/2012/08/17/2643742.html

解决Eclipse中无法直接使用Base64Encoder的问题
https://blog.csdn.net/u011514810/article/details/72725398

Java Base64 加密与解密
https://blog.csdn.net/neweastsun/article/details/80542350

ava 8 中 Base 64
java 8 在标准API中增加Base64功能,通过 java.util.Base64工具类。首先我们看基本的加密过程:

Java 8 基本 Base64
基本的加密尽量保持简单,加密输入字符串没有增加任何换行符。输出被映射到“A-Za-z0-9+/”字符集中,解密从该字符集中解析为任意字符。

首先加密一个简单字符串:

String originalInput = “test input”;
String encodedString = Base64.getEncoder().encodeToString(originalInput.getBytes());

我们通过简单Base64.getEncoder()工具方法获得完整的加密API,现在我们来解密并返回原始字符串:

byte[] decodedBytes = Base64.getDecoder().decode(encodedString);
String decodedString = new String(decodedBytes);

java 8 Base64编码没有填充
如果Base64编码的二进制数据不是3的倍数,输出结果使用“=”号进行填充,所以结果会有一个或两个“=”号。
解密是填充的“=”号会被丢弃。如果你省略填充“=”,结果字符串可能不能被正确解密,可以简单使用解密没有填充方法:

String encodedString =
Base64.getEncoder().withoutPadding().encodeToString(originalInput.getBytes());

Java 8 URL 加密
URL加密和上述基本加密类似,它使用URL和文件名安全Base64字母表(没有‘+’和‘/’,增加‘-’和‘_’),不添加任何换行隔:

String originalUrl = “https://www.google.co.nz/?gfe_rd=cr&ei=dzbFV&gws_rd=ssl#q=java”;
String encodedUrl = Base64.getUrlEncoder().encodeToString(originalURL.getBytes());

解密方式一致——getUrlDecoder() 工具方法返回java.util.Base64.Decoder ,然后解密URL:

byte[] decodedBytes = Base64.getUrlDecoder().decode(encodedUrl);
String decodedUrl = new String(decodedBytes);

Java 8 MIME 加密
MIME 英文全称为:Multipurpose Internet Mail Extensions。
首先生成一些基本MIME输入数据用于加密:

private static StringBuilder getMimeBuffer() {
StringBuilder buffer = new StringBuilder();
for (int count = 0; count < 10; ++count) {
buffer.append(UUID.randomUUID().toString());
}
return buffer;
}

MIME加密工具生成Base64加密输出,输出被映射到“A-Za-z0-9+/”字符集中,编码输出必须以每行不超过76个字符的形式表示,并使用后面跟着的回车符’\r’和换行符’\n’为分隔符。

StringBuilder buffer = getMimeBuffer();
byte[] encodedAsBytes = buffer.toString().getBytes();
String encodedMime = Base64.getMimeEncoder().encodeToString(encodedAsBytes);

getMimeDecoder() 工具方法返回java.util.Base64.Decoder 用于解密过程:

byte[] decodedBytes = Base64.getMimeDecoder().decode(encodedMime);
String decodedMime = new String(decodedBytes);

使用Apache Commons Code实现加密和解密
首先引入maven依赖:

commons-codec commons-codec 1.10

其主要API是org.apache.commons.codec.binary.Base64类,其重构了带有不同参数的构造函数。

Base64(boolean urlSafe) – 通过控制URL安全模式创建 Base64 API
Base64(int lineLength) – 创建URL非安全模式的 Base64 API ,并控制行的长度(缺省为 76)
Base64(int lineLength, byte[] lineSeparator) – 接收额外换行符参数创建 Base64 API去,缺省为 CRLF (“\r\n”)
Base64 API创建之后,加密、解密则非常简单:

String originalInput = “test input”;
Base64 base64 = new Base64();
String encodedString = new String(base64.encode(originalInput.getBytes()));

Base64的decode() 方法返回解密字符串:

String decodedString = new String(base64.decode(encodedString.getBytes()));

另外也可以使用Base64静态API,代替创建实例:

String originalInput = “test input”;
String encodedString = new String(Base64.encodeBase64(originalInput.getBytes()));
String decodedString = new String(Base64.decodeBase64(encodedString.getBytes()));

总结
本文介绍了java中Base64加密和解密的基本用法,使用java 8 新引入的API和Apache Commons。
另外还有其他库实现类似功能——java.xml.bind.DataTypeConverter 提供的 printHexBinary 和 parseBase64Binary。

作者:neweastsun
来源:CSDN
原文:https://blog.csdn.net/neweastsun/article/details/80542350
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/qq_35967283/article/details/86499160