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. 【栈和队列】栈和队列的相互实现OJ练习【力扣-232、力扣-225】超详细的保姆级别解释

    [栈和队列]栈和队列的相互实现OJ练习[力扣-232.力扣-225]超详细的保姆级别解释 先赞后看好习惯 打字不容易,这都是很用心做的,希望得到支持你 大家的点赞和支持对于我来说是一种非常重要的动力 ...

  2. DNS子域委派配置·

    实验介绍:DNS子域委派的作用 子域即为主域下的一个子域名,当一个子域的流量过大时,主域的DNS服务器可以把一个子域的查询授权给一台专门的子域服务器 注意被委派的服务器必须是委派服务器的子域服务器. ...

  3. DNS正向解析

    实验介绍:正向解析 通常把域名到IP称为正向解析 把ip到域名称为反向解析 一:前期准备 准备一台客户端测试正向解析是否正常 修改ip 子网掩码 DNS服务器 使用VMnet8 IP要和DNS服务器端 ...

  4. 【.net core学习一】.net 5.0 webapi部署

    服务器:windows server 2012 x64 1.安装IIS: 2.下载并安装 dotnet-hosting-5.0.13-win.exe 下载地址: https://dotnet.micr ...

  5. ASP.NET Core分布式项目实战(集成ASP.NETCore Identity)--学习笔记

    任务24:集成ASP.NETCore Identity 之前在 Index 页面写了一个 strong 标签,需要加个判断再显示,不然为空没有错误的时候也会显示 @if (!ViewContext.M ...

  6. Python Rich:美化终端显示效果

    Rich库的功能就像它的名字一样,使Python编程更加丰富(rich),它帮助开发者在控制台(命令行)输出中创建丰富.多彩和具有格式化的文本. 本篇总结了如何使用Rich库让我们的命令行工具更加美观 ...

  7. Pandas日期时间格式化

    当进行数据分析时,我们会遇到很多带有日期.时间格式的数据集,在处理这些数据集时,可能会遇到日期格式不统一的问题,此时就需要对日期时间做统一的格式化处理.比如"Wednesday, June ...

  8. JS leetcode 删除排序数组中的重复项 题解分析

    壹 ❀ 引 一日一题,今天的题目来自于leetcode26. 删除排序数组中的重复项,其实在之前我们已经做了一道类似的题目,可参考JS leetcode 移除元素 题解分析,关于本题描述如下: 给定一 ...

  9. CentOS7中搭建GitLab踩坑实录

    今晚闲来无事,尝试了下自己搭建一台git服务器,很多人可能不明白平时自己随手就可以提交代码,为什么还要自己搭建服务器呢?首先你有没有考虑过你是怎么能把代码提交上去的?如果公司突然有一天需要你来负责搭建 ...

  10. Zabbix 配置笔记

    Zabbix Server 安装参考 https://www.cnblogs.com/clsn/p/7885990.html 安装脚本 #!/bin/bash #clsn #设置解析 注意:网络条件较 ...