PBE是一种基于口令的加密算法,使用口令代替其他对称加密算法中的密钥,其特点在于口令由用户自己掌管,不借助任何物理媒体;采用随机数(这里我们叫做盐)杂凑多重加密等方法保证数据的安全性。

    1. PBE算法是对称加密算法的综合算法,常见算法PBEWithMD5AndDES,使用MD5DES算法构建了PBE算法。将盐附加在口令上,通过消息摘要算法经过迭代获得构建密钥的基本材料,构建密钥后使用对称加密算法进行加密解密。<br />算法/密钥长度/默认密钥长度:<br />1.PBEWithMD5AndDES/56/56<br />2.PBEWithMD5AndTripleDES/112,168/168<br />3.PBEWithSHA1AndDESede/112,168/168<br />4.PBEWithSHA1AndRC2_40/40 to 1024/128<br />工作模式:CBC<br />填充方式:PKCS5Padding<br />示例代码:
    1. import java.security.Key;
    2. import java.security.SecureRandom;
    3. import javax.crypto.Cipher;
    4. import javax.crypto.SecretKeyFactory;
    5. import javax.crypto.spec.PBEKeySpec;
    6. import javax.crypto.spec.PBEParameterSpec;
    7. public class PBEUtil {
    8. public static final String ALGORITHM = "PBEWITHMD5andDES";
    9. public static final int ITERATION_COUNT = 100;
    10. public static byte[] initSalt() throws Exception{
    11. //实例化安全随机数
    12. SecureRandom random = new SecureRandom();
    13. return random.generateSeed(8);
    14. }
    15. /***
    16. * 转换密钥
    17. * @param password 密码
    18. * @return 密钥
    19. * @throws Exception
    20. */
    21. private static Key toKey(String password) throws Exception{
    22. //密钥材料
    23. PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray());
    24. //实例化
    25. SecretKeyFactory factory = SecretKeyFactory.getInstance(ALGORITHM);
    26. //生成密钥
    27. return factory.generateSecret(keySpec);
    28. }
    29. /***
    30. * 加密
    31. * @param data 待加密数据
    32. * @param password 密钥
    33. * @param salt
    34. * @return
    35. * @throws Exception
    36. */
    37. public static byte[] encrypt(byte[] data, String password, byte[] salt) throws Exception{
    38. //转换密钥
    39. Key key = toKey(password);
    40. //实例化PBE参数材料
    41. PBEParameterSpec spec = new PBEParameterSpec(salt, ITERATION_COUNT);
    42. //实例化
    43. Cipher cipher = Cipher.getInstance(ALGORITHM);
    44. //初始化
    45. cipher.init(Cipher.ENCRYPT_MODE, key, spec);
    46. return cipher.doFinal(data);
    47. }
    48. /***
    49. * 解密
    50. * @param data 待解密数据
    51. * @param password 密钥
    52. * @param salt
    53. * @return
    54. * @throws Exception
    55. */
    56. public static byte[] decrypt(byte[] data, String password, byte[] salt) throws Exception{
    57. //转换密钥
    58. Key key = toKey(password);
    59. //实例化PBE参数材料
    60. PBEParameterSpec spec = new PBEParameterSpec(salt, ITERATION_COUNT);
    61. //实例化
    62. Cipher cipher = Cipher.getInstance(ALGORITHM);
    63. //初始化
    64. cipher.init(Cipher.DECRYPT_MODE, key, spec);
    65. //执行操作
    66. return cipher.doFinal(data);
    67. }
    68. private static String showByteArray(byte[] data) {
    69. if(null == data) {
    70. return null;
    71. }
    72. StringBuilder sb = new StringBuilder();
    73. for(byte b : data) {
    74. sb.append(b).append(",");
    75. }
    76. sb.deleteCharAt(sb.length()-1);
    77. sb.append("");
    78. return sb.toString();
    79. }
    80. public static void main(String[] args) throws Exception{
    81. byte[] salt = initSalt();
    82. System.out.println("salt:"+showByteArray(salt));
    83. String password = "1111";
    84. System.out.println("口令:"+password);
    85. String data = "PBE数据";
    86. System.out.println("加密前数据:String:"+data);
    87. System.out.println("加密前数据:byte[]:"+showByteArray(data.getBytes()));
    88. byte[] encryptData = encrypt(data.getBytes(), password, salt);
    89. System.out.println("加密后数据:byte[]:"+showByteArray(encryptData));
    90. byte[] decryptData = decrypt(encryptData, password, salt);
    91. System.out.println("解密后数据: byte[]:"+showByteArray(decryptData));
    92. System.out.println("解密后数据: string:"+new String(decryptData));
    93. }
    94. }