MD5加密生成的密钥是固定的32位,而Base64加密和DES加密,生成的密钥不是固定。
现在假如要将用户登录的密码进行加密并存入数据库,MD5加密与DES加密相结合的方式是不错的选择。因为DES加密可逆,但是较之MD5难破解些,一般银行卡账户使用的就是这种算法;另外MD5生成固定的32位密钥,便于在数据库中存储,字段长度不变,不会浪费空间。
下面就看看怎样进行加密吧。
-
MD5加密工具类
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* MD5加密工具类
*
*/
public class Md5Util {
/**
* 根据输入的字符串生成固定的32位MD5码
*
* @param str
* 输入的字符串
* @return MD5码
*/
public final static String getMd5(String str) {
MessageDigest mdInst = null;
try {
mdInst = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
mdInst.update(str.getBytes());// 使用指定的字节更新摘要
byte[] md = mdInst.digest();// 获得密文
return StrConvertUtil.byteArrToHexStr(md);
}
}
-
DES加密工具类
import java.security.Key;
import java.security.Security;
import javax.crypto.Cipher;
/**
* DES加密工具类
*/
public class DesUtil {
private static final String ENCRYPT_TYPE = "DES";
private static String defaultKey = "";// 字符串默认键值
private Cipher encryptCipher = null;// 加密工具
private Cipher decryptCipher = null;// 解密工具
public DesUtil() throws Exception {
this(defaultKey);
}
/**
* 指定密钥构造方法
*
* @param strKey
* 指定的密钥
* @throws Exception
*/
public DesUtil(String strKey) throws Exception {
Security.addProvider(new com.sun.crypto.provider.SunJCE());
Key key = getKey(strKey.getBytes());
encryptCipher = Cipher.getInstance(ENCRYPT_TYPE);
encryptCipher.init(Cipher.ENCRYPT_MODE, key);
decryptCipher = Cipher.getInstance(ENCRYPT_TYPE);
decryptCipher.init(Cipher.DECRYPT_MODE, key);
}
/**
* 加密字节数组
*
* @param arr
* 需加密的字节数组
* @return 加密后的字节数组
* @throws Exception
*/
private byte[] encryptStr(byte[] arr) throws Exception {
return encryptCipher.doFinal(arr);
}
/**
* 加密字符串
*
* @param strIn
* 需加密的字符串
* @return 加密后的字符串
* @throws Exception
*/
public String encrypt(String strIn) throws Exception {
return StrConvertUtil.byteArrToHexStr(encryptStr(strIn.getBytes()));
}
/**
* 解密字节数组
*
* @param arr
* 需解密的字节数组
* @return 解密后的字节数组
* @throws Exception
*/
private byte[] decryptStr(byte[] arr) throws Exception {
return decryptCipher.doFinal(arr);
}
/**
* 解密字符串
*
* @param strIn
* 需解密的字符串
* @return 解密后的字符串
* @throws Exception
*/
public String decrypt(String strIn) throws Exception {
return new String(decryptStr(StrConvertUtil.hexStrToByteArr(strIn)));
}
/**
* 从指定字符串生成密钥,密钥所需的字节数组长度为8位。不足8位时后面补0,超出8位只取前8位
*
* @param arrBTmp
* 构成该字符串的字节数组
* @return 生成的密钥
*/
private Key getKey(byte[] arrBTmp) {
byte[] arrB = new byte[8];// 创建一个空的8位字节数组(默认值为0)
// 将原始字节数组转换为8位
for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) {
arrB[i] = arrBTmp[i];
}
Key key = new javax.crypto.spec.SecretKeySpec(arrB, ENCRYPT_TYPE);// 生成密钥
return key;
}
}
-
字符串转换工具类
/**
* 字符串转换工具类
*
*/
public class StrConvertUtil {
/**
* 将byte数组转换为表示16进制值的字符串,如:byte[]{8,18}转换为:0813, 和public static byte[]
* hexStrToByteArr(String strIn) 互为可逆的转换过程
*
* @param arrB
* 需要转换的byte数组
* @return 转换后的字符串
*/
public static String byteArrToHexStr(byte[] arrB) {
int iLen = arrB.length;
// 每个byte(8位)用两个(16进制)字符才能表示,所以字符串的长度是数组长度的两倍
StringBuffer sb = new StringBuffer(iLen * 2);
for (int i = 0; i < iLen; i++) {
int intTmp = arrB[i];
while (intTmp < 0) {// 把负数转换为正数
intTmp = intTmp + 256;
}
if (intTmp < 16) {// 小于0F的数需要在前面补0
sb.append("0");
}
sb.append(Integer.toString(intTmp, 16));
}
return sb.toString();
}
/**
* 将表示16进制值的字符串转换为byte数组,和public static String byteArrToHexStr(byte[] arrB)
* 互为可逆的转换过程
*
* @param strIn
* 需要转换的字符串
* @return 转换后的byte数组
*/
public static byte[] hexStrToByteArr(String strIn) {
byte[] arrB = strIn.getBytes();
int iLen = arrB.length;
// 两个(16进制)字符表示一个字节(8位),所以字节数组长度是字符串长度除以2
byte[] arrOut = new byte[iLen / 2];
for (int i = 0; i < iLen; i = i + 2) {
String strTmp = new String(arrB, i, 2);
arrOut[i / 2] = (byte) Integer.parseInt(strTmp, 16);
}
return arrOut;
}
}
-
最后当然是测试类咯
public class Test {
public static void main(String[] args) {
try {
DesUtil des = new DesUtil("Java");// 自定义密钥
String src = "需要进行加密的字符串";
String src1 = des.encrypt(src);
String src2 = des.decrypt(src1);
String src3 = Md5Util.getMd5(src1);
System.out.println("DES加密前的字符:" + src + ",长度:" + src.length());
System.out.println("DES加密后的字符:" + src1 + ",长度:" + src1.length());
System.out.println("DES解密后的字符:" + src2 + ",长度:" + src2.length());
System.out.println("MD5加密后的字符:" + src3 + ",长度:" + src3.length());
} catch (Exception e) {
e.printStackTrace();
}
}
}
-
测试结果输出
DES加密前的字符:需要进行加密的字符串,长度:10
DES加密后的字符:d50ef6bf3e3e51585297c0120f76a65f9d52d38e4cf5f47946124a1b8488e3b9,长度:64
DES解密后的字符:需要进行加密的字符串,长度:10
MD5加密后的字符:842913073af5f2555c1042832eba999f,长度:32
-
最后附上源代码。
- des.rar (1.9 KB)
- 描述: MD5加密和DES加密
- 下载次数: 96
分享到:
相关推荐
### MD5 RAS DES 加密算法详解 ...综上所述,MD5、RSA和DES三种加密算法各自在信息安全的不同领域发挥着关键作用,从数据完整性校验、安全通信到数据加密,它们共同构建了现代网络安全的基础框架。
### 常用MD5加密算法和3-DES加密算法Java实现 在现代软件开发过程中,数据的安全性变得越来越重要。对于数据传输和存储过程中的安全性保障,加密技术发挥着至关重要的作用。本文将详细介绍如何在Java环境中实现两种...
ASP.NET的MD5和DES加密和解密算法 非常好的资源 欢迎大家参考
根据提供的文件信息,本文将重点介绍Python中的DES加密算法,并简要提及MD5加密算法。同时,文中还将涉及Python中的图形界面编程库Tkinter的基本用法。以下是对这些知识点的详细解析。 ### 一、Python中的DES加密...
DELPHI源码内容包括MD5算法,DES加解密算法,3DES加解密算法
MD5、RSA和DES分别是散列函数、非对称加密算法和对称加密算法领域的经典代表。虽然这些算法随着时间的推移面临着不同程度的安全挑战,但它们仍然是信息安全领域的重要组成部分。理解这些算法的基本原理和技术细节...
总之,"vc++ DES加密算法"项目提供了使用Microsoft Visual C++实现DES加密的实例,结合MD5功能,可以用于数据的安全存储和传输。通过分析和学习项目中的源代码,开发者不仅可以掌握DES算法,还能提升在C++环境下处理...
本文将详细介绍四种常见的加密算法:DES、3DES、MD5和RSA,这些算法在Java编程语言中得到了广泛应用。 首先,我们来了解DES(Data Encryption Standard),这是一种对称加密算法,由IBM在1970年代开发并被美国国家...
DES,MD5,RSA加密算法:相关博文:http://www.cnblogs.com/tianzhijiexian/p/4047368.html
MD5和3DES都是在信息安全领域广泛使用的加密算法,它们各有不同的应用场景和安全特性。MD5主要用于数据完整性校验,而3DES则是一种对称加密算法,常用于保护数据的机密性。在这个"MD5 3DES 双重加密 demo"中,我们将...
通过这些代码,你可以了解如何在C#中实现MD5和DES加密解密,并理解它们的基本工作原理。然而,为了提高安全性,应当考虑使用更现代的加密标准,如AES,以及更安全的哈希函数,例如SHA-256。在处理敏感数据时,确保...
本资料包涵盖了多个常见的加密算法,包括2DES、3DES、3DES3、AES、Base64、Blowfish、CRC、DES、MD5以及RSA和SHA系列。以下将对这些算法进行详细介绍。 1. **2DES(双密钥数据加密标准)**:基于DES(Data ...
总的来说,通过学习这个DES加密算法的Delphi源码,你不仅可以掌握DES加密算法的原理和实现,还能提升你在Delphi编程中的实践能力,进一步理解和运用面向对象编程的思想。这对于任何想要深入研究加密技术或者使用...
`EncodeTest`可能是包含示例代码或程序的文件,通常这样的文件会提供如何在VC++环境中实现MD5和DES/3DES加密的示例。这个文件可能包含了类定义、函数实现以及如何使用这些函数的代码片段,通过这些代码,你可以学习...
在Delphi中实现MD5和DES加密,可以利用内置的Crypto单位或者第三方库,如 Indy 或 Bouncy Castle。例如,使用内置的TIdHashMD5组件进行MD5散列,通过TDes类实现DES加密。这些组件提供了易于理解的API,开发者可以...
在Windows Forms(Winform)环境中,我们可以创建一个简单的应用程序来实现DES加密和MD5加密的功能。DEncrypt.cs.txt和DEncrypt.Designer.cs是C#项目中的两个文件,其中DEncrypt.cs是主要的代码文件,包含了加密解密...
- `desc.c` 可能包含了DES加密算法的实现。 - `r_enhanc.c` 可能是某种增强版DES的实现,比如3DES或DESX。 - `rsa.c` 涉及RSA公钥加密算法,这与DES不同,RSA是非对称加密,通常用于数字签名和密钥交换。 - `nn.c`、...
本文将深入探讨三种常见的加密算法:3DES、MD5以及Base64,并介绍它们在实际应用中的工具和用途。 首先,我们来了解一下3DES(Triple DES,三重数据加密标准)。3DES是一种对称加密算法,它是DES(Data Encryption ...
本文将深入探讨MD5和DES两种加密算法,以及它们在Java中的实现。首先,我们来看MD5(Message-Digest Algorithm 5),它是一种广泛使用的哈希函数,产生一个128位(16字节)的散列值,通常用32个十六进制数字表示。 ...