`

19、java加密技术(一)-BASE64与单向加密算法MD5&SHA&MAC

    博客分类:
  • java
 
阅读更多
<转>http://snowolf.iteye.com/blog/379860
基本的单向加密算法:
BASE64 严格地说,属于编码格式,而非加密算法
MD5(Message Digest algorithm 5,信息摘要算法)
SHA(Secure Hash Algorithm,安全散列算法)
HMAC(Hash Message Authentication Code,散列消息鉴别码)

    复杂的对称加密(DES、PBE)、非对称加密算法:
DES(Data Encryption Standard,数据加密算法)
PBE(Password-based encryption,基于密码验证)
RSA(算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman)
DH(Diffie-Hellman算法,密钥一致协议)
DSA(Digital Signature Algorithm,数字签名)
ECC(Elliptic Curves Cryptography,椭圆曲线密码编码学)

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代码实现:主要就是BASE64Encoder、BASE64Decoder两个类,我们只需要知道使用对应的方法即可。另,BASE加密后产生的字节位数是8的倍数,如果不够位数以=符号填充。
public class Base64 {
	/** 
	 * 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);  
	}  
}
			System.out.println(Base64.encryptBASE64("skx".getBytes()));
System.out.println(new String(Base64.decryptBASE64("c2t4")));


MD5
MD5 -- message-digest algorithm 5 (信息-摘要算法)缩写,广泛用于加密和解密技术,常用于文件校验。校验?不管文件多大,经过MD5后都能生成唯一的MD5值。好比现在的ISO校验,都是MD5校验。怎么用?当然是把ISO经过MD5后产生MD5的值。

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

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

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

package org.nick.encrypt;

import java.security.MessageDigest;  
import javax.crypto.KeyGenerator;  
import javax.crypto.Mac;  
import javax.crypto.SecretKey;  
import javax.crypto.spec.SecretKeySpec;
import Decoder.BASE64Decoder;
import Decoder.BASE64Encoder; 
/** 
 * 基础加密组件 
 *  
 * @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);  
  
    }  
}  

import java.math.BigInteger;
import org.nick.encrypt.Coder;
public class Test
{
    public static void main(String[] str) throws Exception {  
        String inputStr = "简单加密";  
        System.err.println("原文:" + inputStr);  
        byte[] inputData = inputStr.getBytes();  
        String code = Coder.encryptBASE64(inputData);  
        System.err.print("BASE64加密后:" + code);  
        byte[] output = Coder.decryptBASE64(code);  
        String outputStr = new String(output);  
        System.err.println("BASE64解密后:" + outputStr+"\n");  
        String key = Coder.initMacKey();  
        System.err.print("Mac密钥:" + key);  
        BigInteger mac = new BigInteger(Coder.encryptHMAC(inputData, inputStr));  
        System.err.println("HMAC:" + mac.toString(16)+"\n");
        
        BigInteger md5 = new BigInteger(Coder.encryptMD5(inputData));
        System.err.println("MD5:" + md5.toString(16));  
  
        BigInteger sha = new BigInteger(Coder.encryptSHA(inputData));  
        System.err.println("SHA:" + sha.toString(32));  
    }  
}


原文:简单加密
BASE64加密后:vPK1pbzTw9w=
BASE64解密后:简单加密

Mac密钥:cXU5WE7hjYcdfthgA+GCGnjGy25fu4EnfN7t4V+h/U1HjhATARdFxmzFrPD6wdihfIlTzMAKsI9M
R0OdfI6OxQ==
HMAC:358250966fbd6166b94b384105f6894b

MD5:-12d1456f5d947be6eac80fc07900be99
SHA:-bbbd559051qu2b5pl635l3jj8jrvodsn

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

相关推荐

    Java加密技术介绍.docx

    Java加密技术(一)——BASE64与单向加密算法MD5&SHA&MAC Java加密技术(二)——对称加密算法DES&AES Java加密技术(三)——PBE算法 Java加密技术(四)——非对称加密算法RSA Java加密技术(五)——非对称加密...

    基于JAVA的加密算法(包括10种加密技术)

    Java加密技术(一) 关键字: java 加密基础, base64, md5, mac, sha, 单向加密 。。。。。。。。。。。。。。

    Java常见加密技术全景展示_附Java代码实现

    如基本的单向加密算法: ● BASE64 严格地说,属于编码格式,而非加密算法 ● MD5(Message Digest algorithm 5,信息摘要算法) ● SHA(Secure Hash Algorithm,安全散列算法) ● HMAC(Hash Message ...

    Base64, SHA-256等加密算法

    所需的工具:Spring开发工具或者其他java开发工具 Base64 二进制(图片、文件、声音)变成可打印的文本... MD5,SHA-1, SHA-256 消息摘要,单向,不可逆  算法确定,结果长度确定  SHA 不是傻,是security-Hash 函数

    Java加密与解密的艺术

    可以攻玉1094.1 加固你的系统1094.2 加密组件Bouncy Castle 1114.3 辅助...与加密算法的关系1355.4 实现原理1365.5 模型分析1375.6 Base64算法实现1385.7 Url Base64算法实现1475.8 应用举例1515.9 小结153第6章验证...

    Java加密与解密的艺术配书源代码

    第5章电子邮件传输算法—Base64 134 5.1 Base64算法的由来134 5.2 Base64算法的定义134 5.3 Base64算法与加密算法的关系135 5.4 实现原理136 5.5 模型分析137 5.6 Base64算法实现138 5.7 Url Base64算法实现147 5.8 ...

    C#加密解密DeEncryptHelper.zip

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

    PasswordEncoder:使用安全哈希算法SHA256的密码编码器实现

    密码编码器使用安全哈希算法SHA256的密码编码器实现概述... SHA256加密计算一个256位数字指纹,其十六进制写入由64个字符组成。 该算法使用非线性函数,这意味着它是单向的并且无法解密。技术栈: WPF App .NET框架XAML

    SFCipher(加解密工具)

    目前这个工具支持对称加密算法(AES、3DES)、非对称加密算法(RSA)、单向散列算法(MD5、SHA1、CRC32)、Base64算法等,后期还会不定时新增别的算法,在使用过程中如有问题欢迎邮件给我,我会及时优化和反馈。

    Flask框架中密码的加盐哈希加密和验证功能的用法详解

    签名算法加密:也可以理解为单向哈希加密,比如MD5, SHA1等。加密算法固定,容 易被暴力破解。如果密码相同,得到的哈希值是一样的。 加盐哈希加密:加密时混入一段“随机”字符串(盐值)再进行哈希加密。即使...

    webapi-security:web API开放接口设计解决方案

    * MD5(Message Digest algorithm 5,信息摘要算法),单向加密; 使用场景:用来校验数据在传输过程中是否被修改 * SHA(Secure Hash Algorithm,安全散列算法),单向加密; 使用场景:用来校验数据在传输过程中...

    ELEnDecrypter.rar_加密解密_C#_

    提供简单常用的文本加密解密功能,包括:1、单向HASH加密(MD5、SHA算法);2、基于.NET平台Base64String的加密解密;3、DES、RC2算法加密解密。可满足常规的文本加密解密、密码测试等需求。

Global site tag (gtag.js) - Google Analytics