详见:https://blog.csdn.net/it_beecoder/article/details/71480770

Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045~RFC2049,上面有MIME的详细规范。本文给大家分享java常用的几种加密算法,需要的朋友可以参考下

对称加密算法是应用较早的加密算法,技术成熟。在对称加密算法中,数据发信方将明文(原始数据)和加密密钥(mi yue)一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密,这就要求解密方事先必须知道加密密钥。

简单的java加密算法有:

BASE 严格地说,属于编码格式,而非加密算法
MD(Message Digest algorithm ,信息摘要算法)
SHA(Secure Hash Algorithm,安全散列算法)
HMAC(Hash Message Authentication Code,散列消息鉴别码)

一.Base64

Base是网络上最常见的用于传输Bit字节代码的编码方式之一,大家可以查看RFC~RFC,上面有MIME的详细规范。Base编码可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了Base来将一个较长的唯一标识符(一般为-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base编码具有不可读性,即所编码的数据不会被人用肉眼所直接看到。(来源百度百科)

package com.my.test.encryption;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder; /*
BASE的加密解密是双向的,可以求反解.
BASEEncoder和BASEDecoder是非官方JDK实现类。虽然可以在JDK里能找到并使用,但是在API里查不到。
JRE 中 sun 和 com.sun 开头包的类都是未被文档化的,他们属于 java, javax 类库的基础,其中的实现大多数与底层平台有关,
一般来说是不推荐使用的。
BASE 严格地说,属于编码格式,而非加密算法
主要就是BASEEncoder、BASEDecoder两个类,我们只需要知道使用对应的方法即可。
另,BASE加密后产生的字节位数是的倍数,如果不够位数以=符号填充。
BASE
按照RFC的定义,Base被定义为:Base内容传送编码被设计用来把任意序列的位字节描述为一种不易被人直接识别的形式。
(The Base Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.)
常见于邮件、http加密,截取http信息,你就会发现登录操作的用户名、密码字段通过BASE加密的。
*/ public class TestBase64 { public static void main(String[] args) {
// TODO Auto-generated method stub String str = "ASD123@我的你的"; try {
String encryptionSting = encryptBASE(str.getBytes());
System.out.println(encryptionSting); byte[] bs = decryptBASE(encryptionSting); String password = new String(bs);
System.out.println(password);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } /**
* BASE解密
*
* @param key
* @return
* @throws Exception
*/
public static byte[] decryptBASE(String key) throws Exception {
return (new BASE64Decoder()).decodeBuffer(key);
} /**
* BASE加密
*
* @param key
* @return
* @throws Exception
*/
public static String encryptBASE(byte[] key) throws Exception {
return (new BASE64Encoder()).encodeBuffer(key);
} } 

解决Eclipse中无法直接使用sun.misc.BASE64Encoder及sun.misc.BASE64Decoder的问题:

详见:eclipse报错排解 问题16

 第二种. MD

MD即Message-Digest Algorithm (信息-摘要算法),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD的前身有MD、MD和MD。广泛用于加密和解密技术,常用于文件校验。校验?不管文件多大,经过MD后都能生成唯一的MD值。好比现在的ISO校验,都是MD校验。怎么用?当然是把ISO经过MD后产生MD的值。一般下载linux-ISO的朋友都见过下载链接旁边放着MD的串。就是用来验证文件是否一致的。

MessageDigest.getInstance("MD5") 有几种参数?写一个方法来获取

public static String[] getCryptoImpls(String serviceType) {
Set result = new HashSet(); // All all providers
Provider[] providers = Security.getProviders();
for (int i=0; i<providers.length; i++) {
// Get services provided by each provider
Set keys = providers[i].keySet();
for (Iterator it=keys.iterator(); it.hasNext(); ) {
String key = (String)it.next();
key = key.split(" ")[0]; if (key.startsWith(serviceType+".")) {
result.add(key.substring(serviceType.length()+1));
} else if (key.startsWith("Alg.Alias."+serviceType+".")) {
// This is an alias
result.add(key.substring(serviceType.length()+11));
}
}
}
return (String[])result.toArray(new String[result.size()]);
}

调用方法如下:
String[] names = getCryptoImpls("MessageDigest");

然后就会返回支持的加密算法

SHA-1
SHA1
SHA-384
OID.1.3.14.3.2.26
2.16.840.1.101.3.4.2.2
SHA
2.16.840.1.101.3.4.2.1
2.16.840.1.101.3.4.2.4
2.16.840.1.101.3.4.2.3
OID.2.16.840.1.101.3.4.2.4
OID.2.16.840.1.101.3.4.2.3
OID.2.16.840.1.101.3.4.2.2
1.3.14.3.2.26
OID.2.16.840.1.101.3.4.2.1
SHA-224
SHA-256
MD2
SHA-512
MD5
package com.my.test.encryption;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
//单向加密
/*
MD(Message Digest algorithm ,信息摘要算法)
通常我们不直接使用上述MD加密。通常将MD产生的字节数组交给BASE再加密一把,得到相应的字符串
Digest:汇编
*/
public class TestMD {
public static void main(String[] args) {
System.out.println(getResult("12344567gyjtyity")); } public static final String KEY_MD = "MD2";
public static String getResult(String inputStr){
System.out.println("=======加密前的数据:"+inputStr);
BigInteger bigInteger=null;
try {
MessageDigest md = MessageDigest.getInstance(KEY_MD);
byte[] inputData = inputStr.getBytes();
md.update(inputData);
bigInteger = new BigInteger(md.digest());
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String result = bigInteger.toString();
System.out.println("MD加密后:" + result);
System.out.println(result.length());
return result;
} }

MD算法具有以下特点:

、压缩性:任意长度的数据,算出的MD值长度都是固定的。
、容易计算:从原数据计算出MD值很容易。
、抗修改性:对原数据进行任何改动,哪怕只修改个字节,所得到的MD值都有很大区别。
、弱抗碰撞:已知原数据和其MD值,想找到一个具有相同MD值的数据(即伪造数据)是非常困难的。
、强抗碰撞:想找到两个不同的数据,使它们具有相同的MD值,是非常困难的。

MD的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。除了MD以外,其中比较有名的还有sha-、RIPEMD以及Haval等。

三.SHA

package com.my.test.encryption;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
//单向加密
/*
SHA(Secure Hash Algorithm,安全散列算法),数字签名等密码学应用中重要的工具,
被广泛地应用于电子商务等信息安全领域。虽然,SHA与MD通过碰撞法都被破解了,
但是SHA仍然是公认的安全加密算法,较之MD更为安全*/
public class TestSHA {
public static void main(String[] args) {
getResult("12344567gyjtyity"); } public static final String KEY_MD = "SHA1";
public static String getResult(String inputStr){
System.out.println("=======加密前的数据:"+inputStr);
BigInteger bigInteger=null;
try {
MessageDigest md = MessageDigest.getInstance(KEY_MD);
byte[] inputData = inputStr.getBytes();
md.update(inputData);
bigInteger = new BigInteger(md.digest());
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String result = bigInteger.toString();
System.out.println("MD加密后:" + result);
System.out.println(result.length());
return result;
} }

第四种.HMAC

HMAC(Hash Message Authentication Code,散列消息鉴别码,基于密钥的Hash算法的认证协议。消息鉴别码实现鉴别的原理是,用公开函数和密钥产生一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。使用一个密钥生成一个固定大小的小数据块,即MAC,并将其加入到消息中,然后传输。接收方利用与发送方共享的密钥进行鉴别认证等。

DESede
SunTls12KeyMaterial
HmacSHA512
1.2.840.113549.2.11
OID.1.2.840.113549.2.11
Rijndael
HmacMD5
1.2.840.113549.2.10
HmacSHA256
HmacSHA1
SunTlsMasterSecret
TripleDES
SunTls12Prf
SunTls12MasterSecret
SunTls12RsaPremasterSecret
1.2.840.113549.2.8
RC2
1.2.840.113549.2.9
RC4
SunTlsKeyMaterial
OID.1.2.840.113549.2.9
OID.1.2.840.113549.2.8
ARCFOUR
OID.1.2.840.113549.2.7
AES
1.2.840.113549.2.7
SunTlsPrf
HmacSHA224
DES
HmacSHA384
Blowfish

mac(Message Authentication Code,消息认证码算法)是含有密钥散列函数算法,基于散列函数的消息认证码,它需要一个加密用散列函数(表示为H,可以是MD5或者SHA-1)和一个密钥K用以计算消息认证码,兼容了MD和SHA算法的特性,并在此基础上加上了密钥。因此MAC算法也经常被称作HMAC算法。关于hmac算法的详情可以参看RFC 2104(http://www.ietf.org/rfc/rfc2104.txt),这里包含了HmacMD5算法的C语言实现。
  这里需要说明的是经过mac算法得到的摘要值也可以使用十六进制编码表示,其摘要值的长度与实现算法的摘要值长度相同。例如 HmacSHA算法得到的摘要长度就是SHA1算法得到的摘要长度,都是160位二进制数,换算成十六进制的编码为40位。

二、模型分析
甲乙双方进行数据交换可以采取如下流程完成
1、甲方向乙方公布摘要算法(就是指定要使用的摘要算法名)
2、甲乙双方按照约定构造密钥,双方拥有相同的密钥(一般是一方构造密钥后通知另外一方,此过程不需要通过程序实现,就是双方约定个字符串,但是这个字符串可不是随便设定的,也是通过相关算法获取的)
3、甲方使用密钥对消息做摘要处理,然后将消息和生成的摘要消息一同发送给乙方
4、乙方收到消息后,使用甲方已经公布的摘要算法+约定好的密钥 对收到的消息进行摘要处理。然后比对自己的摘要消息和甲方发过来的摘要消息。甄别消息是否是甲方发送过来的

/**
* 初始化HMAC密钥
* 展示了一个生成指定算法密钥的过程 初始化HMAC密钥
*
* @return
* @throws Exception
*/
public static String initMacKey() throws Exception {
KeyGenerator kg = KeyGenerator.getInstance(KEY_MAC);
SecretKey secretKey = kg.generateKey();
return TestBase64.encryptBASE(secretKey.getEncoded());
} /**
* HMAC加密 :主要方法
*
* @param data
* @param key
* @return
* @throws Exception
*/
public static byte[] encryptHMAC(byte[] data, String key) throws Exception {
System.out.println("=====Mac明码:"+TestBase64.decryptBASE(key));
SecretKey secretKey = new SecretKeySpec(key.getBytes(), KEY_MAC);
Mac mac = Mac.getInstance(KEY_MAC);
mac.init(secretKey);
return mac.doFinal(data);
}

完整代码:包含三种对 结果的处理和参数的查询方法:

package com.my.test.encryption;

import java.math.BigInteger;
import java.security.Provider;
import java.security.Security;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set; import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec; import sun.misc.BASE64Decoder; //单向加密
/*
HMAC
HMAC(Hash Message Authentication Code,散列消息鉴别码,基于密钥的Hash算法的认证协议。
消息鉴别码实现鉴别的原理是,用公开函数和密钥产生一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。
使用一个密钥生成一个固定大小的小数据块,
即MAC,并将其加入到消息中,然后传输。接收方利用与发送方共享的密钥进行鉴别认证等。*/
public class TestHMAC {
public static final String KEY_MAC = "HmacMD5"; /**
* 全局数组
*/
private final static String[] hexDigits = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d",
"e", "f" }; public static void main(String[] args) {
// TODO Auto-generated method stub
String inputStr = "Thisisatest";
try {
System.out.println("=====加密前的数据 : " + inputStr);
// String key = initMacKey();//每次产生一个不同的key String key = "6666"; System.out.println("=====Mac密钥:" + key);
byte[] data = inputStr.getBytes(); byte[] results = encryptHMAC(data, key);
BigInteger bigInteger = new BigInteger(results);
System.out.println(" ===" + byte2hex(results));
System.out.println("==== " + byteArrayToHexString(results));
System.out.println(bigInteger);
System.out.println(bigInteger.toString(16)); } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } /**
* 初始化HMAC密钥 展示了一个生成指定算法密钥的过程 初始化HMAC密钥
*
* @return
* @throws Exception
*/
//
// public static String initMacKey() throws Exception {
// KeyGenerator kg = KeyGenerator.getInstance(KEY_MAC);
// SecretKey secretKey = kg.generateKey();
// return TestBase64.encryptBASE(secretKey.getEncoded());
// }
//
/**
* HMAC加密 :主要方法
*
* @param data
* @param key
* @return
* @throws Exception
*/
public static byte[] encryptHMAC(byte[] data, String key) throws Exception {
System.out.println("=====Mac明码:" + TestBase64.decryptBASE(key));
SecretKey secretKey = new SecretKeySpec(key.getBytes(), KEY_MAC);
Mac mac = Mac.getInstance(KEY_MAC);
mac.init(secretKey);
return mac.doFinal(data);
} // 获取 KeyGenerator所支持的所有参数
public static String[] getCryptoImpls(String serviceType) {
Set result = new HashSet(); // All all providers
Provider[] providers = Security.getProviders();
for (int i = 0; i < providers.length; i++) {
// Get services provided by each provider
Set keys = providers[i].keySet();
for (Iterator it = keys.iterator(); it.hasNext();) {
String key = (String) it.next();
key = key.split(" ")[0]; if (key.startsWith(serviceType + ".")) {
result.add(key.substring(serviceType.length() + 1));
} else if (key.startsWith("Alg.Alias." + serviceType + ".")) {
// This is an alias
result.add(key.substring(serviceType.length() + 11));
}
}
}
return (String[]) result.toArray(new String[result.size()]);
} // 二行制转字符串
public static String byte2hex(byte[] b) {
StringBuilder hs = new StringBuilder();
String stmp;
for (int n = 0; b != null && n < b.length; n++) {
stmp = Integer.toHexString(b[n] & 0XFF);
if (stmp.length() == 1)
hs.append('0');
hs.append(stmp);
}
return hs.toString().toUpperCase();
} /**
* 将一个字节转化成十六进制形式的字符串
*
* @param b
* 字节数组
* @return 字符串
*/
private static String byteToHexString(byte b) {
int ret = b;
// System.out.println("ret = " + ret);
if (ret < 0) {
ret += 256;
}
int m = ret / 16;
int n = ret % 16;
return hexDigits[m] + hexDigits[n];
} /**
* 转换字节数组为十六进制字符串
*
* @param bytes
* 字节数组
* @return 十六进制字符串
*/
private static String byteArrayToHexString(byte[] bytes) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < bytes.length; i++) {
sb.append(byteToHexString(bytes[i]));
}
return sb.toString();
} }

java常用的加密技术的更多相关文章

  1. Java常用的加密解密类(对称加密类)

    Java常用的加密解密类 原文转载至:http://blog.csdn.net/wyc_cs/article/details/8793198 原创 2013年04月12日 14:33:35 1704 ...

  2. 写一个java常用的加密工具类

    1.叙述 java security包下有很多加密算法类,我们可以很简单的调用它们.他们虽然功能很全,但是使用起来步骤有些繁琐.我在这里封装来一些常用的加密算法及他们常用的一些方法,来简化代码. 工具 ...

  3. 总结Java常用到的六个加密技术和代码

    加密,是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使获得了已加密的信息,但因不知解密的方法,仍然无法了解信息的内容.大体上分为双向加密和单向加密,而双向加密又分为对称加密和非对称加密(有些 ...

  4. java中使用MD5加密技术

    在项目中经常会对一些信息进行加密,现在常用的信息加密技术有:MD5.RSA.DES等,今天主要说一下,md5加密,以及如何在java代码根据自己的业务需求使用md5. MD5简介: MD5即Messa ...

  5. Java加密技术(一)——BASE64与单向加密算法MD5&SHA&MAC

    Java加密技术(一)——BASE64与单向加密算法MD5&SHA&MAC 博客分类: Java/Security Javabase64macmd5sha     加密解密,曾经是我一 ...

  6. JAVA加密技术-----MD5 与SHA 加密

    关于JAVA的加密技术有很多很多,这里只介绍加密技术的两种 MD5与 SHA. MD5与SHA是单向加密算法,也就是说加密后不能解密. MD5 ---信息摘要算法,广泛用于加密与解密技术,常用于文件校 ...

  7. 运用加密技术保护Java源代码/定制ClassLoader

    为什么要加密? 对于传统的C或C++之类的语言来说,要在Web上保护源代码是很容易的,只要不发布它就可以.遗憾的是,Java程序的源代码很容易被别人偷看.只要有一个反编译器,任何人都可以分析别人的代码 ...

  8. Java加密技术

    相关链接: Java加密技术(一)——BASE64与单向加密算法MD5&SHA&MAC Java加密技术(二)——对称加密DES&AES Java加密技术(三)——PBE算法  ...

  9. Java进阶(七)Java加密技术之非对称加密算法RSA

    Java加密技术(四)--非对称加密算法RSA 非对称加密算法--RSA 基本概念 非对称加密算法是一种密钥的保密方法. 非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(priv ...

随机推荐

  1. 按下home键,重新打开,应用重启

    其实不是重启,只是重新打开了luncher的那个activity.只要通过判断把它finish,就会显示按下home键前的页面. 解决方法: 在重启的页面中加入一下代码,注意加在setContentV ...

  2. vue路由嵌套,对应展示的视图

  3. Systemd 指令

    Systemd 指令 原文:http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html 一.由来 历史上,Linux 的 ...

  4. ip地址后面的斜杠24

    ip地址后面的斜杠24表示掩码位是24位的,即用32位二进制表示的子网掩码中有连续的24个“1”:11111111 11111111 11111111 00000000,将其转化为十进制,就是:255 ...

  5. Tushare金融大数据入门

    Tushare金融大数据社区,是一个免费提供各类金融数据和区块链数据的平台 ,旨在助力智能投资与创新型投资. 积分 数据千万条,积分第一条 目前,提供的数据包含股票.基金.期货.债券.外汇.行业大数据 ...

  6. 提交SVN Working copy locked解决

    今天一大早提交SVN的时候,出现这个错误: 百度了一下原因:因为我强制在commit的时候退出了,导致svn项目文件被锁了,不能commit,不能update了 赶紧百度了一下解决办法: http:/ ...

  7. C#编程 socket编程之TcpClient,TcpListener,UdpClient

    应用程序可以通过 TCPClient.TCPListener 和 UDPClient 类使用传输控制协议 (TCP) 和用户数据文报协议 (UDP) 服务.这些协议类建立在 System.Net.So ...

  8. 【MapReduce】二、MapReduce编程模型

      通过前面的实例,可以基本了解MapReduce对于少量输入数据是如何工作的,但是MapReduce主要用于面向大规模数据集的并行计算.所以,还需要重点了解MapReduce的并行编程模型和运行机制 ...

  9. 【科普杂谈】一文看懂大数据的技术生态圈,Hadoop,hive,spark都有了

    大数据本身是个很宽泛的概念,Hadoop生态圈(或者泛生态圈)基本上都是为了处理超过单机尺度的数据处理而诞生的.你可以把它比作一个厨房所以需要的各种工具.锅碗瓢盆,各有各的用处,互相之间又有重合.你可 ...

  10. 浅谈Web图像优化

    前端优化有很多,图像优化也是其中的一部分.无论是渐进增强还是优雅降级,图像优化成为了开发上不可忽视的一部分. 知其然,须知其所以然 图像优化的前提是需要了解图像的基本原理.常规的图像格式分为矢量图和位 ...