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. Laravel日期处理

    1. 常用: echo Carbon::now(); // 2023-04-08 18:07:24 echo Carbon::today(); // 2023-04-08 00:00:00 echo ...

  2. C++ map自定义比较函数遵守严格弱序

    C++ map自定义比较函数遵守严格弱序 问题背景及定位 背景:这个问题是在将tablesaw(一个Java的数据处理项目)迁移到C++时出现的. 问题位置:SplitOn()函数,在数据流水线中的a ...

  3. 华为云GaussDB支撑农行超级网银业务,性能和稳定性备受认可

    数据库作为数据驱动业务创新和智慧银行建设的关键基础设施,在银行数字化变革中具有举足轻重的作用. 在金融科技发展和国家政策引领下,银行纷纷加快推进数字化转型时代,正在经历一场以科技引领.数据赋能.数字经 ...

  4. NC24048 [USACO 2017 Jan P]Promotion Counting

    题目链接 题目 题目描述 The cows have once again tried to form a startup company, failing to remember from past ...

  5. NC16466 [NOIP2015]信息传递

    题目链接 题目 题目描述 有 n 个同学(编号为 1 到 n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为 i 的同学的信息传递对象是编号为Ti的同学. 游戏开始时, ...

  6. NC20650 可爱の星空

    题目链接 题目 题目描述 "当你看向她时,有细碎星辰落入你的眼睛,真好."--小可爱 在一个繁星闪烁的夜晚,卿念和清宇一起躺在郊外的草地上,仰望星空. 星语心愿,他们,想把这片星空 ...

  7. 【OpenGL ES】绘制立方体

    1 前言 ​ 本文主要介绍使用 OpenGL ES 绘制立方体,读者如果对 OpenGL ES 不太熟悉,请回顾以下内容: 绘制三角形 绘制彩色三角形 绘制正方形 绘制圆形 ​ 在绘制立方体的过程中, ...

  8. ORA-31655,ORA-39154 Objects from foreign schemas have been removed from import

    问题说明 在执行数据泵导入时提示错误: 问题原因 执行导入的用户缺少导入数据库的权限. 解决问题 给用户赋予导入数据库权限: grant imp_full_database to 用户; 然后重新执行 ...

  9. spring boot结合ehcache防止恶意刷新请求

    说明 我们在把开发好的网站上线之前一定要考虑到别人恶意刷新你的网页这种情况,最大限度的去限制他们.否则往往这将搞垮你的应用服务器,想象一下某个恶意用户利用众多肉鸡在1分钟内请求你网页几十万次是个什么情 ...

  10. Java I/O 教程(五) BufferedOutputStream 类

    Java BufferedOutputStream Class Java BufferedOutputStream class 用于缓冲一个输出流 其内部使用缓冲区存储数据,可以更有效率的往流中写入数 ...