安全 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)相关推荐

  1. 口令加密算法 - Java加密与安全

    口令加密我们在前面介绍了对称加密算法,他们的key其实一个byte数组,例如AES256算法,他的key实际上是一个32位的数组 我们普通的加入软件有所不同,我们在使用WinRAR这样的软件的时候,通 ...

  2. 基于C++的Qt网络编程——基于 IP 多播的网络会议程序

    目录 一.实验题目 二.实验目的 三.总体设计 1.实验原理 2.设计步骤 四.详细设计 1.程序流程图 2.实验代码(部分) 五.实验结果与分析 六.小结与心得体会 一.实验题目 基于 IP 多播的 ...

  3. hmacsha256 java实现_HMACSHA256加密算法 java实现

    import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; public class HMACSHA256 { /** * 将加密 ...

  4. Java Socket编程 - 基于TCP方式的二进制文件传输【转】http://blog.csdn.net/jia20003/article/details/8248221...

    此人博客挺好的,推荐一个! 一个基于Java Socket协议之上文件传输的完整示例,基于TCP通信完成. 除了基于TCP的二进制文件传输,还演示了JAVA Swing的一些编程技巧,Demo程序 实 ...

  5. Java Socket编程 - 基于TCP方式的二进制文件传输

    一个基于Java Socket协议之上文件传输的完整示例,基于TCP通信完成. 除了基于TCP的二进制文件传输,还演示了JAVA Swing的一些编程技巧,Demo程序 实现主要功能有以下几点: 1. ...

  6. tcp java实例_实现了基于TCP的Java Socket编程实例代码

    实现了基于TCP的Java Socket编程,功能很简单:客户端向服务器端输出一名话"connect",服务器端接收输出到控制台并向客户端输出一名话"Hello" ...

  7. 翻页时钟java代码_Android编程基于自定义控件实现时钟功能的方法

    本文实例讲述了Android编程基于自定义控件实现时钟功能的方法.分享给大家供大家参考,具体如下: 在学习安卓群英传自定义控件章节的时候,有一个例子是绘制时钟,在实现了书上的例子后就想看这个时钟能不能 ...

  8. java socket 通信协议_java 基于TCP协议的Socket编程和通信

    java 基于 TCP 协议的 Socket 编程和通信 在网络通讯中,第一次主动发起通讯的程序被称作客户 端 (Client) 程序, 简称客户端, 而在第一次通讯中等待连接的 程序被称作服务器端 ...

  9. 网络编程----基于Java Email的电子邮件发送

    前言 电子邮件(electronic mail,简称E-mail,标志:@)又称电子信箱.电子邮政,它是-种用电子手段提供信息交换的通信方式.电子邮件指用电子手段传送信件.单据.资料等信息的通信方法. ...

最新文章

  1. 激光雷达,马斯克看不上,却又无可替代?
  2. python【力扣LeetCode算法题库】1103- 分糖果 II
  3. 易语言读写配置项ini文件
  4. win10安装 MySQL安装教程
  5. Linux中的15个‘echo’ 命令实例
  6. 看从小自带BUFF的他,如何用代码降低万物互联的门槛
  7. jstree禁用父节点点击_Jstree 使用CheckBox插件 选中父节点时被禁用的子节点也会选中问题...
  8. phpmail通过qq发邮箱失败_PHP下利用PHPMailer配合QQ邮箱下的域名邮箱发送邮件
  9. python转cython_10分钟带你入门Cython
  10. Elasticsearch中object类型与nested类型之间的区别
  11. centos下安装xcrysden出现的问题
  12. Java学习之路-----Java基础简介,基础语法,Java标识符,修饰符,关键字与注释
  13. MD5 转码 实现加密解密
  14. docker镜像备份和恢复
  15. [转自CSDN]EXCEL工资数据表打印
  16. 使用rpm包及createrepo命令制作本地yum仓库
  17. 绝杀慕尼黑_慕尼黑如何将15,000台PC从Windows切换到Linux
  18. PowerBuilder 文本控件显示提示内容
  19. 大数据面试重点之kafka(六)
  20. 《那些年啊,那些事——一个程序员的奋斗史》——95

热门文章

  1. 老土但有效的刷百度空间人气不被封的方法(C#实现操纵鼠标事件,单击、移动、滚轮)...
  2. lightroom_如何在Lightroom中创建新目录
  3. 基于TensorFlow的VGG16模型源码
  4. springboot使用yml文件如何多环境(dev、test、prod)配置
  5. 最经典最新的图像去噪算法
  6. 厚黑架构师生存的7大武器
  7. INSERT INTO … SELECT 锁表问题
  8. 企业级应用框架的演变
  9. 模电——零欧姆电阻的作用
  10. 用C语言实现直接插入排序(附有详细代码)