java 加密解密方式
1、MD5(Message Digest Algorithm)加密算法
是一种单向加密算法,只能加密不能解密,示例
/**
* MD5简单加密
* @param content 加密内容
* @return String
*/
public static String md5Encrypt(final String content) { MessageDigest md5 = null;
try {
md5 = MessageDigest.getInstance(ALGORITHM_MD5);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
// md5.update(text.getBytes());
//digest()最后返回md5 hash值,返回值为8位字符串。因为md5 hash值是16位的hex值,实际上就是8位的字符
//BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示;得到字符串形式的hash值
BigInteger digest = new BigInteger(md5.digest(content.getBytes()));
//32位
return digest.toString(16);
}
2、BASE64进行加密/解密
通常用作对二进制数据进行加密,示例
/**
* base64加密
* @param content 待加密内容
* @return byte[]
*/
public static byte[] base64Encrypt(final String content) {
return Base64.getEncoder().encode(content.getBytes());
} /**
* base64解密
* @param encoderContent 已加密内容
* @return byte[]
*/
public static byte[] base64Decrypt(final byte[] encoderContent) {
return Base64.getDecoder().decode(encoderContent);
}
3、DES(Data Encryption Standard)对称加密/解密
数据加密标准算法,和BASE64最明显的区别就是有一个工作密钥,该密钥既用于加密、也用于解密,并且要求密钥是一个长度至少大于8位的字符串,示例
/**
* DES加密
* @param key 秘钥key
* @param content 待加密内容
* @return byte[]
*/
public static byte[] DESEncrypt(final String key, final String content) {
return processCipher(content.getBytes(), getSecretKey(key), Cipher.ENCRYPT_MODE , ALGORITHM_DES);
} /**
* DES解密
* @param key 秘钥key
* @param encoderContent 已加密内容
* @return byte[]
*/
public static byte[] DESDecrypt(final String key, final byte[] encoderContent) {
return processCipher(encoderContent, getSecretKey(key), Cipher.DECRYPT_MODE, ALGORITHM_DES);
}
4、RSA非对称加密/解密
非对称加密算法的典型代表,既能加密、又能解密。和对称加密算法比如DES的明显区别在于用于加密、解密的密钥是不同的。使用RSA算法,只要密钥足够长(一般要求1024bit),加密的信息是不能被破解的。示例
/**
* RSA加密
* @param content 待加密内容
* @return byte[]
*/
public static byte[] RSAEncrypt(final String content) {
return processCipher(content.getBytes(), keyPair.getPrivate(), Cipher.ENCRYPT_MODE , ALGORITHM_RSA);
} /**
* RSA解密
* @param encoderContent 已加密内容
* @return byte[]
*/
public static byte[] RSADecrypt(final byte[] encoderContent) {
return processCipher(encoderContent, keyPair.getPublic(), Cipher.DECRYPT_MODE, ALGORITHM_RSA);
}
5、SHA(Secure Hash Algorithm,安全散列算法)
数字签名等密码学应用中重要的工具,被广泛地应用于电子商务等信息安全领域,示例
/**
* SHA加密
* @param content 待加密内容
* @return String
*/
public static String SHAEncrypt(final String content) {
try {
MessageDigest sha = MessageDigest.getInstance(ALGORITHM_SHA);
byte[] sha_byte = sha.digest(content.getBytes());
StringBuffer hexValue = new StringBuffer();
for (byte b : sha_byte) {
//将其中的每个字节转成十六进制字符串:byte类型的数据最高位是符号位,通过和0xff进行与操作,转换为int类型的正整数。
String toHexString = Integer.toHexString(b & 0xff);
hexValue.append(toHexString.length() == 1 ? "0" + toHexString : toHexString);
}
return hexValue.toString(); // StringBuffer hexValue2 = new StringBuffer();
// for (int i = 0; i < sha_byte.length; i++) {
// int val = ((int) sha_byte[i]) & 0xff;
// if (val < 16) {
// hexValue2.append("0");
// }
// hexValue2.append(Integer.toHexString(val));
// }
// return hexValue2.toString();
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
6、HMAC(Hash Message Authentication Code,散列消息鉴别码)
使用一个密钥生成一个固定大小的小数据块,即MAC,并将其加入到消息中,然后传输。接收方利用与发送方共享的密钥进行鉴别认证,示例
/**
* HMAC加密
* @param key 给定秘钥key
* @param content 待加密内容
* @return String
*/
public static byte[] HMACEncrypt(final String key, final String content) {
try {
SecretKey secretKey = new SecretKeySpec(key.getBytes(), ALGORITHM_MAC);
Mac mac = Mac.getInstance(secretKey.getAlgorithm());
//初始化mac
mac.init(secretKey);
return mac.doFinal(content.getBytes());
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
测试代码:
public static void main(String[] args) {
//md5简单加密
String text = "i am text";
System.out.println(EnDecoderUtil.md5Encrypt(text));
//base64进行加密解密,通常用作对二进制数据进行加密
byte[] base64Encrypt = EnDecoderUtil.base64Encrypt("123456789");
String toHexString = HexUtils.toHexString(base64Encrypt);
System.out.println(toHexString);
byte[] base64Decrypt = EnDecoderUtil.base64Decrypt(base64Encrypt);
System.out.println(new String(base64Decrypt));
//DES对称加密/解密
//要求key至少长度为8个字符
String key = "123456789";
//加密
byte[] encode_bytes = EnDecoderUtil.DESEncrypt(key, "Hello, DES");
System.out.println(Base64.getEncoder().encodeToString(encode_bytes));
//解密
byte[] decode_bytes = EnDecoderUtil.DESDecrypt(key, encode_bytes);
System.out.println(new String(decode_bytes));
//RSA
//数据使用私钥加密
byte[] en_byte = EnDecoderUtil.RSAEncrypt("Hi, RSA");
System.out.println(Base64.getEncoder().encodeToString(en_byte));
//用户使用公钥解密
byte[] de_byte = EnDecoderUtil.RSADecrypt(en_byte);
System.out.println(new String(de_byte));
//服务器根据私钥和加密数据生成数字签名
byte[] sign_byte = EnDecoderUtil.getSignature(en_byte);
System.out.println(Base64.getEncoder().encodeToString(sign_byte));
//用户根据公钥、加密数据验证数据是否被修改过
boolean verify_result = EnDecoderUtil.verifySignature(en_byte, sign_byte);
System.out.println(verify_result);
//SHA
String sha = EnDecoderUtil.SHAEncrypt("Hi, RSA");
System.out.println(sha);
//HMAC
byte[] mac_bytes = EnDecoderUtil.HMACEncrypt(key, "Hi, HMAC");
System.out.println(HexUtils.toHexString(mac_bytes));
}
源码参照Github
java 加密解密方式的更多相关文章
- ◆JAVA加密解密-3DES
从数据安全谈起 当你使用网银时,是否担心你的银行卡会被盗用? 当你和朋友用QQ进行聊天时,是否担心你的隐私会被泄露? 作为开发者,编写安全的代码比编写优雅的代码更重要,因为 ...
- java加密解密的学习
注:此文章只是对如何学习java加密解密技术做一个讲解.并不涉及具体的知识介绍,如果有需要请留言,有时间我补冲长.个人觉着学习一个学习方法比学习一个知识点更有价值的多. 首先,对于加密解密知识体系没有 ...
- Java加密解密字符串
http://www.cnblogs.com/vwpolo/archive/2012/07/18/2597232.html Java加密解密字符串 旧文重发:http://www.blogjava ...
- java加密解密
java加密解密 public class MD5Util { /** * @param args */ public static void main(String[] args) { System ...
- password学4——Java 加密解密之消息摘要算法(MD5 SHA MAC)
Java 加密解密之消息摘要算法(MD5 SHA MAC) 消息摘要 消息摘要(Message Digest)又称为数字摘要(Digital Digest). 它是一个唯一相应一个消息或文本的固定长度 ...
- Java加密解密大全
ChinaSEI系列讲义(By 郭克华) Java加密解密方法大全 如果有文字等小错,请多包涵.在不盈利的情况下,欢迎免费传播. 版权所有.郭克华 本讲义经 ...
- java加密解密算法位运算
一.实例说明 本实例通过位运算的异或运算符 “ ^ ” 把字符串与一个指定的值进行异或运算,从而改变每个字符串中字符的值,这样就可以得到一个加密后的字符串.当把加密后的字符串作为程序输入内容,异或运算 ...
- cooking java ——加密解密
java安全与密码概述 主要分为三部分: 密码学基础,包括:相关术语:分类:常用安全体系. java的安全组成:jdk以及第三方扩展. 相关实现代码,包括:base64.MD5········ 密码学 ...
- Java加密解密相关
关于解释加密解密中的填充方案: http://laokaddk.blog.51cto.com/368606/461279/ 关于对称加密中的反馈模式: http://blog.csdn.net/aaa ...
随机推荐
- Python机器学习笔记:不得不了解的机器学习知识点(2)
之前一篇笔记: Python机器学习笔记:不得不了解的机器学习知识点(1) 1,什么样的资料集不适合用深度学习? 数据集太小,数据样本不足时,深度学习相对其它机器学习算法,没有明显优势. 数据集没有局 ...
- Leetcode之二分法专题-744. 寻找比目标字母大的最小字母(Find Smallest Letter Greater Than Target)
Leetcode之二分法专题-744. 寻找比目标字母大的最小字母(Find Smallest Letter Greater Than Target) 给定一个只包含小写字母的有序数组letters ...
- Oracle数据库测试和优化最佳实践: OTest介绍 (转)
当前Oracle数据库最佳测试工具OTest * Otest是用于Oracle数据库测试.优化.监控软件. * Otest是免费提供给Oracle客户和广大DBA工程师使用的软件.由原厂技术专家王 ...
- 学习HTML之后的感受
自从学习了HTML之后,感觉自己每天面对密密麻麻的代码,都有了一种密集恐惧症的感觉,作为一个计算机行业的小白,我十分渴望在计算机行业有所建树,以前计算机对我来说是一个神秘的领域.现在我正在努力进入这个 ...
- [Environment setup]python+selenium+Eclipse+pydev环境搭建
转载自: http://www.cnblogs.com/Bonker/p/3584707.html http://www.cnblogs.com/fnng/archive/2013/05/29/310 ...
- Springboot源码分析之代理对象内嵌调用
摘要: 关于这个话题可能最多的是@Async和@Transactional一起混用,我先解释一下什么是代理对象内嵌调用,指的是一个代理方法调用了同类的另一个代理方法.首先在这儿我要声明事务直接的嵌套调 ...
- 初玩Docker
Docker 和VM的区别 Docker就是类似于一个打包好的环境,相关的服务都安装在里面,可以直接使用的. VM就相当于另外一套独立的系统,独立的IP,虚拟硬件. 要使用就需要单独构建一套才可以. ...
- js获取一个月的天数
在使用其他语言获取每月天数的时候,一般都是存储到一个数组中进行获取,但是如果是二月份的话就需要首先判断是否闰年,再确定是28还是29了. js可以通过Date对象很方便的获取到每月的天数,在初始化Da ...
- MySql创建索引、删除索引、新增字段、删除字段、修改字段语句
--------------------------------------------------------- -- ALTER TABLE 创建索引 ---------------------- ...
- 每个Java开发人员都应该知道的10个基本工具
大家好,我们已经在2019年的第9个月,我相信你们所有人已经在2019年学到了什么,以及如何实现这些目标.我一直在写一系列文章,为你提供一些关于你可以学习和改进的想法,以便在2019年成为一个更好的. ...