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


PBE

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







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

  1. import java.security.Key;
  2. import java.util.Random;
  3. import javax.crypto.Cipher;
  4. import javax.crypto.SecretKey;
  5. import javax.crypto.SecretKeyFactory;
  6. import javax.crypto.spec.PBEKeySpec;
  7. import javax.crypto.spec.PBEParameterSpec;
  8. /**
  9. * PBE安全编码组件
  10. *
  11. * @author 梁栋
  12. * @version 1.0
  13. * @since 1.0
  14. */
  15. public abstract class PBECoder extends Coder {
  16. /**
  17. * 支持以下任意一种算法
  18. *
  19. * <pre>
  20. * PBEWithMD5AndDES
  21. * PBEWithMD5AndTripleDES
  22. * PBEWithSHA1AndDESede
  23. * PBEWithSHA1AndRC2_40
  24. * </pre>
  25. */
  26. public static final String ALGORITHM = "PBEWITHMD5andDES";
  27. /**
  28. * 盐初始化
  29. *
  30. * @return
  31. * @throws Exception
  32. */
  33. public static byte[] initSalt() throws Exception {
  34. byte[] salt = new byte[8];
  35. Random random = new Random();
  36. random.nextBytes(salt);
  37. return salt;
  38. }
  39. /**
  40. * 转换密钥<br>
  41. *
  42. * @param password
  43. * @return
  44. * @throws Exception
  45. */
  46. private static Key toKey(String password) throws Exception {
  47. PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray());
  48. SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
  49. SecretKey secretKey = keyFactory.generateSecret(keySpec);
  50. return secretKey;
  51. }
  52. /**
  53. * 加密
  54. *
  55. * @param data
  56. *            数据
  57. * @param password
  58. *            密码
  59. * @param salt
  60. *            盐
  61. * @return
  62. * @throws Exception
  63. */
  64. public static byte[] encrypt(byte[] data, String password, byte[] salt)
  65. throws Exception {
  66. Key key = toKey(password);
  67. PBEParameterSpec paramSpec = new PBEParameterSpec(salt, 100);
  68. Cipher cipher = Cipher.getInstance(ALGORITHM);
  69. cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
  70. return cipher.doFinal(data);
  71. }
  72. /**
  73. * 解密
  74. *
  75. * @param data
  76. *            数据
  77. * @param password
  78. *            密码
  79. * @param salt
  80. *            盐
  81. * @return
  82. * @throws Exception
  83. */
  84. public static byte[] decrypt(byte[] data, String password, byte[] salt)
  85. throws Exception {
  86. Key key = toKey(password);
  87. PBEParameterSpec paramSpec = new PBEParameterSpec(salt, 100);
  88. Cipher cipher = Cipher.getInstance(ALGORITHM);
  89. cipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
  90. return cipher.doFinal(data);
  91. }
  92. }

再给出一个测试类:

  1. import static org.junit.Assert.*;
  2. import org.junit.Test;
  3. /**
  4. *
  5. * @author 梁栋
  6. * @version 1.0
  7. * @since 1.0
  8. */
  9. public class PBECoderTest {
  10. @Test
  11. public void test() throws Exception {
  12. String inputStr = "abc";
  13. System.err.println("原文: " + inputStr);
  14. byte[] input = inputStr.getBytes();
  15. String pwd = "efg";
  16. System.err.println("密码: " + pwd);
  17. byte[] salt = PBECoder.initSalt();
  18. byte[] data = PBECoder.encrypt(input, pwd, salt);
  19. System.err.println("加密后: " + PBECoder.encryptBASE64(data));
  20. byte[] output = PBECoder.decrypt(data, pwd, salt);
  21. String outputStr = new String(output);
  22. System.err.println("解密后: " + outputStr);
  23. assertEquals(inputStr, outputStr);
  24. }
  25. }

控制台输出:

  1. 原文: abc
  2. 密码: efg
  3. 加密后: iCZ0uRtaAhE=
  4. 解密后: abc

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

介绍对称加密的另一个算法——PBE的更多相关文章

  1. TEA,XXTEA介绍,对称加密

    总结:在使用加密的时候,我们可以加入随机数,这样相同的明文,每次加密后得到不同的密文,同时可以在密文中加入密文有效期,控制密文的有效时间长度. 针对有的功能扩展使用,很好的思想. TEA对 64 位数 ...

  2. Java利用DES/3DES/AES这三种算法分别实现对称加密

    转载地址:http://blog.csdn.net/smartbetter/article/details/54017759 有两句话是这么说的: 1)算法和数据结构就是编程的一个重要部分,你若失掉了 ...

  3. .NET中的DES对称加密

    DES是一种对称加密(Data Encryption Standard)算法,于1977年得到美国政府的正式许可,是一种用56位密钥来加密64位数据的方法.一般密码长度为8个字节,其中56位加密密钥, ...

  4. openssl evp 对称加密(AES_ecb,ccb)

    openssl evp 对称加密(AES_ecb,ccb) evp.h 封装了openssl常用密码学工具,以下主要说对称加密的接口 1. 如下使用 aes_256_ecb 模式的加密解密测试代码 u ...

  5. Java安全之对称加密、非对称加密、数字签名

    原文地址: http://blog.csdn.net/furongkang/article/details/6882039 Java中加密分为两种方式一个是对称加密,另一个是非对称加密.对称加密是因为 ...

  6. 17.app后端如何保证通讯安全--aes对称加密

    在上文<16.app后端如何保证通讯安全--url签名>提到,url签名有两个缺点,这两个缺点,如果使用对称加密方法的话,则完全可以避免这两个缺点.在本文中,会介绍对称加密的具体原理,和详 ...

  7. https 结合使用 对称加密和非对称加密

    (一)对称加密(Symmetric Cryptography) ---共享密钥加密 对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥( ...

  8. SpringCloud-分布式配置中心【加密-对称加密】

      前面我们介绍了SpringCloud的分布式配置中心,我们将项目中的配置信息保存在git或者码云的仓库中,但是这样一些敏感信息就暴露出来了,比如数据库连接的账号密码等信息,这时我们最好能够对这些信 ...

  9. 对称加密详解,以及JAVA简单实现

    (原) 常用的加密有3种 1.正向加密,如MD5,加密后密文固定,目前还没办法破解,但是可以能过数据库撞库有一定概率找到,不过现在一般用这种方式加密都会加上盐值. 2.对称加密,通过一个固定的对称密钥 ...

随机推荐

  1. 如何查看MapReduce执行的程序中的输出日志

    我们开发程序的时候,好多人都喜欢用sysout输出内容来查看运行情况.但是在MR程序里写了之后,却不知道去哪里查找,可以参考这篇文章. 第一种方法,我们可以在MapReduce任务查看页面找到这些日志 ...

  2. React 性能优化总结

    初学者对React可能满怀期待,觉得React可能完爆其它一切框架,甚至不切实际地认为React可能连原生的渲染都能完爆--对框架的狂热确实会出现这样的不切实际的期待.让我们来看看React的官方是怎 ...

  3. java实现excel模板导出

    一. 准备工作 1. 点击此下载相关开发工具 2. 将poi-3.8.jxls-core-1.0两个jar包放到工程中,并引用 3. 将excel模板runRecord.xls放到RunRecordB ...

  4. C++ - 静态成员函数

    c++中静态成员函数属于整个类, 而不是某个对象,因此不需要创建对象就可以访问 1.出现在类体外的函数定义不能指定关键字static:2.静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访 ...

  5. sql 计算周围公里语句

    $lng2 = set_post('lng'); //当前位置坐标 $lat2 = set_post('lat'); round((*ATAN2(SQRT(SIN((`gps`.`gps_lat`-$ ...

  6. OpenStack云计算快速入门之三:OpenStack镜像管理

    原文:http://blog.chinaunix.net/uid-22414998-id-3272059.html 第三部分 OpenStack镜像管理 一.简介 很多源都有为OpenStack已经编 ...

  7. sql server 2012 数据引擎任务调度算法解析(下)

    上次我们说到,sql server 2012的企业版的任务调度流程,一直到给新连接分配了scheduler,都是与以前的版本算法是一致的,只有在进行任务分配的时候,算法才有了细微的调整. 新算法的目的 ...

  8. gcc中__builtin_return_address和__VA_ARGS__

    — Built-in Function: void * __builtin_return_address (unsigned int level) This function returns the ...

  9. spf13-vim安装与使用

    一.简介 spf13-vim是Vim插件与配置的一个发行版本,包含了一整套精心挑选的Vim插件,采用Vundle进行插件管理,并且可以通过下列文件进行个性化配置 ~/.vimrc.local #个性化 ...

  10. jmeter(四)Sample之http请求

    启动jmeter,建立一个测试计划 这里再次说说怎么安装和启动jmeter吧,昨天下午又被人问到怎样安装和使用,我也是醉了:在我看来,百度能解决百分之八十的问题,特别是基础的问题... 安装:去官网下 ...