- 浏览: 159857 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
fengwuqing40:
zxh277100963 写道有个bug String输入数字 ...
pinyin4j 中文转成拼音(支持多音字输出) -
pimkle:
楼主说的很好 评论补充的也好 像是解决了多音字的问题 可是还需 ...
pinyin4j 中文转成拼音(支持多音字输出) -
yangjianzhouctgu:
请问org.rut.util.algorithm.SortUt ...
java排序归总 -
zxh277100963:
有个bug String输入数字 报错
修改一下
...
pinyin4j 中文转成拼音(支持多音字输出) -
gejialun88:
java环境下使用jQuery进行JSON数据传送的交互过程
● 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,椭圆曲线密码编码学)
本篇内容简要介绍BASE64、MD5、SHA、HMAC几种方法。
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代码实现如下:
* BASE64解密 http://www.bt285.cn http://www.5a520.cn
*
* @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代码实现如下:
* MD5加密 http://www.bt285.cn http://www.5a520.cn
*
* @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代码实现如下:
* SHA加密 http://www.5a520.cn http://www.bt285.cn
*
* @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密钥 http://www.guihua.org http://www.feng123.com
*
* @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);
}
Test.java
import java.security.MessageDigest; import javax.crypto.KeyGenerator; import javax.crypto.Mac; import javax.crypto.SecretKey; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; /** *//** * 基础加密组件 http://www.bt285.cn http://www.feng123.com * * @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); } }
import static org.junit.Assert.*; import org.junit.Test; /** * * @author 梁栋 http://www.feng123.com * @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)); }
注明:此文章属站内转载,供大家学习,谢谢!
发表评论
-
Spring加载Hibernate映射的几种方式及区别
2013-07-02 11:52 1006Spring加载Hibernate映射的 ... -
jvm调优
2012-12-25 10:42 0tomcate 报 PermGen space 错误 j ... -
软件设计中的一些原则
2012-08-01 23:23 1310——摘自网络 本文 ... -
JA-SIG CAS(v3.3)的初步总结
2012-05-04 10:22 1472CAS 配置(摘自网络,仅供产考学习交流) 一 配置实例 ... -
pinyin4j 中文转成拼音(支持多音字输出)
2012-01-13 11:24 18204最近要做一个中文转为拼音,于是联想到 pinyin4j,网络上 ... -
HTTP的请求和响应详解
2011-12-31 11:04 43546进行Web开发 ... -
Eclipse 3.3.2+JDK1.6+Ant 1.7+Openfire_src_3_5_1.zip
2011-12-10 12:49 2221说明:开发环境(IDE):Eclipse 3.3.2+JDK ... -
DBCP,C3P0,Proxool,BoneCP参数介绍
2011-02-25 13:50 10661 Apache-DBCP: dataSource: 要连接的 ... -
Servlet应用机制初步总结
2011-02-25 13:47 11301 .首先,什么是Servlet? ... -
session 与cookie工作机制
2011-02-25 11:37 799首先我们来看个例子,笔者曾经常去的一家咖啡店有喝5杯 ... -
数据源性能优化比较
2011-02-23 18:01 1048数据源性能优化比较 DBCP,C3P0,Proxool, ... -
BoneCP数据源配置详解
2011-02-23 17:59 3793<bean id="dataSource&qu ... -
C3P0数据源配置详解
2011-02-23 17:56 1072<c3p0-config> <defau ...
相关推荐
本文将深入探讨Java中的加密技术,特别是MD5加密算法,通过实例和代码片段,帮助读者理解其工作原理及如何在实际项目中应用。 #### 一、MessageDigest与MD5算法 `MessageDigest`类是Java提供的用于实现摘要算法的...
本资源包“常用加密工具类(JAVA).zip”提供了12个不同的加密和排序工具类,以及一个log4j配置文件,旨在帮助开发者更方便地处理这些常见任务。以下是这些工具类及配置文件的详细介绍: 1. **MD5加密**:MD5...
根据密钥类型不同将现代密码技术分为两类:对称加密算法(秘密钥匙加密)和非对称加密算法(公开密钥加密)。 对称钥匙加密系统是加密和解密均采用同一把秘密钥匙,而且通信双方都必须获得这把钥匙,并保持钥匙的...
随着现代网络技术的飞速发展,人们的个人信息、文件传递以及电子商务等方面都需要大力的保护,文件加密技术也应运而生。本次使用JAVA语言,采用3DES加密算法进行对文本文件的加密,通过二进制和十六进制的转换来实现...
本文将深入探讨Java中常用的加密方式,主要关注对称加密和非对称加密。 首先,加密的主要目的是保护数据,防止未经授权的访问。加密可以分为双向加密和单向加密。双向加密允许信息在加密后能够被解密回原始内容,...
在这个主题中,我们将深入探讨三个关键知识点:Java中的类加载器(ClassLoader)在加密解密中的应用、常见的加密算法以及Java提供的加密技术。 首先,让我们来看看Java的类加载器如何在加密解密中发挥作用。类加载...
Java项目中的加密技术是保障信息安全的关键手段,涵盖了多种加密解密算法和证书体系。下面将详细介绍这些技术: 1. **基本的单向加密算法**: - **BASE64**:其实是一种编码方式,而非真正的加密算法。它将任意...
然而,我们可以基于这个主题,深入探讨Java中的文本加密技术,包括其背景、原理以及常见加密算法的实现。 ### Java中的文字加密 在计算机科学中,加密是保护数据安全的关键技术之一,它通过将可读信息转换为看似...
在IT行业中,加密技术是保护数据安全的重要手段。Java作为一种广泛应用的编程语言,提供了丰富的库和API用于实现各种加密算法。本资料包“加密典型代码(java)”旨在帮助开发者学习如何在Java环境中编写加密程序,...
这里我们主要讨论对称加密,因为它是Java中最常用且基础的加密方式。 对称加密是一种使用同一密钥进行加密和解密的加密技术。它的优点在于加解密速度快,适合处理大量数据。Java中实现对称加密的关键类包括`...
在IT行业中,字符串加密解密是信息安全领域的重要组成部分,它涉及到数据保护、用户隐私和...但需要注意的是,随着技术的发展,加密技术也在不断更新,开发者应当关注最新的安全标准和最佳实践,以保护用户数据的安全。
在Java中,最常用的方式是使用ZIP格式打包文件。我们可以使用`java.util.zip`包中的`ZipOutputStream`和`ZipEntry`来实现。以下是一个简单的示例: 1. 创建`ZipOutputStream`对象,指定输出的ZIP文件路径。 2. 遍历...
这个压缩包文件"Java中常用的加密算法RSA.doc"可能包含更详细的内容,如具体的代码示例、原理解释或应用场景分析。对于学习和理解Java中的RSA加密算法,阅读这份文档会是一个很好的资源。无论你是初学者还是有经验的...
4. **流操作与加密**:在Java中,可以使用BufferedInputStream和BufferedOutputStream来提高读写效率,并结合Cipher类(Java的加密/解密接口)进行数据加密和解密。通过CipherInputStream和CipherOutputStream,可以...
本篇文章将详细介绍Java中两种常见的密码加密算法:MD5(Message-Digest Algorithm 5)和SHA(Secure Hash Algorithm)。我们将通过`CodeUtil.java`这个代码文件来探讨如何在实际开发中实现这两种加密方式。 首先,...
在现代密码技术中,根据密钥类型的不同,可以将其分为两类:对称加密算法(秘密钥匙加密)和非对称加密算法(公开密钥加密)。对称加密算法用来对敏感数据等信息进行加密,常用的算法包括 DES、3DES、AES 等。非对称...
总结,Java jar包的混淆加密是提升代码安全的重要手段,通过ProGuard等混淆工具和加密技术,可以有效降低源代码被逆向工程分析的风险。然而,安全是一个持续的过程,开发者应始终保持警惕,及时更新和优化保护策略。
Java加密技术是软件开发中一个重要的安全领域,用于保护数据的隐私和安全性。本文将深入探讨Java中实现的各种加密算法,以及如何在实际项目中应用它们。 首先,我们需要理解加密的基本概念。加密是一种将可读数据...
下面我们将详细探讨Java加密的相关知识点以及可能在JCT中涉及的技术。 1. **对称加密**:这是最常见的加密方式,使用同一密钥进行加密和解密。常见的对称加密算法有DES(Data Encryption Standard)、3DES(Triple ...