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. 【算法】【C语言进阶】C语言字符串操作宝藏级别汇总 strtok函数 strstr函数该怎么用?【超详细的使用解释和模拟实现】

    [算法][C语言进阶]C语言字符串操作宝藏级别汇总[超详细的使用解释和模拟实现] 作者: @小小Programmer 这是我的主页:@小小Programmer 在食用这篇博客之前,博主在这里介绍一下其 ...

  2. dbgrideh 下拉显示多列

  3. .NET Core开发实战(第18课:日志框架:聊聊记日志的最佳姿势)--学习笔记(下)

    18 | 日志框架:聊聊记日志的最佳姿势 除了使用 CreateLogger 指定 logger 的名称,实际上还可以借助容器来构造 logger,通常情况下我们会定义自己的类 namespace L ...

  4. CF1859

    A 让 \(c\) 保存数组中所有最大的数,如果所有数都相等则 \(-1\). B 只需要记录每个序列的最小值和次小值,然后对次小值求前后缀和. C 枚举最大值 \(mx\),然后遍历 \(i:n\s ...

  5. 精读JavaScript模式(九),JS类式继承与现代继承模式其二

    壹 ❀ 引 二零一九年的三月二十号,我记录了精读JavaScript模式(八)这篇读书笔记,今天是二零二零年三月十五号,相差五天,其实也算时隔一年,我重新拿起了这本书.当前为什么没继续写下去呢,主要还 ...

  6. Python 中isinstance的用法

    isinstance()函数用来判断一个对象是否是一个已知的类型.isinstance(object, classinfo) 类似 type().isinstance() 与 type() 区别: t ...

  7. C++ 使用 UTF8 BOM 替换 UTF8 文件

    void Utf8ToUtf8Bom(const wchar_t* filename) { std::ifstream infile; std::string strline; std::string ...

  8. JavaScript的引入并执行-包含动态引入与静态引入

    JavaScript的引入并执行-包含动态引入与静态引入 JavaScript引入方式 html文件需要引入JavaScript代码,才能在页面里使用JavaScript代码. 静态引入 行内式 直接 ...

  9. 启动Study.BlazorOne项目

    由于Study.Trade模块的Blazor是基于国内著名的BootstrapBlazor组件,因此Study.BlazorOne项目也必须添加对BootstrapBlazor的支持. # 1.去Bo ...

  10. redis-cluster 性能调优

    关闭RDB防止fork进程的内存溢出问题 save "" appendonly=yes 防止某个节点挂掉,整个cluster挂掉的问题 cluster-require-full-c ...