首页 > 开发 > Java > 正文

Java实现DES加密与解密,md5加密以及Java实现MD5加密解密类

2024-07-13 09:56:06
字体:
来源:转载
供稿:网友

这篇文章主要介绍了Java实现DES加密与解密,md5加密以及Java实现MD5加密解密类 ,需要的朋友可以参考下

很多时候要对秘要进行持久化加密,此时的加密采用md5。采用对称加密的时候就采用DES方法了

 

 
  1. import java.io.IOException; 
  2. import java.security.MessageDigest; 
  3. import java.security.SecureRandom; 
  4. import javax.crypto.Cipher; 
  5. import javax.crypto.SecretKey; 
  6. import javax.crypto.SecretKeyFactory; 
  7. import javax.crypto.spec.DESKeySpec; 
  8. import sun.misc.BASEDecoder; 
  9. import sun.misc.BASEEncoder; 
  10. /** 
  11. * 密匙工具类(包含des加密与md加密) 
  12. * @author mingge 
  13. * 
  14. */ 
  15. public class KeysUtil { 
  16. private final static String DES = "DES"
  17. private final static String MD = "MD"
  18. private final static String KEY="opeddsaeaddadbcabf"
  19. /** 
  20. * MD加密算法 
  21. * @param data 
  22. * @return 
  23. */ 
  24. public static String mdEncrypt(String data) { 
  25. String resultString = null
  26. try { 
  27. resultString = new String(data); 
  28. MessageDigest md = MessageDigest.getInstance(MD); 
  29. resultString =bytehexString(md.digest(resultString.getBytes())); 
  30. catch (Exception ex) { 
  31. return resultString; 
  32. private static String bytehexString(byte[] bytes) { 
  33. StringBuffer bf = new StringBuffer(bytes.length * ); 
  34. for (int i = ; i < bytes.length; i++) { 
  35. if ((bytes[i] & xff) < x) { 
  36. bf.append("T"); 
  37. bf.append(Long.toString(bytes[i] & xff, )); 
  38. return bf.toString(); 
  39. /** 
  40. * Description 根据键值进行加密 
  41. * @param data  
  42. * @param key 加密键byte数组 
  43. * @return 
  44. * @throws Exception 
  45. */ 
  46. public static String desEncrypt(String data, String key) throws Exception { 
  47. if (key==null) { 
  48. key=KEY; 
  49. byte[] bt = encrypt(data.getBytes(), key.getBytes()); 
  50. String strs = new BASEEncoder().encode(bt); 
  51. return strs; 
  52. /** 
  53. * Description 根据键值进行解密 
  54. * @param data 
  55. * @param key 加密键byte数组 
  56. * @return 
  57. * @throws IOException 
  58. * @throws Exception 
  59. */ 
  60. public static String desDecrypt(String data, String key) throws IOException, 
  61. Exception { 
  62. if (data == null){ 
  63. return null
  64. if (key==null) { 
  65. key=KEY; 
  66. BASEDecoder decoder = new BASEDecoder(); 
  67. byte[] buf = decoder.decodeBuffer(data); 
  68. byte[] bt = decrypt(buf,key.getBytes()); 
  69. return new String(bt); 
  70. /** 
  71. * Description 根据键值进行加密 
  72. * @param data 
  73. * @param key 加密键byte数组 
  74. * @return 
  75. * @throws Exception 
  76. */ 
  77. private static byte[] encrypt(byte[] data, byte[] key) throws Exception { 
  78. // 生成一个可信任的随机数源 
  79. SecureRandom sr = new SecureRandom(); 
  80. // 从原始密钥数据创建DESKeySpec对象 
  81. DESKeySpec dks = new DESKeySpec(key); 
  82. // 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象 
  83. SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES); 
  84. SecretKey securekey = keyFactory.generateSecret(dks); 
  85. // Cipher对象实际完成加密操作 
  86. Cipher cipher = Cipher.getInstance(DES); 
  87. // 用密钥初始化Cipher对象 
  88. cipher.init(Cipher.ENCRYPT_MODE, securekey, sr); 
  89. return cipher.doFinal(data); 
  90. /** 
  91. * Description 根据键值进行解密 
  92. * @param data 
  93. * @param key 加密键byte数组 
  94. * @return 
  95. * @throws Exception 
  96. */ 
  97. private static byte[] decrypt(byte[] data, byte[] key) throws Exception { 
  98. // 生成一个可信任的随机数源 
  99. SecureRandom sr = new SecureRandom(); 
  100. // 从原始密钥数据创建DESKeySpec对象 
  101. DESKeySpec dks = new DESKeySpec(key); 
  102. // 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象 
  103. SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES); 
  104. SecretKey securekey = keyFactory.generateSecret(dks); 
  105. // Cipher对象实际完成解密操作 
  106. Cipher cipher = Cipher.getInstance(DES); 
  107. // 用密钥初始化Cipher对象 
  108. cipher.init(Cipher.DECRYPT_MODE, securekey, sr); 
  109. return cipher.doFinal(data); 

下面在给大家介绍一段代码关于Java实现MD5加密解密类

Java实现MD5加密以及解密类,附带测试类,具体见代码。

MD5加密解密类——MyMD5Util,代码如下:

 

 
  1. package com.zyg.security.md5;  
  2. import java.io.UnsupportedEncodingException;  
  3. import java.security.MessageDigest;  
  4. import java.security.NoSuchAlgorithmException;  
  5. import java.security.SecureRandom;  
  6. import java.util.Arrays;  
  7. public class MyMD5Util {  
  8. private static final String HEX_NUMS_STR="0123456789ABCDEF";  
  9. private static final Integer SALT_LENGTH = 12;  
  10. /**  
  11. * 将16进制字符串转换成字节数组  
  12. * @param hex  
  13. * @return  
  14. */ 
  15. public static byte[] hexStringToByte(String hex) {  
  16. int len = (hex.length() / 2);  
  17. byte[] result = new byte[len];  
  18. char[] hexChars = hex.toCharArray();  
  19. for (int i = 0; i < len; i++) {  
  20. int pos = i * 2;  
  21. result[i] = (byte) (HEX_NUMS_STR.indexOf(hexChars[pos]) << 4 
  22. | HEX_NUMS_STR.indexOf(hexChars[pos + 1]));  
  23. }  
  24. return result;  
  25. }  
  26. /**  
  27. * 将指定byte数组转换成16进制字符串  
  28. * @param b  
  29. * @return  
  30. */ 
  31. public static String byteToHexString(byte[] b) {  
  32. StringBuffer hexString = new StringBuffer();  
  33. for (int i = 0; i < b.length; i++) {  
  34. String hex = Integer.toHexString(b[i] & 0xFF);  
  35. if (hex.length() == 1) {  
  36. hex = '0' + hex;  
  37. }  
  38. hexString.append(hex.toUpperCase());  
  39. }  
  40. return hexString.toString();  
  41. }  
  42. /**  
  43. * 验证口令是否合法  
  44. * @param password  
  45. * @param passwordInDb  
  46. * @return  
  47. * @throws NoSuchAlgorithmException  
  48. * @throws UnsupportedEncodingException  
  49. */ 
  50. public static boolean validPassword(String password, String passwordInDb)  
  51. throws NoSuchAlgorithmException, UnsupportedEncodingException {  
  52. //将16进制字符串格式口令转换成字节数组  
  53. byte[] pwdInDb = hexStringToByte(passwordInDb);  
  54. //声明盐变量  
  55. byte[] salt = new byte[SALT_LENGTH];  
  56. //将盐从数据库中保存的口令字节数组中提取出来  
  57. System.arraycopy(pwdInDb, 0, salt, 0, SALT_LENGTH);  
  58. //创建消息摘要对象  
  59. MessageDigest md = MessageDigest.getInstance("MD5");  
  60. //将盐数据传入消息摘要对象  
  61. md.update(salt);  
  62. //将口令的数据传给消息摘要对象  
  63. md.update(password.getBytes("UTF-8"));  
  64. //生成输入口令的消息摘要  
  65. byte[] digest = md.digest();  
  66. //声明一个保存数据库中口令消息摘要的变量  
  67. byte[] digestInDb = new byte[pwdInDb.length - SALT_LENGTH];  
  68. //取得数据库中口令的消息摘要  
  69. System.arraycopy(pwdInDb, SALT_LENGTH, digestInDb, 0, digestInDb.length);  
  70. //比较根据输入口令生成的消息摘要和数据库中消息摘要是否相同  
  71. if (Arrays.equals(digest, digestInDb)) {  
  72. //口令正确返回口令匹配消息  
  73. return true;  
  74. else {  
  75. //口令不正确返回口令不匹配消息  
  76. return false;  
  77. }  
  78. }  
  79. /**  
  80. * 获得加密后的16进制形式口令  
  81. * @param password  
  82. * @return  
  83. * @throws NoSuchAlgorithmException  
  84. * @throws UnsupportedEncodingException  
  85. */ 
  86. public static String getEncryptedPwd(String password)  
  87. throws NoSuchAlgorithmException, UnsupportedEncodingException {  
  88. //声明加密后的口令数组变量  
  89. byte[] pwd = null;  
  90. //随机数生成器  
  91. SecureRandom random = new SecureRandom();  
  92. //声明盐数组变量  
  93. byte[] salt = new byte[SALT_LENGTH];  
  94. //将随机数放入盐变量中  
  95. random.nextBytes(salt);  
  96. //声明消息摘要对象  
  97. MessageDigest md = null;  
  98. //创建消息摘要  
  99. md = MessageDigest.getInstance("MD5");  
  100. //将盐数据传入消息摘要对象  
  101. md.update(salt);  
  102. //将口令的数据传给消息摘要对象  
  103. md.update(password.getBytes("UTF-8"));  
  104. //获得消息摘要的字节数组  
  105. byte[] digest = md.digest();  
  106. //因为要在口令的字节数组中存放盐,所以加上盐的字节长度  
  107. pwd = new byte[digest.length + SALT_LENGTH];  
  108. //将盐的字节拷贝到生成的加密口令字节数组的前12个字节,以便在验证口令时取出盐  
  109. System.arraycopy(salt, 0, pwd, 0, SALT_LENGTH);  
  110. //将消息摘要拷贝到加密口令字节数组从第13个字节开始的字节  
  111. System.arraycopy(digest, 0, pwd, SALT_LENGTH, digest.length);  
  112. //将字节数组格式加密后的口令转化为16进制字符串格式的口令  
  113. return byteToHexString(pwd);  
  114. }  

测试类——Client,代码如下:

 

 
  1. package com.zyg.security.md5;  
  2. import java.io.UnsupportedEncodingException;  
  3. import java.security.NoSuchAlgorithmException;  
  4. import java.util.HashMap;  
  5. import java.util.Map;  
  6. public class Client {  
  7. private static Map users = new HashMap();  
  8. public static void main(String[] args){  
  9. String userName = "zyg";  
  10. String password = "123";  
  11. registerUser(userName,password);  
  12. userName = "changong";  
  13. password = "456";  
  14. registerUser(userName,password);  
  15. String loginUserId = "zyg";  
  16. String pwd = "1232";  
  17. try {  
  18. if(loginValid(loginUserId,pwd)){  
  19. System.out.println("欢迎登陆!!!");  
  20. }else{  
  21. System.out.println("口令错误,请重新输入!!!");  
  22. }  
  23. catch (NoSuchAlgorithmException e) {  
  24. // TODO Auto-generated catch block  
  25. e.printStackTrace();  
  26. catch (UnsupportedEncodingException e) {  
  27. // TODO Auto-generated catch block  
  28. e.printStackTrace();  
  29. }  
  30. }  
  31. /**  
  32. * 注册用户  
  33.  
  34. * @param userName  
  35. * @param password  
  36. */ 
  37. public static void registerUser(String userName,String password){  
  38. String encryptedPwd = null;  
  39. try {  
  40. encryptedPwd = MyMD5Util.getEncryptedPwd(password);  
  41. users.put(userName, encryptedPwd);  
  42. catch (NoSuchAlgorithmException e) {  
  43. // TODO Auto-generated catch block  
  44. e.printStackTrace();  
  45. catch (UnsupportedEncodingException e) {  
  46. // TODO Auto-generated catch block  
  47. e.printStackTrace();  
  48. }  
  49. }  
  50. /**  
  51. * 验证登陆  
  52.  
  53. * @param userName  
  54. * @param password  
  55. * @return  
  56. * @throws UnsupportedEncodingException  
  57. * @throws NoSuchAlgorithmException  
  58. */ 
  59. public static boolean loginValid(String userName,String password)  
  60. throws NoSuchAlgorithmException, UnsupportedEncodingException{  
  61. String pwdInDb = (String)users.get(userName);  
  62. if(null!=pwdInDb){ // 该用户存在  
  63. return MyMD5Util.validPassword(password, pwdInDb);  
  64. }else{  
  65. System.out.println("不存在该用户!!!");  
  66. return false;  
  67. }  
  68. }  


注:相关教程知识阅读请移步到JAVA教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表