第二章 Base64与URLBase64
2.1、算法基本规则:
- 加密的算法公开
- 加密的密钥不公开
Base64算法公开、密钥也公开的特性不符合基本算法规则,所以很容易被破解,所以一般不用于企业级的加密操作。
注意:具体的算法与密钥(对于Base64来讲,是一张字符映射表)可在《Java加密与解密的艺术(第2版)》第5章“电子邮件传输算法--Base64”中查看
2.2、应用场景
- 简单加密(加密要求不高的情况下,即一眼看不穿的那种情况下使用)
- 加密(改造字符映射表,即私藏秘钥)
- 电子邮件传输(邮件内容使用Base64加密,实际上主要是处理中文问题的)
- 网络数据传输(与URLBase64相关,下边会讲)
- 密钥存储(密钥是一段二进制数据,密钥在通信双方的传递过程:甲方将密钥采用Base64编码,写入文档,通过安全途径(例如线下等)传给乙方,采用Base64存储密钥是为了增强密钥的易读性)
- 数字证书存储
- OpenSSL操作Base64产生数字证书
通常,我们使用Base64最多的情况就是存储密钥。
2.3、Base64实现方式
实现方式有三种:
- Commons Codec(简称“CC”)
- Bouncy Castle(简称“BC”)
- JDK(不推荐使用,当做JDK没实现即可)
其中,最推荐使用Commons Codec。
注意:cc与bc的版本号,还有我实在jdk1.6下边调的
2.3.1、基于CC实现的Base64加解密
第一步:加入jar
第二步:编写代码
package com.util.base64; import java.io.UnsupportedEncodingException;
import org.apache.commons.codec.binary.Base64; /**
* 基于Commons Codec的Base64加密
*/
public class Base64CoderCC {
private static final String ENCODING = "UTF-8"; /**
* 一般Base64加密
*/
public static String encode(String data) throws UnsupportedEncodingException{
byte[] encodedByte = Base64.encodeBase64(data.getBytes(ENCODING));
return new String(encodedByte, ENCODING);
} /**
* 安全Base64加密
*/
public static String encodeSafe(String data) throws UnsupportedEncodingException{
/*
* 注意:这里采用的encodeBase64(byte[] bytes, boolean arg1)
* arg1为true时,加密后的字符串每行为76个字符,不论每行够不够76个字符,都要在行尾添加“\r\n”
*/
byte[] encodedByte = Base64.encodeBase64(data.getBytes(ENCODING),true);
return new String(encodedByte, ENCODING);
} /**
* Base64解密
*/
public static String decode(String data) throws UnsupportedEncodingException{
byte[] decodedByte = Base64.decodeBase64(data.getBytes(ENCODING));
return new String(decodedByte, ENCODING);
} /**
* 测试
* @param args
* @throws UnsupportedEncodingException
*/
public static void main(String[] args) throws UnsupportedEncodingException {
/********************测试一般encode*********************/
String data = "找一个好姑娘做老婆是我的梦 想!";
System.out.println("原文-->"+data);
String encodedStr = Base64CoderCC.encode(data);
System.out.println("加密后-->"+encodedStr);
String decodedStr = Base64CoderCC.decode(encodedStr);
System.out.println("解密后-->"+decodedStr);
System.out.println(data.equals(decodedStr));
System.out.println("================================");
/********************测试安全encode*********************/
String data2 = "找一个好姑娘做老婆是我的梦 想!找一个好姑娘做老婆是我的梦 想!";
System.out.println("原文-->"+data2);
String encodedStr2 = Base64CoderCC.encodeSafe(data2);
System.out.println("加密后-->"+encodedStr2);
String decodedStr2 = Base64CoderCC.decode(encodedStr2);
System.out.println("解密后-->"+decodedStr2);
System.out.println(data2.equals(decodedStr2));
}
}
第三步:测试
上述代码的main()方法。
测试结果:
注意:可以采用debug断点调试来查看每一个变量的值来验证上边的情况。
2.3.2、基于BC实现的Base64加解密算法
对于BC来讲,只有一般Base64加密算法,jar包以及简要代码如下:
package com.util.base64; import java.io.UnsupportedEncodingException; import org.bouncycastle.util.encoders.Base64; /**
* 基于Bouncy Castle的Base64加密
*/
public class Base64CoderBC {
private static final String ENCODING = "UTF-8"; /**
* Base64加密
*/
public static String encode(String data) throws UnsupportedEncodingException{
byte[] encodedByte = Base64.encode(data.getBytes(ENCODING));
return new String(encodedByte, ENCODING);
} /**
* Base64解密
*/
public static String decode(String data) throws UnsupportedEncodingException{
byte[] decodedByte = Base64.decode(data.getBytes(ENCODING));
return new String(decodedByte, ENCODING);
} /**
* 测试
* @param args
* @throws UnsupportedEncodingException
*/
public static void main(String[] args) throws UnsupportedEncodingException {
String data = " 找一个好姑娘做老婆是我的梦 想! ";
System.out.println("原文-->"+data);
String encodedStr = Base64CoderBC.encode(data);
System.out.println("加密后-->"+encodedStr);
String decodedStr = Base64CoderBC.decode(encodedStr);
System.out.println("解密后-->"+decodedStr);
System.out.println(data.equals(decodedStr));
}
}
2.4、URLBase64实现方式
一般来讲这种算法仅用于使用get方式传递私密数据和以get方式传递二进制数据。
- commons codec(CC,推荐使用,因为不采用尾部补全,所以数据长度较短,减少了网络传输时间,尾部补全是Base64的)
- bouncy castle(BC)
2.4.1、基于CC实现URLBase64
package com.util.base64; import java.io.UnsupportedEncodingException;
import org.apache.commons.codec.binary.Base64;
/**
* 基于Commons Codec的URLBase64加密
*/
public class URLBase64CoderCC {
private static final String ENCODING = "UTF-8";
/**
* URLBase64加密
*/
public static String encode(String data) throws UnsupportedEncodingException{
byte[] encodedByte = Base64.encodeBase64URLSafe(data.getBytes(ENCODING));
return new String(encodedByte, ENCODING);
}
/**
* URLBase64解密
*/
public static String decode(String data) throws UnsupportedEncodingException{
byte[] decodedByte = Base64.decodeBase64(data.getBytes(ENCODING));
return new String(decodedByte, ENCODING);
} /**
* 测试
* @param args
* @throws UnsupportedEncodingException
*/
public static void main(String[] args) throws UnsupportedEncodingException {
String data = "找一个好姑娘做老婆是我的梦 想!";
System.out.println("原文-->"+data);
String encodedStr = URLBase64CoderCC.encode(data);
System.out.println("加密后-->"+encodedStr);
String decodedStr = URLBase64CoderCC.decode(encodedStr);
System.out.println("解密后-->"+decodedStr);
System.out.println(data.equals(decodedStr));
}
}
测试结果自己查看。
2.4.2、基于BC实现URLBase64
package com.util.base64; import java.io.UnsupportedEncodingException;
import org.bouncycastle.util.encoders.UrlBase64;
/**
* 基于BC的URLBase64加密
*/
public class URLBase64CoderBC {
private static final String ENCODING = "UTF-8";
/**
* URLBase64加密
*/
public static String encode(String data) throws UnsupportedEncodingException{
byte[] encodedByte = UrlBase64.encode(data.getBytes(ENCODING));
return new String(encodedByte, ENCODING);
}
/**
* URLBase64解密
*/
public static String decode(String data) throws UnsupportedEncodingException{
byte[] decodedByte = UrlBase64.decode(data.getBytes(ENCODING));
return new String(decodedByte, ENCODING);
} /**
* 测试
* @param args
* @throws UnsupportedEncodingException
*/
public static void main(String[] args) throws UnsupportedEncodingException {
String data = "找一个好姑娘做老婆是我的梦 想!";
System.out.println("原文-->"+data);
String encodedStr = URLBase64CoderBC.encode(data);
System.out.println("加密后-->"+encodedStr);
String decodedStr = URLBase64CoderBC.decode(encodedStr);
System.out.println("解密后-->"+decodedStr);
System.out.println(data.equals(decodedStr));
}
}
测试结果自己查看加密后的字符串与CC加密后字符串有什么不同。
第二章 Base64与URLBase64的更多相关文章
- Java 第二章 变量
第二章 变量 变量称为:是计算机语言中能储存计算机结果或能表示值抽象概念 .变量可以通过变量名访问 int money ; //变量 money=1000; //赋值 int money=1000: ...
- jquery 第二章
1.本章目标 css样式 选择器2.css样式 宽.高.边框.背景颜色.字体....... <html> <head> <style> div{ ...
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库
在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...
- 《Django By Example》第二章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:翻译完第一章后,发现翻译第二章的速 ...
- Jenkins入门系列之——02第二章 Jenkins安装与配置
2014-12-08:已不再担任SCM和CI的职位,Jenkins的文章如无必要不会再维护. 写的我想吐血,累死了. 网页看着不爽的,自己去下载PDF.有问题请留言! Jenkins入门系列之——03 ...
- Python黑帽编程 2.0 第二章概述
Python黑帽编程 2.0 第二章概述 于 20世纪80年代末,Guido van Rossum发明了Python,初衷据说是为了打发圣诞节的无趣,1991年首次发布,是ABC语言的继承,同时也是一 ...
- 《Entity Framework 6 Recipes》翻译系列 (3) -----第二章 实体数据建模基础之创建一个简单的模型
第二章 实体数据建模基础 很有可能,你才开始探索实体框架,你可能会问“我们怎么开始?”,如果你真是这样的话,那么本章就是一个很好的开始.如果不是,你已经建模,并在实体分裂和继承方面感觉良好,那么你可以 ...
- Asp.Net MVC4 + Oracle + EasyUI 学习 第二章
Asp.Net MVC4 + Oracle + EasyUI 第二章 --使用Ajax提升网站性能 本文链接:http://www.cnblogs.com/likeli/p/4236723.html ...
- 数据结构与算法分析C++表述第二章编程题
把昨天看的第二章巩固一下,做一做编程习题. 2.6: 第一天交2元罚金,以后每一天都是前一天的平方,第N天罚金将是多少? 这个题目和2.4.4-3介绍的幂运算基本一致.若按相同的递归思路分析,比那个问 ...
随机推荐
- bzoj1205: [HNOI2005]星际贸易
题目链接 bzoj1205: [HNOI2005]星际贸易 题解 辣鸡题面,毁我青春 辣鸡题面,毁我青 辣鸡题面,毁我 辣鸡题面,毁 第一问,背包dp 第二问 问题转化为在一个序列上经过好多点走到终点 ...
- 1200 同余方程 2012年NOIP全国联赛提高组
题目描述 Description 求关于 x 同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入描述 Input Description 输入只有一行,包含两个正整数 a, b,用 一个 空 ...
- JDK版本的特性
1. 2.JDK1.5增加的是: (1) 泛型与枚举类型(枚举类型是静态,常量.里面也可以包含构造方法,成员方法,但是构造方法一定是私有的. 适合枚举的是 有限数据,封装特定的数据,), (2)注解( ...
- RabbitMQ安装以及集群部署
本次记录安装RabbitMQ的过程,只针对MAC下单机版安装.单机集群安装方法以及配置haproxy负载均衡. RabbitMQ单机版本安装 RabbitMQ单机集群安装方法(适合开发练习) Rabb ...
- 解决 MyEclipse build workspace 慢,validation javascript 更慢的问题
自从升级了MyEclipse到7.0,项目Build的时候总是很慢,显示Validating 那些js,html文件.不管我怎么调整 Windows > Preference > MyEc ...
- U盘量产大致研究思路
这几天搞了一波U盘量产,很多年前玩的基本都是些皮毛,比如U盘分区,U盘启动,以及台电U盘的光驱启动等等,这些现在看起来其实都不入眼,只是简单的将U盘分个区,并且没玩到主控上面去. 下面是一些自己的理解 ...
- PHP上传文件大小限制的问题(转)
在用PHP进行文件上传的操作中,需要知道怎么控制上传文件大小的设置,而文件可传大小是受到多种因素制约的,现总结如下:1.php.ini:upload_max_filesize 所上传的文件的最大大 ...
- WCF中修改接口或方法名称而不影响客户端程序
本篇接着"从Web Service和Remoting Service引出WCF服务"中有关WCF的部分. 运行宿主应用程序. 运行Web客户端中的网页. 输入内容,点击按钮,能获取 ...
- Net Framework 2.0 MSI returned error code 1603解决方法
出现这种情况的原因,主要是用ghost做的系统,有很多系统中把ie给绑架了.下面的截图就是ghost做的系统中注册表的显示,通过上面的方法就可以解决这种Microsoft .NET Framework ...
- CAD扩展属性的提取--FME方式
一.CAD的扩展属性 了解一下CAD的扩展属性方式,CAD的扩展属性包括二类: 基于CAD二次开发的软件产品(例如南方cass),其扩展属性是附属在图形(点.多段线.注记.面)上面的,它是以XReco ...