`
hbczzsw
  • 浏览: 42712 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
阅读更多
    BASE64编码算法不算是真正的加密算法。
    MD5、SHA、HMAC这三种加密算法,可谓是非可逆加密,就是不可解密的加密方法,我们称之为单向加密算法。我们通常只把他们作为加密的基础。单纯的以上三种的加密并不可靠。

BASE64
按照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.)
常见于邮件、http加密,截取http信息,你就会发现登录操作的用户名、密码字段通过BASE64加密的。



通过java代码实现如下:

Java代码
1./** 
2. * BASE64解密 
3. *  
4. * @param key 
5. * @return 
6. * @throws Exception 
7. */ 
8.public static byte[] decryptBASE64(String key) throws Exception {  
9.    return (new BASE64Decoder()).decodeBuffer(key);  
10.}  
11. 
12./** 
13. * BASE64加密 
14. *  
15. * @param key 
16. * @return 
17. * @throws Exception 
18. */ 
19.public static String encryptBASE64(byte[] key) throws Exception {  
20.    return (new BASE64Encoder()).encodeBuffer(key);  
21.} 
/**
* BASE64解密
*
* @param key
* @return
* @throws Exception
*/
public static byte[] decryptBASE64(String key) throws Exception {
return (new BASE64Decoder()).decodeBuffer(key);
}

/**
* BASE64加密
*
* @param key
* @return
* @throws Exception
*/
public static String encryptBASE64(byte[] key) throws Exception {
return (new BASE64Encoder()).encodeBuffer(key);
}

主要就是BASE64Encoder、BASE64Decoder两个类,我们只需要知道使用对应的方法即可。另,BASE加密后产生的字节位数是8的倍数,如果不够位数以=符号填充。

MD5
MD5 -- message-digest algorithm 5 (信息-摘要算法)缩写,广泛用于加密和解密技术,常用于文件校验。校验?不管文件多大,经过MD5后都能生成唯一的MD5值。好比现在的ISO校验,都是MD5校验。怎么用?当然是把ISO经过MD5后产生MD5的值。一般下载linux-ISO的朋友都见过下载链接旁边放着MD5的串。就是用来验证文件是否一致的。



通过java代码实现如下:

Java代码
1./** 
2. * MD5加密 
3. *  
4. * @param data 
5. * @return 
6. * @throws Exception 
7. */ 
8.public static byte[] encryptMD5(byte[] data) throws Exception {  
9. 
10.    MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);  
11.    md5.update(data);  
12. 
13.    return md5.digest();  
14. 
15.} 
/**
* MD5加密
*
* @param data
* @return
* @throws Exception
*/
public static byte[] encryptMD5(byte[] data) throws Exception {

MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);
md5.update(data);

return md5.digest();

}


通常我们不直接使用上述MD5加密。通常将MD5产生的字节数组交给BASE64再加密一把,得到相应的字符串。

SHA
SHA(Secure Hash Algorithm,安全散列算法),数字签名等密码学应用中重要的工具,被广泛地应用于电子商务等信息安全领域。虽然,SHA与MD5通过碰撞法都被破解了, 但是SHA仍然是公认的安全加密算法,较之MD5更为安全。



通过java代码实现如下:

Java代码
1.    /** 
2.     * SHA加密 
3.     *  
4.     * @param data 
5.     * @return 
6.     * @throws Exception 
7.     */ 
8.    public static byte[] encryptSHA(byte[] data) throws Exception {  
9. 
10.        MessageDigest sha = MessageDigest.getInstance(KEY_SHA);  
11.        sha.update(data);  
12. 
13.        return sha.digest();  
14. 
15.    }  
16.} 
/**
* SHA加密
*
* @param data
* @return
* @throws Exception
*/
public static byte[] encryptSHA(byte[] data) throws Exception {

MessageDigest sha = MessageDigest.getInstance(KEY_SHA);
sha.update(data);

return sha.digest();

}
}


HMAC
HMAC(Hash Message Authentication Code,散列消息鉴别码,基于密钥的Hash算法的认证协议。消息鉴别码实现鉴别的原理是,用公开函数和密钥产生一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。使用一个密钥生成一个固定大小的小数据块,即MAC,并将其加入到消息中,然后传输。接收方利用与发送方共享的密钥进行鉴别认证等。



通过java代码实现如下:

Java代码
1./** 
2. * 初始化HMAC密钥 
3. *  
4. * @return 
5. * @throws Exception 
6. */ 
7.public static String initMacKey() throws Exception {  
8.    KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);  
9. 
10.    SecretKey secretKey = keyGenerator.generateKey();  
11.    return encryptBASE64(secretKey.getEncoded());  
12.}  
13. 
14./** 
15. * HMAC加密 
16. *  
17. * @param data 
18. * @param key 
19. * @return 
20. * @throws Exception 
21. */ 
22.public static byte[] encryptHMAC(byte[] data, String key) throws Exception {  
23. 
24.    SecretKey secretKey = new SecretKeySpec(decryptBASE64(key), KEY_MAC);  
25.    Mac mac = Mac.getInstance(secretKey.getAlgorithm());  
26.    mac.init(secretKey);  
27. 
28.    return mac.doFinal(data);  
29. 
30.} 

/**
* 初始化HMAC密钥
*
* @return
* @throws Exception
*/
public static String initMacKey() throws Exception {
KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);

SecretKey secretKey = keyGenerator.generateKey();
return encryptBASE64(secretKey.getEncoded());
}

/**
* HMAC加密
*
* @param data
* @param key
* @return
* @throws Exception
*/
public static byte[] encryptHMAC(byte[] data, String key) throws Exception {

SecretKey secretKey = new SecretKeySpec(decryptBASE64(key), KEY_MAC);
Mac mac = Mac.getInstance(secretKey.getAlgorithm());
mac.init(secretKey);

return mac.doFinal(data);

}


给出一个完整类,如下:

Java代码
1.import java.security.MessageDigest;  
2. 
3.import javax.crypto.KeyGenerator;  
4.import javax.crypto.Mac;  
5.import javax.crypto.SecretKey;  
6. 
7.import sun.misc.BASE64Decoder;  
8.import sun.misc.BASE64Encoder;  
9. 
10./** 
11. * 基础加密组件 
12. *  
13. * @author 梁栋 
14. * @version 1.0 
15. * @since 1.0 
16. */ 
17.public abstract class Coder {  
18.    public static final String KEY_SHA = "SHA";  
19.    public static final String KEY_MD5 = "MD5";  
20. 
21.    /** 
22.     * MAC算法可选以下多种算法 
23.     *  
24.     * <pre> 
25.     * HmacMD5  
26.     * HmacSHA1  
27.     * HmacSHA256  
28.     * HmacSHA384  
29.     * HmacSHA512 
30.     * </pre> 
31.     */ 
32.    public static final String KEY_MAC = "HmacMD5";  
33. 
34.    /** 
35.     * BASE64解密 
36.     *  
37.     * @param key 
38.     * @return 
39.     * @throws Exception 
40.     */ 
41.    public static byte[] decryptBASE64(String key) throws Exception {  
42.        return (new BASE64Decoder()).decodeBuffer(key);  
43.    }  
44. 
45.    /** 
46.     * BASE64加密 
47.     *  
48.     * @param key 
49.     * @return 
50.     * @throws Exception 
51.     */ 
52.    public static String encryptBASE64(byte[] key) throws Exception {  
53.        return (new BASE64Encoder()).encodeBuffer(key);  
54.    }  
55. 
56.    /** 
57.     * MD5加密 
58.     *  
59.     * @param data 
60.     * @return 
61.     * @throws Exception 
62.     */ 
63.    public static byte[] encryptMD5(byte[] data) throws Exception {  
64. 
65.        MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);  
66.        md5.update(data);  
67. 
68.        return md5.digest();  
69. 
70.    }  
71. 
72.    /** 
73.     * SHA加密 
74.     *  
75.     * @param data 
76.     * @return 
77.     * @throws Exception 
78.     */ 
79.    public static byte[] encryptSHA(byte[] data) throws Exception {  
80. 
81.        MessageDigest sha = MessageDigest.getInstance(KEY_SHA);  
82.        sha.update(data);  
83. 
84.        return sha.digest();  
85. 
86.    }  
87. 
88.    /** 
89.     * 初始化HMAC密钥 
90.     *  
91.     * @return 
92.     * @throws Exception 
93.     */ 
94.    public static String initMacKey() throws Exception {  
95.        KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);  
96. 
97.        SecretKey secretKey = keyGenerator.generateKey();  
98.        return encryptBASE64(secretKey.getEncoded());  
99.    }  
100. 
101.    /** 
102.     * HMAC加密 
103.     *  
104.     * @param data 
105.     * @param key 
106.     * @return 
107.     * @throws Exception 
108.     */ 
109.    public static byte[] encryptHMAC(byte[] data, String key) throws Exception {  
110. 
111.        SecretKey secretKey = new SecretKeySpec(decryptBASE64(key), KEY_MAC);  
112.        Mac mac = Mac.getInstance(secretKey.getAlgorithm());  
113.        mac.init(secretKey);  
114. 
115.        return mac.doFinal(data);  
116. 
117.    }  
118.} 
import java.security.MessageDigest;

import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

/**
* 基础加密组件
*
* @author 梁栋
* @version 1.0
* @since 1.0
*/
public abstract class Coder {
public static final String KEY_SHA = "SHA";
public static final String KEY_MD5 = "MD5";

/**
* MAC算法可选以下多种算法
*
* <pre>
* HmacMD5
* HmacSHA1
* HmacSHA256
* HmacSHA384
* HmacSHA512
* </pre>
*/
public static final String KEY_MAC = "HmacMD5";

/**
* BASE64解密
*
* @param key
* @return
* @throws Exception
*/
public static byte[] decryptBASE64(String key) throws Exception {
return (new BASE64Decoder()).decodeBuffer(key);
}

/**
* BASE64加密
*
* @param key
* @return
* @throws Exception
*/
public static String encryptBASE64(byte[] key) throws Exception {
return (new BASE64Encoder()).encodeBuffer(key);
}

/**
* MD5加密
*
* @param data
* @return
* @throws Exception
*/
public static byte[] encryptMD5(byte[] data) throws Exception {

MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);
md5.update(data);

return md5.digest();

}

/**
* SHA加密
*
* @param data
* @return
* @throws Exception
*/
public static byte[] encryptSHA(byte[] data) throws Exception {

MessageDigest sha = MessageDigest.getInstance(KEY_SHA);
sha.update(data);

return sha.digest();

}

/**
* 初始化HMAC密钥
*
* @return
* @throws Exception
*/
public static String initMacKey() throws Exception {
KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);

SecretKey secretKey = keyGenerator.generateKey();
return encryptBASE64(secretKey.getEncoded());
}

/**
* HMAC加密
*
* @param data
* @param key
* @return
* @throws Exception
*/
public static byte[] encryptHMAC(byte[] data, String key) throws Exception {

SecretKey secretKey = new SecretKeySpec(decryptBASE64(key), KEY_MAC);
Mac mac = Mac.getInstance(secretKey.getAlgorithm());
mac.init(secretKey);

return mac.doFinal(data);

}
}


再给出一个测试类:

Java代码
1.import static org.junit.Assert.*;  
2. 
3.import org.junit.Test;  
4. 
5./** 
6. *  
7. * @author 梁栋 
8. * @version 1.0 
9. * @since 1.0 
10. */ 
11.public class CoderTest {  
12. 
13.    @Test 
14.    public void test() throws Exception {  
15.        String inputStr = "简单加密";  
16.        System.err.println("原文:\n" + inputStr);  
17. 
18.        byte[] inputData = inputStr.getBytes();  
19.        String code = Coder.encryptBASE64(inputData);  
20. 
21.        System.err.println("BASE64加密后:\n" + code);  
22. 
23.        byte[] output = Coder.decryptBASE64(code);  
24. 
25.        String outputStr = new String(output);  
26. 
27.        System.err.println("BASE64解密后:\n" + outputStr);  
28. 
29.        // 验证BASE64加密解密一致性  
30.        assertEquals(inputStr, outputStr);  
31. 
32.        // 验证MD5对于同一内容加密是否一致  
33.        assertArrayEquals(Coder.encryptMD5(inputData), Coder  
34.                .encryptMD5(inputData));  
35. 
36.        // 验证SHA对于同一内容加密是否一致  
37.        assertArrayEquals(Coder.encryptSHA(inputData), Coder  
38.                .encryptSHA(inputData));  
39. 
40.        String key = Coder.initMacKey();  
41.        System.err.println("Mac密钥:\n" + key);  
42. 
43.        // 验证HMAC对于同一内容,同一密钥加密是否一致  
44.        assertArrayEquals(Coder.encryptHMAC(inputData, key), Coder.encryptHMAC(  
45.                inputData, key));  
46. 
47.        BigInteger md5 = new BigInteger(Coder.encryptMD5(inputData));  
48.        System.err.println("MD5:\n" + md5.toString(16));  
49. 
50.        BigInteger sha = new BigInteger(Coder.encryptSHA(inputData));  
51.        System.err.println("SHA:\n" + sha.toString(32));  
52. 
53.        BigInteger mac = new BigInteger(Coder.encryptHMAC(inputData, inputStr));  
54.        System.err.println("HMAC:\n" + mac.toString(16));  
55.    }  
56.} 
import static org.junit.Assert.*;

import org.junit.Test;

/**
*
* @author 梁栋
* @version 1.0
* @since 1.0
*/
public class CoderTest {

@Test
public void test() throws Exception {
String inputStr = "简单加密";
System.err.println("原文:\n" + inputStr);

byte[] inputData = inputStr.getBytes();
String code = Coder.encryptBASE64(inputData);

System.err.println("BASE64加密后:\n" + code);

byte[] output = Coder.decryptBASE64(code);

String outputStr = new String(output);

System.err.println("BASE64解密后:\n" + outputStr);

// 验证BASE64加密解密一致性
assertEquals(inputStr, outputStr);

// 验证MD5对于同一内容加密是否一致
assertArrayEquals(Coder.encryptMD5(inputData), Coder
.encryptMD5(inputData));

// 验证SHA对于同一内容加密是否一致
assertArrayEquals(Coder.encryptSHA(inputData), Coder
.encryptSHA(inputData));

String key = Coder.initMacKey();
System.err.println("Mac密钥:\n" + key);

// 验证HMAC对于同一内容,同一密钥加密是否一致
assertArrayEquals(Coder.encryptHMAC(inputData, key), Coder.encryptHMAC(
inputData, key));

BigInteger md5 = new BigInteger(Coder.encryptMD5(inputData));
System.err.println("MD5:\n" + md5.toString(16));

BigInteger sha = new BigInteger(Coder.encryptSHA(inputData));
System.err.println("SHA:\n" + sha.toString(32));

BigInteger mac = new BigInteger(Coder.encryptHMAC(inputData, inputStr));
System.err.println("HMAC:\n" + mac.toString(16));
}
}


控制台输出:

Console代码
1.原文:  
2.简单加密  
3.BASE64加密后:  
4.566A5Y2V5Yqg5a+G  
5. 
6.BASE64解密后:  
7.简单加密  
8.Mac密钥:  
9.uGxdHC+6ylRDaik++leFtGwiMbuYUJ6mqHWyhSgF4trVkVBBSQvY/a22xU8XT1RUemdCWW155Bke  
10.pBIpkd7QHg==  
11. 
12.MD5:  
13.-550b4d90349ad4629462113e7934de56  
14.SHA:  
15.91k9vo7p400cjkgfhjh0ia9qthsjagfn  
16.HMAC:  
17.2287d192387e95694bdbba2fa941009a 
原文:
简单加密
BASE64加密后:
566A5Y2V5Yqg5a+G

BASE64解密后:
简单加密
Mac密钥:
uGxdHC+6ylRDaik++leFtGwiMbuYUJ6mqHWyhSgF4trVkVBBSQvY/a22xU8XT1RUemdCWW155Bke
pBIpkd7QHg==

MD5:
-550b4d90349ad4629462113e7934de56
SHA:
91k9vo7p400cjkgfhjh0ia9qthsjagfn
HMAC:
2287d192387e95694bdbba2fa941009a



    BASE64的加密解密是双向的,可以求反解。
    MD5、SHA以及HMAC是单向加密,任何数据加密后只会产生唯一的一个加密串,通常用来校验数据在传输过程中是否被修改。其中HMAC算法有一个密钥,增强了数据传输过程中的安全性,强化了算法外的不可控因素。
    单向加密的用途主要是为了校验数据在传输过程中是否被修改。
分享到:
评论

相关推荐

    单向加密算法的Java实现

    【单向加密算法在Java中的实现】 在信息技术领域,单向加密算法,也称为哈希函数或散列函数,是一种将任意长度的数据转化为固定长度输出的算法。这种转化过程是不可逆的,也就是说,一旦数据经过哈希处理,无法通过...

    vb 密码单向加密算法.rar

    单向加密算法,也称为散列函数或哈希函数,它具有不可逆性,即不能通过加密后的结果推导出原始输入信息。这样的特性使得单向加密成为存储密码的理想选择,因为即使数据泄露,攻击者也无法轻易地还原成原始密码。 VB...

    单向加密算法加密算法

    MD5 C#

    MD5单向加密,加密后无法解密

    MD5单向加密,加密后无法解密。。。。。。。。。。

    VB MD5 单向加密源码

    VB MD5 单向加密源码是用于在Visual Basic编程环境中实现MD5(Message-Digest Algorithm 5)加密算法的代码资源。MD5是一种广泛使用的哈希函数,它能够将任意长度的数据转换为固定长度的128位(16字节)摘要,通常用...

    MD5加密单向加密算法加密速度快,不需要秘钥,最好加盐

    MD5加密单向加密算法加密速度快,不需要秘钥,最好加盐

    基于python语言和MySQL的学籍管理系统源码+项目说明(高分课程设计)(使用了hash函数单向加密等密码学技术).zip

    【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、...基于python语言和MySQL的学籍管理系统源码+项目说明(高分课程设计)(使用了hash函数单向加密等密码学技术).zip

    基于python+MySQL实现高校学籍管理系统功能齐全,使用了hash函数单向加密等密码学技术课程设计(源码+课设报告)

    【作品名称】:基于python+MySQL实现的,针对老师、学生、管理员用户,功能齐全,使用了hash函数单向加密等密码学技术。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、...

    (最新)解密单向加密公式的公式管理器V6.00

    把“TCalc.dll”公式管理器替换原来目录下的同名文件,可以正常使用,不过要管理器版本号相同才行,否则...点击加密公式,点确定就可以看到单向加密的密码,再返回原来加密那输入密码就可以解开公式,看到原创作者加密的源码.

    C#加密解密DeEncryptHelper.zip

    单向加密 SHA1 单向加密 DES 双向,可解密 加密字符串 加密字符串 密钥为系统默认 加密文件 解密字符串 解密文件 128位MD5算法加密字符串 128位MD5算法加密Byte数组 32位MD5加密 Base64加密 Base64解密 DES加密/解密...

    Java实现常用加密算法——单向加密算法MD5和SHA

    在Eclipse IDE中关联JDK源码可以帮助开发者更深入地理解MD5和SHA单向加密算法在Java中的实现。具体来说,可以解压JDK的src.zip目录到指定位置,并下载OpenJDK的源代码来补充那些不在src.zip中的类文件,例如sun....

    单向加密就是用同一个密钥去加密和解密

    工作模式:ECB/CBC 默认情况下iOS是CBC的,我提供的例子是ECB的的工作模式,所以iOS在设置加密参数的时候要添加参数 kCCOptionECBMode

    Java 详解单向加密--MD5、SHA和HMAC及简单实现实例

    Java中的单向加密技术主要包括MD5、SHA以及HMAC,这些算法主要用于数据的完整性校验和安全性保护。下面我们将详细探讨这些加密算法及其在Java中的实现。 首先,MD5(Message-Digest Algorithm 5)是一种广泛应用的...

    Vue-常用加密(MD5,DES,SHA256,BASE64,SHA1,RSA)

    发送者将明文通过单向加密算法加密生成定长的密文串,然后将明文和密文串传递给接收方。接收方在收到报文后,将解明文使用相同的单向加密算法进行加密,得出加密后的密文串。随后与发送者发送过来的密文串进行对比,...

    MD5加密算法

    MD5就是采用单向加密的加密算法,对于MD5而言,有两个特性是很重要的,第一是任意两段明文数据,加密以后的密文不能是相同的;第二是任意一段明文数据,经过加密以后,其结果必须永远是不变的。前者的意思是不可能有...

    java加密解密方法大全

    单向加密算法又称哈希函数,它将任意长度的明文数据映射为固定长度的密文(哈希值),这个过程是不可逆的,意味着无法从哈希值推导出原始数据。单向加密算法常用于验证数据的完整性和一致性。由于其不可逆性,它不...

    使用python语言和MySQL实现学籍管理系统,针对老师、学生、管理员用户,功能齐全,使用了hash函数单向加密等密码学技

    (1) 目的 1. 通过数据库课程设计,来进一加深对数据库开发与应用的了解,掌握sql语句与sql服务的要领,从而达到让我们实践的目的。 2. 首先查阅书籍可以知道数据库课程设计数据库系统开发步骤的要领有:需求分析,...

    加密处理使密码更安全[CFS编码加密

    本文将介绍一种名为"CFS编码加密"的方法,它是一种单向加密算法,用于保护存储在数据库中的密码。 "CFS编码加密"是由ASP技术广场开发的一种独特的加密方法,不同于常见的加密技术。它的特点是加密后的字符串与原始...

    Java加密解密方法大全

    本文详细介绍了Java加密解密的相关概念和技术,包括对称加密算法、非对称加密算法和单向加密算法的特点及其应用场景。通过对这些基本概念的理解,可以帮助开发人员更好地选择合适的加密方案来保护敏感数据。在实际...

Global site tag (gtag.js) - Google Analytics