知识大全 漫谈Java加密技术(一)
Posted 知
篇首语:天才就是百分之九十九的汗水加百分之一的灵感。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 漫谈Java加密技术(一)相关的知识,希望对你有一定的参考价值。
漫谈Java加密技术(一) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
加密解密 曾经是我一个毕业设计的重要组件 在工作了多年以后回想当时那个加密 解密算法 实在是太单纯了
言归正传 这里我们主要描述Java已经实现的一些加密解密算法 最后介绍数字证书
如基本的单向加密算法
● BASE 严格地说 属于编码格式 而非加密算法 ● MD (Message Digest algorithm 信息摘要算法) ● 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 椭圆曲线密码编码学)
本篇内容简要介绍BASE MD SHA HMAC几种方法
MD SHA HMAC这三种加密算法 可谓是非可逆加密 就是不可解密的加密方法 我们通常只把他们作为加密的基础 单纯的以上三种的加密并不可靠
BASE
按照RFC 的定义 Base 被定义为 Base 内容传送编码被设计用来把任意序列的 位字节描述为一种不易被人直接识别的形式 (The Base Content Transfer Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable )
常见于邮件 加密 截取信息 你就会发现登录操作的用户名 密码字段通过BASE 加密的
通过java代码实现如下
/** *//** * BASE 解密 ; * * @param key * @return * @throws Exception */ public static byte[] decryptBASE (String key) throws Exception return (new BASE Decoder()) decodeBuffer(key); /** *//** * BASE 加密 * * @param key * @return * @throws Exception */ public static String encryptBASE (byte[] key) throws Exception return (new BASE Encoder()) encodeBuffer(key);
主要就是BASE Encoder BASE Decoder两个类 我们只需要知道使用对应的方法即可 另 BASE加密后产生的字节位数是 的倍数 如果不够位数以=符号填充
MD
MD —— message digest algorithm (信息 摘要算法)缩写 广泛用于加密和解密技术 常用于文件校验 校验?不管文件多大 经过MD 后都能生成唯一的MD 值 好比现在的ISO校验 都是MD 校验 怎么用?当然是把ISO经过MD 后产生MD 的值 一般下载linux ISO的朋友都见过下载链接旁边放著MD 的串 就是用来验证文件是否一致的
通过java代码实现如下
/** *//** * MD 加密 ;; * * @param data * @return * @throws Exception */ public static byte[] encryptMD (byte[] data) throws Exception MessageDigest md = MessageDigest getInstance(KEY_MD ); md update(data); return md digest();
通常我们不直接使用上述MD 加密 通常将MD 产生的字节数组交给BASE 再加密一把 得到相应的字符串
SHA
SHA(Secure Hash Algorithm 安全散列算法) 数字签名等密码学应用中重要的工具 被广泛地应用于电子商务等信息安全领域 虽然 SHA与MD 通过碰撞法都被破解了 但是SHA仍然是公认的安全加密算法 较之MD 更为安全
通过java代码实现如下
/** *//** * 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代码实现如下
/** *//** * 初始化HMAC密钥 ; * * @return * @throws Exception */ public static String initMacKey() throws Exception KeyGenerator keyGenerator = KeyGenerator getInstance(KEY_MAC); SecretKey secretKey = keyGenerator generateKey(); return encryptBASE (secretKey getEncoded()); /** *//** * HMAC加密 * * @param data * @param key * @return * @throws Exception */ public static byte[] encryptHMAC(byte[] data String key) throws Exception SecretKey secretKey = new SecretKeySpec(decryptBASE (key) KEY_MAC); Mac mac = Mac getInstance(secretKey getAlgorithm()); mac init(secretKey); return mac doFinal(data);
给出一个完整类 如下
import java security MessageDigest; import javax crypto KeyGenerator; import javax crypto Mac; import javax crypto SecretKey; import sun misc BASE Decoder; import sun misc BASE Encoder; /** *//** * 基础加密组件 ; * * @author 梁栋 * @version * @since */ public abstract class Coder public static final String KEY_SHA = SHA ; public static final String KEY_MD = MD ; /** *//** * MAC算法可选以下多种算法 * * <pre> * HmacMD * HmacSHA * HmacSHA * HmacSHA * HmacSHA * </pre> */ public static final String KEY_MAC = HmacMD ; /** *//** * BASE 解密 * * @param key * @return * @throws Exception */ public static byte[] decryptBASE (String key) throws Exception return (new BASE Decoder()) decodeBuffer(key); /** *//** * BASE 加密 * * @param key * @return * @throws Exception */ public static String encryptBASE (byte[] key) throws Exception return (new BASE Encoder()) encodeBuffer(key); /** *//** * MD 加密 * * @param data * @return * @throws Exception */ public static byte[] encryptMD (byte[] data) throws Exception MessageDigest md = MessageDigest getInstance(KEY_MD ); md update(data); return md 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 encryptBASE (secretKey getEncoded()); /** *//** * HMAC加密 * * @param data * @param key * @return * @throws Exception */ public static byte[] encryptHMAC(byte[] data String key) throws Exception SecretKey secretKey = new SecretKeySpec(decryptBASE (key) KEY_MAC); Mac mac = Mac getInstance(secretKey getAlgorithm()); mac init(secretKey); return mac doFinal(data);
再给出一个测试类
import static junit Assert *;
import junit Test;
/** * * @author 梁栋 * @version * @since */public class CoderTest
@Test public void test() throws Exception String inputStr = 简单加密 ; System err println( 原文:\\n + inputStr);
byte[] inputData = inputStr getBytes(); String code = Coder encryptBASE (inputData);
System err println( BASE 加密后:\\n + code);
byte[] output = Coder decryptBASE (code);
String outputStr = new String(output);
System err println( BASE 解密后:\\n + outputStr);
// 验证BASE 加密解密一致性 assertEquals(inputStr outputStr);
// 验证MD 对于同一内容加密是否一致 assertArrayEquals(Coder encryptMD (inputData) Coder encryptMD (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 md = new BigInteger(Coder encryptMD (inputData)); System err println( MD :\\n + md toString( ));
BigInteger sha = new BigInteger(Coder encryptSHA(inputData)); System err println( SHA:\\n + sha toString( ));
BigInteger mac = new BigInteger(Coder encryptHMAC(inputData inputStr)); System err println( HMAC:\\n + mac toString( ));
cha138/Article/program/Java/gj/201311/27564相关参考
漫谈Java加密技术(二) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 接下来我们介绍对称加密
Java加密技术(九) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在Java加密技术(八)中
谈谈Java加密技术(七) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! ECC ECCEll
谈谈Java加密技术(六) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 接下来我们介绍DSA数
知识大全 Java技术进阶 基于Java的IDEA加密算法探讨
Java技术进阶基于Java的IDEA加密算法探讨 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
深入讨论JAVA字节码加密技术(2) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 这个累加载器
深入讨论JAVA字节码加密技术(1) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 如果把的cl
论Java加密技术与Windows的结合 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 论Jav
漫谈Java程序的性能优化 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Java使得复杂应用的
漫谈Java平台上的CRM系统 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 概要 本文介绍了