安全 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. Python 自动化办公之 Excel 拆分并自动发邮件
  2. 如何处理大数据:微博信息流数据库设计
  3. [转]Android fragment 重叠问题——通过hide,show方式导致的解决方法
  4. 三步更改win7开机密码
  5. C/C++网络编程中的TCP保活
  6. GLSL学习教程博客
  7. java list 字段去重_java list 根据对象一个字段去重
  8. mysql 显示重叠_一句话实现MySQL库中的重叠分组
  9. 使用广泛的开源PCB文件查看器 Gerbv 含多个严重漏洞
  10. 数组与List的相互转换
  11. spring异常:Could not resolve placeholder
  12. 简单计算机组成原理,计算机组成原理简单总结(一)
  13. 详解Autosar Arxml中的CANFD报文及格式
  14. 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验二十四:SD卡模块
  15. 泛型,泛型的表现,泛型类,泛型方法,泛型接口,通配符,限定
  16. 如何学习网络安全?(网络安全学习笔记)
  17. raspberry pi系统安装
  18. 前装车联网常见术语解释
  19. 带顶点动画的护盾效果——UnityShader学习笔记
  20. SpringBoot 2.x 自定义注解annotation实现MicroMeter埋点

热门文章

  1. 存储系统 —— Cache(高速缓冲存储器)
  2. js正则贪婪模式_JS关于正则的非贪婪模式
  3. 三、数据缓冲区高速缓冲
  4. java中setattr功能_hasattr() getattr() setattr() 函数使用方法
  5. 小程序模仿微信聊天界面
  6. BMS | 动力电池应用领域技术重点整理
  7. 互联网公司校招Java面试题总结及答案——阿里、腾讯
  8. tp6 使用中间件验证token
  9. 华为路由器默认路由配置
  10. 基于SpringBoot的校园二手交易系统