Javapbe对称加密

    除了DES,我们还知道有DESede(TripleDES,就是3DES)、AES、Blowfish、RC2、RC4(ARCFOUR)等多种对称加密方式,其实现方式大同小异,这里介绍对称加密的另一个算法——PBE



PBE

    PBE——Password-based encryption(基于密码加密)。其特点在于口令由用户自己掌管,不借助任何物理媒体;采用随机数(这里我们叫做盐)杂凑多重加密等方法保证数据的安全性。是一种简便的加密方式。







通过java代码实现如下:Coder类见 Java加密技术(一)

Java代码  收藏代码

import java.security.Key; 

import java.util.Random; 

 

import javax.crypto.Cipher; 

import javax.crypto.SecretKey; 

import javax.crypto.SecretKeyFactory; 

import javax.crypto.spec.PBEKeySpec; 

import javax.crypto.spec.PBEParameterSpec; 

 

/**

* PBE安全编码组件



* @author 梁栋

* @version 1.0

* @since 1.0

*/ 

public abstract class PBECoder extends Coder { 

    /**

     * 支持以下任意一种算法

     * 

     * <pre>

     * PBEWithMD5AndDES 

     * PBEWithMD5AndTripleDES 

     * PBEWithSHA1AndDESede

     * PBEWithSHA1AndRC2_40

     * </pre>

     */ 

    public static final String ALGORITHM = "PBEWITHMD5andDES"; 

 

    /**

     * 盐初始化

     * 

     * @return

     * @throws Exception

     */ 

    public static byte[] initSalt() throws Exception { 

        byte[] salt = new byte[8]; 

        Random random = new Random(); 

        random.nextBytes(salt); 

        return salt; 

    } 

 

    /**

     * 转换密钥<br>

     * 

     * @param password

     * @return

     * @throws Exception

     */ 

    private static Key toKey(String password) throws Exception { 

        PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray()); 

        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM); 

        SecretKey secretKey = keyFactory.generateSecret(keySpec); 

 

        return secretKey; 

    } 

 

    /**

     * 加密

     * 

     * @param data

     *            数据

     * @param password

     *            密码

     * @param salt

     *            盐

     * @return

     * @throws Exception

     */ 

    public static byte[] encrypt(byte[] data, String password, byte[] salt) 

            throws Exception { 

 

        Key key = toKey(password); 

 

        PBEParameterSpec paramSpec = new PBEParameterSpec(salt, 100); 

        Cipher cipher = Cipher.getInstance(ALGORITHM); 

        cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec); 

 

        return cipher.doFinal(data); 

 

    } 

 

    /**

     * 解密

     * 

     * @param data

     *            数据

     * @param password

     *            密码

     * @param salt

     *            盐

     * @return

     * @throws Exception

     */ 

    public static byte[] decrypt(byte[] data, String password, byte[] salt) 

            throws Exception { 

 

        Key key = toKey(password); 

 

        PBEParameterSpec paramSpec = new PBEParameterSpec(salt, 100); 

        Cipher cipher = Cipher.getInstance(ALGORITHM); 

        cipher.init(Cipher.DECRYPT_MODE, key, paramSpec); 

 

        return cipher.doFinal(data); 

 

    } 







再给出一个测试类:

Java代码  收藏代码

import static org.junit.Assert.*; 

 

import org.junit.Test; 

 

/**



* @author 梁栋

* @version 1.0

* @since 1.0

*/ 

public class PBECoderTest { 

 

    @Test 

    public void test() throws Exception { 

        String inputStr = "abc"; 

        System.err.println("原文: " + inputStr); 

        byte[] input = inputStr.getBytes(); 

 

        String pwd = "efg"; 

        System.err.println("密码: " + pwd); 

 

        byte[] salt = PBECoder.initSalt(); 

 

        byte[] data = PBECoder.encrypt(input, pwd, salt); 

 

        System.err.println("加密后: " + PBECoder.encryptBASE64(data)); 

 

        byte[] output = PBECoder.decrypt(data, pwd, salt); 

        String outputStr = new String(output); 

 

        System.err.println("解密后: " + outputStr); 

        assertEquals(inputStr, outputStr); 

    } 

 







控制台输出:

Console代码  收藏代码

原文: abc 

密码: efg 

加密后: iCZ0uRtaAhE= 

 

解密后: abc 



    后续我们会介绍非对称加密算法,如RSA、DSA、DH、ECC等。

Java加密技术(三)——PBE算法的更多相关文章

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

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

  2. Java加密技术

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

  3. Java加密技术(八)——数字证书

    原文:http://snowolf.iteye.com/blog/391931 请大家在阅读本篇内容时先阅读 Java加密技术(四),预先了解RSA加密算法. 在构建Java代码实现前,我们需要完成证 ...

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

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

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

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

  6. Java加密技术(四)非对称加密算法RSA

    RSA      这样的算法1978年就出现了.它是第一个既能用于数据加密也能用于数字签名的算法.它易于理解和操作.也非常流行.算法的名字以发明者的名字命名:Ron Rivest, AdiShamir ...

  7. Java加密技术(一)——加密介绍

    from://http://blog.csdn.net/janronehoo/article/details/7590772 如基本的单向加密算法: BASE64 严格地说,属于编码格式,而非加密算法 ...

  8. Java进阶(八)Java加密技术之对称加密 非对称加密 不可逆加密算法

    对称加密 非对称加密 不可逆加密算法 根据密钥类型不同可以将现代密码技术分为两类:对称加密算法(私钥密码体系)和非对称加密算法(公钥密码体系). 1 对称加密算法 原理 对称加密算法中,数据加密和解密 ...

  9. Java加密技术(一)—— HMACSHA1 加密算法

    HMACSHA1 是从 SHA1 哈希函数构造的一种键控哈希算法,被用作 HMAC(基于哈希的消息验证代码). 此 HMAC 进程将密钥与消息数据混合,使用哈希函数对混合结果进行哈希计算,将所得哈希值 ...

  10. java 深入技术三(List)

    List ArrayList List接口 List接口的父接口-Collection List接口的重要子类- ArrayList -LikedList List接口不重要子类-Vector jav ...

随机推荐

  1. Android 开机流程介绍

    目录 一.目的 二.环境 三.相关概念 3.1 Android平台架构 3.2 Android启动架构 3.3 zImage 3.4 RAMDISK 3.5 RC文件 四.详细设计 4.1 Boot ...

  2. Hello,World! 6.28

    代码 public class Hello{ public static void main(String[] args){ System.out.print("Hello,World!&q ...

  3. 一句话总结Docker与K8S的关系

    一句话总结:Docker只是容器的一种,它面向的是单体,K8S可以管理多种容器,它面向的是集群,Docker可以作为一种容器方案被K8S管理.下文继续具体介绍. 1.容器的核心概念 介绍这几个核心概念 ...

  4. C++——异常处理模块笔记

    异常处理是C++中的重要概念之一,用于处理在程序执行过程中可能发生的错误或异常情况.异常是指在程序执行过程中发生的一些不寻常的事件,例如除零错误.访问无效内存等.C++提供了一套异常处理机制,使得程序 ...

  5. Mysql表读写、索引等操作的sql语句效率优化问题

    上次我们说到mysql的一些sql查询方面的优化,包括查看explain执行计划,分析索引等等.今天我们分享一些 分析mysql表读写.索引等等操作的sql语句. 闲话不多说,直接上代码: 反映表的读 ...

  6. ERROR 1820 (HY000): You must reset your password using ALTER USER statement

    新安装好的mysql5.7数据库,用root登录以后执行操作报这个错. 解决方法: mysql> alter user 'root'@'localhost' identified by 'roo ...

  7. python课本学习-第二章

    chapter 2 编程基础 一.基本语法 1.注释 python注释以\("#"\)开始 多行注释使用三个单引号/双引号作为开始和结束标志 2.标识符与关键字 python命名时 ...

  8. centos7 搭建snmpv3靶场

    安装文件 yum install net-snmp net-snmp-utils -y 关闭服务创建用户 systemctl stop snmpd # 添加一个用户 如 root net-snmp-c ...

  9. win32 - Redirect Input and Output

    如果要将exe的输出重定向到cmd,则可以使用匿名管道将子进程的标准输入和输出句柄重定向.请注意,命名管道也可以用于重定向进程I / O //CMD.exe #include <windows. ...

  10. 【LeetCode哈希表#2】两个数组的交集(Set+数组)

    两个数组的交集 力扣题目链接(opens new window) 题意:给定两个数组,编写一个函数来计算它们的交集. 说明: 输出结果中的每个元素一定是唯一的. 我们可以不考虑输出结果的顺序. 思路 ...