java 基于口令加密算法,Java安全编程:基于口令加密(PBE)
安全 PBE
在之前的文章中曾讲到过DES加密算法,类似这种加密算法都有一个密钥,密钥的长度决定了加密的安全性,但是这种密钥比较难记忆,是需要存储的。
PBE算法是一种基于口令的加密算法,它并不是构建了一种新的加解密算法,而是对比如DES这样的算法进行了包装,采用随机数加口令的方式保证数据的安全。
在PBE算法中有口令一说,相当于我们记忆的密码,但是口令的长度以及安全性是有限的,所以这时需要采用随机数附加在口令上通过消息摘要算法经过迭代产生密钥。
使破译的难度加大。常用的PBE算法有PBEWITHMD5andDES。
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;
import java.util.Arrays;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;
import junit.framework.TestCase;
public class PBETest extends TestCase {
/** 算法 */
public static final String ALGORITHM = "PBEWITHMD5andDES";
/** 迭代次数 */
public static int ITERAT_COUNT = 100;
/**
* 构造一个8位的盐
* @return
*/
private byte[] initSalt() {
SecureRandom random = new SecureRandom();
return random.generateSeed(8);
}
/**
* 生成口令的Key
* @param password
* @return
* @throws NoSuchAlgorithmException
* @throws InvalidKeySpecException
*/
private Key getKey(String password) throws NoSuchAlgorithmException, InvalidKeySpecException {
PBEKeySpec spec = new PBEKeySpec(password.toCharArray());
SecretKeyFactory factory = SecretKeyFactory.getInstance(ALGORITHM);
return factory.generateSecret(spec);
}
/**
* 加密
* @param password
* @param salt
* @param data
* @return
* @throws NoSuchAlgorithmException
* @throws InvalidKeySpecException
* @throws NoSuchPaddingException
* @throws InvalidKeyException
* @throws InvalidAlgorithmParameterException
* @throws IllegalBlockSizeException
* @throws BadPaddingException
*/
public byte[] encript(String password, byte[] salt, byte[] data)
throws NoSuchAlgorithmException, InvalidKeySpecException,
NoSuchPaddingException, InvalidKeyException, BadPaddingException,
InvalidAlgorithmParameterException, IllegalBlockSizeException {
Key key = this.getKey(password);
//实例化PBE参数材料
PBEParameterSpec params = new PBEParameterSpec(salt, ITERAT_COUNT);
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, key, params);
return cipher.doFinal(data);
}
/**
* 解密
* @param password
* @param salt
* @param data
* @return
* @throws NoSuchAlgorithmException
* @throws InvalidKeySpecException
* @throws NoSuchPaddingException
* @throws InvalidKeyException
* @throws InvalidAlgorithmParameterException
* @throws IllegalBlockSizeException
* @throws BadPaddingException
*/
public byte[] decript(String password, byte[] salt, byte[] data)
throws NoSuchAlgorithmException, InvalidKeySpecException,
NoSuchPaddingException, InvalidKeyException, BadPaddingException,
InvalidAlgorithmParameterException, IllegalBlockSizeException {
Key key = this.getKey(password);
//实例化PBE参数材料
PBEParameterSpec params = new PBEParameterSpec(salt, ITERAT_COUNT);
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, key, params);
return cipher.doFinal(data);
}
public void test() throws Exception{
String data = "需要处理的数据";
String password = "123456";
byte[] salt = this.initSalt();
byte[] cryptograph = this.encript(password, salt, data.getBytes("GBK"));
byte[] newData = this.decript(password, salt, cryptograph);
System.out.println(data);
System.out.println(Arrays.toString(cryptograph));
System.out.println(new String(newData, "GBK"));
}
}
java 基于口令加密算法,Java安全编程:基于口令加密(PBE)相关推荐
- 口令加密算法 - Java加密与安全
口令加密我们在前面介绍了对称加密算法,他们的key其实一个byte数组,例如AES256算法,他的key实际上是一个32位的数组 我们普通的加入软件有所不同,我们在使用WinRAR这样的软件的时候,通 ...
- 基于C++的Qt网络编程——基于 IP 多播的网络会议程序
目录 一.实验题目 二.实验目的 三.总体设计 1.实验原理 2.设计步骤 四.详细设计 1.程序流程图 2.实验代码(部分) 五.实验结果与分析 六.小结与心得体会 一.实验题目 基于 IP 多播的 ...
- hmacsha256 java实现_HMACSHA256加密算法 java实现
import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; public class HMACSHA256 { /** * 将加密 ...
- Java Socket编程 - 基于TCP方式的二进制文件传输【转】http://blog.csdn.net/jia20003/article/details/8248221...
此人博客挺好的,推荐一个! 一个基于Java Socket协议之上文件传输的完整示例,基于TCP通信完成. 除了基于TCP的二进制文件传输,还演示了JAVA Swing的一些编程技巧,Demo程序 实 ...
- Java Socket编程 - 基于TCP方式的二进制文件传输
一个基于Java Socket协议之上文件传输的完整示例,基于TCP通信完成. 除了基于TCP的二进制文件传输,还演示了JAVA Swing的一些编程技巧,Demo程序 实现主要功能有以下几点: 1. ...
- tcp java实例_实现了基于TCP的Java Socket编程实例代码
实现了基于TCP的Java Socket编程,功能很简单:客户端向服务器端输出一名话"connect",服务器端接收输出到控制台并向客户端输出一名话"Hello" ...
- 翻页时钟java代码_Android编程基于自定义控件实现时钟功能的方法
本文实例讲述了Android编程基于自定义控件实现时钟功能的方法.分享给大家供大家参考,具体如下: 在学习安卓群英传自定义控件章节的时候,有一个例子是绘制时钟,在实现了书上的例子后就想看这个时钟能不能 ...
- java socket 通信协议_java 基于TCP协议的Socket编程和通信
java 基于 TCP 协议的 Socket 编程和通信 在网络通讯中,第一次主动发起通讯的程序被称作客户 端 (Client) 程序, 简称客户端, 而在第一次通讯中等待连接的 程序被称作服务器端 ...
- 网络编程----基于Java Email的电子邮件发送
前言 电子邮件(electronic mail,简称E-mail,标志:@)又称电子信箱.电子邮政,它是-种用电子手段提供信息交换的通信方式.电子邮件指用电子手段传送信件.单据.资料等信息的通信方法. ...
最新文章
- 激光雷达,马斯克看不上,却又无可替代?
- python【力扣LeetCode算法题库】1103- 分糖果 II
- 易语言读写配置项ini文件
- win10安装 MySQL安装教程
- Linux中的15个‘echo’ 命令实例
- 看从小自带BUFF的他,如何用代码降低万物互联的门槛
- jstree禁用父节点点击_Jstree 使用CheckBox插件 选中父节点时被禁用的子节点也会选中问题...
- phpmail通过qq发邮箱失败_PHP下利用PHPMailer配合QQ邮箱下的域名邮箱发送邮件
- python转cython_10分钟带你入门Cython
- Elasticsearch中object类型与nested类型之间的区别
- centos下安装xcrysden出现的问题
- Java学习之路-----Java基础简介,基础语法,Java标识符,修饰符,关键字与注释
- MD5 转码 实现加密解密
- docker镜像备份和恢复
- [转自CSDN]EXCEL工资数据表打印
- 使用rpm包及createrepo命令制作本地yum仓库
- 绝杀慕尼黑_慕尼黑如何将15,000台PC从Windows切换到Linux
- PowerBuilder 文本控件显示提示内容
- 大数据面试重点之kafka(六)
- 《那些年啊,那些事——一个程序员的奋斗史》——95