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. 山泽Typec扩展坞M.2移动固态硬盘盒拓展 - 我的硬件配置

  2. (C语言)每日代码||2023.12.25||函数传参,传入数组时传递的是数组首元素地址

    向函数传入某数组时,可以在函数内修改该数组的元素. #include <stdio.h> void test(char* p, char arr[]) { *p = 'h';//能改变 * ...

  3. Mysql切割字符串

    我们常常会遇到需要处理字段中字符串的需求,包括切割.拼接以及搜索等等,在这里介绍几个常用的切割字符串的函数,首先我们在表格中加入我们的实验字段值:https://www.cnblogs.com/Yao ...

  4. 如何在 Mac 上配置 VirtualBox Host-Only 网络适配器

    默认Mac 上安装 VirtualBox 后,没有自动配置Host-Only 网络适配器,需要我们手工添加.方法如下: 打开VirtualBox软件, 依次点击 "管理 -> 工具 - ...

  5. 案例:DG备库报错ORA-600[2619]致使mrp进程异常终止

    很多刚入行的DBA往往一看有ORA-600这类错误就不知所措,直接就想寻求中高级DBA支持,甚至在网上还看到有人说,判断一个Oracle DBA是否达到中级以上,就是看其是否可以独立思考处理ORA-6 ...

  6. 动态获取input内容文本(排除候选拼音文本) - js事件

    要想通过事件实时获取文本框文本,一开始是想到下面的方法,但实际效果都存在一定的缺点. 通过change/blur事件获取 change事件只有在选中点击或者失焦的时候,才能够触发. blur事件则是只 ...

  7. NC24141 [USACO 2011 Dec G]Grass Planting

    题目链接 题目 题目描述 Farmer John has N barren pastures (2 <= N <= 100,000) connected by N-1 bidirectio ...

  8. UVA11573 Ocean Currents

    题目链接 题目 见链接. 题解 知识点:BFS. 这道题显然用BFS,但发现洋流方向会破坏时间的有序性,但注意到洋流时间花费是 \(0\) ,因此只需要用双端队列即可,洋流方向扩展直接放队头,其他方向 ...

  9. STM32F401的外部中断EXTI

    stm32f401 EXTI EXTI就是External interrupt/event controller, 外部事件和中断控制器, 包含21条边沿检测线. 每条线可以独立设置触发事件(上升沿, ...

  10. docker方式部署并使用gitlab

    工作中企业会在内网搭建一个公司内部使用的git环境,一般用的是gitlab. GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务. 下面介绍一 ...