搞Java的攻城狮应该比较欣喜若狂的,不仅Sun公司的JDK提供了庞大的类库,而且还有众多的开源组织和个人不断地丰富着Java的生态系统。没错的,诸如MD5、BASE64、DES、RSA等经典加密解密算法,JDK都有提供专门的API来封装相关操作。程序猿只需要了解算法的思想,以及学习如何使用API即可。当然,针对BASE64算法,JDK仅仅提供了非常标准的实现,在某些场景下无法满足应用需求。在最后一部分,将学习Apache提供的Commons Codec对BASE64算法的扩展实现,以满足实践的需要。
<一>. MD5加密算法:
消息摘要算法第五版(Message Digest Algorithm),是一种单向加密算法,只能加密、无法解密。然而MD5加密算法已经被中国山东大学王小云教授成功破译,但是在安全性要求不高的场景下,MD5加密算法仍然具有应用价值。
1. 创建md5对象:
- MessageDigest md5 = MessageDigest.getInstance("md5");
2. 进行加密操作:
- byte[] cipherData = md5.digest(plainText.getBytes());
3. 将其中的每个字节转成十六进制字符串:byte类型的数据最高位是符号位,通过和0xff进行与操作,转换为int类型的正整数。
- String toHexStr = Integer.toHexString(cipher & 0xff);
4. 如果该正数小于16(长度为1个字符),前面拼接0占位:确保最后生成的是32位字符串。
- builder.append(toHexStr.length() == 1 ? "0" + toHexStr : toHexStr);
5. 加密转换之后的字符串为:c0bb4f54f1d8b14caf6fe1069e5f93ad
6. 完整的MD5算法应用如下所示:
- /**
- * 功能简述: 测试MD5单向加密.
- * @throws Exception
- */
- @Test
- public void test01() throws Exception {
- String plainText = "Hello , world !";
- MessageDigest md5 = MessageDigest.getInstance("md5");
- byte[] cipherData = md5.digest(plainText.getBytes());
- StringBuilder builder = new StringBuilder();
- for(byte cipher : cipherData) {
- String toHexStr = Integer.toHexString(cipher & 0xff);
- builder.append(toHexStr.length() == 1 ? "0" + toHexStr : toHexStr);
- }
- System.out.println(builder.toString());
- //c0bb4f54f1d8b14caf6fe1069e5f93ad
- }
<二>. 使用BASE64进行加密/解密:
使用BASE64算法通常用作对二进制数据进行加密,加密之后的数据不易被肉眼识别。严格来说,经过BASE64加密的数据其实没有安全性可言,因为它的加密解密算法都是公开的,典型的防菜鸟不防程序猿的呀。 经过标准的BASE64算法加密后的数据, 通常包含/、+、=等特殊符号,不适合作为url参数传递,幸运的是Apache的Commons Codec模块提供了对BASE64的进一步封装。 (参见最后一部分的说明)
1. 使用BASE64加密:
- BASE64Encoder encoder = new BASE64Encoder();
- String cipherText = encoder.encode(plainText.getBytes());
2. 使用BASE64解密:
- BASE64Decoder decoder = new BASE64Decoder();
- plainText = new String(decoder.decodeBuffer(cipherText));
3. 完整代码示例:
- /**
- * 功能简述: 使用BASE64进行双向加密/解密.
- * @throws Exception
- */
- @Test
- public void test02() throws Exception {
- BASE64Encoder encoder = new BASE64Encoder();
- BASE64Decoder decoder = new BASE64Decoder();
- String plainText = "Hello , world !";
- String cipherText = encoder.encode(plainText.getBytes());
- System.out.println("cipherText : " + cipherText);
- //cipherText : SGVsbG8gLCB3b3JsZCAh
- System.out.println("plainText : " +
- new String(decoder.decodeBuffer(cipherText)));
- //plainText : Hello , world !
<三>. 使用DES对称加密/解密:
数据加密标准算法(Data Encryption Standard),和BASE64最明显的区别就是有一个工作密钥,该密钥既用于加密、也用于解密,并且要求密钥是一个长度至少大于8位的字符串。使用DES加密、解密的核心是确保工作密钥的安全性。
1. 根据key生成密钥:
- DESKeySpec keySpec = new DESKeySpec(key.getBytes());
- SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("des");
- SecretKey secretKey = keyFactory.generateSecret(keySpec);
2. 加密操作:
- Cipher cipher = Cipher.getInstance("des");
- cipher.init(Cipher.ENCRYPT_MODE, secretKey, new SecureRandom());
- byte[] cipherData = cipher.doFinal(plainText.getBytes());
3. 为了便于观察生成的加密数据,使用BASE64再次加密:
- String cipherText = new BASE64Encoder().encode(cipherData);
生成密文如下:PtRYi3sp7TOR69UrKEIicA==
4. 解密操作:
- cipher.init(Cipher.DECRYPT_MODE, secretKey, new SecureRandom());
- byte[] plainData = cipher.doFinal(cipherData);
- String plainText = new String(plainData);
5. 完整的代码demo:
- /**
- * 功能简述: 使用DES对称加密/解密.
- * @throws Exception
- */
- @Test
- public void test03() throws Exception {
- String plainText = "Hello , world !";
- String key = "12345678"; //要求key至少长度为8个字符
- SecureRandom random = new SecureRandom();
- DESKeySpec keySpec = new DESKeySpec(key.getBytes());
- SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("des");
- SecretKey secretKey = keyFactory.generateSecret(keySpec);
- Cipher cipher = Cipher.getInstance("des");
- cipher.init(Cipher.ENCRYPT_MODE, secretKey, random);
- byte[] cipherData = cipher.doFinal(plainText.getBytes());
- System.out.println("cipherText : " + new BASE64Encoder().encode(cipherData));
- //PtRYi3sp7TOR69UrKEIicA==
- cipher.init(Cipher.DECRYPT_MODE, secretKey, random);
- byte[] plainData = cipher.doFinal(cipherData);
- System.out.println("plainText : " + new String(plainData));
- //Hello , world !
- }
<四>. 使用RSA非对称加密/解密:
RSA算法是非对称加密算法的典型代表,既能加密、又能解密。和对称加密算法比如DES的明显区别在于用于加密、解密的密钥是不同的。使用RSA算法,只要密钥足够长(一般要求1024bit),加密的信息是不能被破解的。用户通过https协议访问服务器时,就是使用非对称加密算法进行数据的加密、解密操作的。
服务器发送数据给客户端时使用私钥(private key)进行加密,并且使用加密之后的数据和私钥生成数字签名(digital signature)并发送给客户端。客户端接收到服务器发送的数据会使用公钥(public key)对数据来进行解密,并且根据加密数据和公钥验证数字签名的有效性,防止加密数据在传输过程中被第三方进行了修改。
客户端发送数据给服务器时使用公钥进行加密,服务器接收到加密数据之后使用私钥进行解密。
1. 创建密钥对KeyPair:
- KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("rsa");
- keyPairGenerator.initialize(1024); //密钥长度推荐为1024位.
- KeyPair keyPair = keyPairGenerator.generateKeyPair();
2. 获取公钥/私钥:
- PublicKey publicKey = keyPair.getPublic();
- PrivateKey privateKey = keyPair.getPrivate();
3. 服务器数据使用私钥加密:
- Cipher cipher = Cipher.getInstance("rsa");
- cipher.init(Cipher.ENCRYPT_MODE, privateKey, new SecureRandom());
- byte[] cipherData = cipher.doFinal(plainText.getBytes());
4. 用户使用公钥解密:
- cipher.init(Cipher.DECRYPT_MODE, publicKey, new SecureRandom());
- byte[] plainData = cipher.doFinal(cipherData);
5. 服务器根据私钥和加密数据生成数字签名:
- Signature signature = Signature.getInstance("MD5withRSA");
- signature.initSign(privateKey);
- signature.update(cipherData);
- byte[] signData = signature.sign();
6. 用户根据公钥、加密数据验证数据是否被修改过:
- signature.initVerify(publicKey);
- signature.update(cipherData);
- boolean status = signature.verify(signData);
7. RSA算法代码demo:
- /**
- * 功能简述: 使用RSA非对称加密/解密.
- * @throws Exception
- */
- @Test
- public void test04() throws Exception {
- String plainText = "Hello , world !";
- KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("rsa");
- keyPairGenerator.initialize(1024);
- KeyPair keyPair = keyPairGenerator.generateKeyPair();
- PublicKey publicKey = keyPair.getPublic();
- PrivateKey privateKey = keyPair.getPrivate();
- Cipher cipher = Cipher.getInstance("rsa");
- SecureRandom random = new SecureRandom();
- cipher.init(Cipher.ENCRYPT_MODE, privateKey, random);
- byte[] cipherData = cipher.doFinal(plainText.getBytes());
- System.out.println("cipherText : " + new BASE64Encoder().encode(cipherData));
- //gDsJxZM98U2GzHUtUTyZ/Ir/NXqRWKUJkl6olrLYCZHY3RnlF3olkWPZ35Dwz9BMRqaTL3oPuyVq
- //sehvHExxj9RyrWpIYnYLBSURB1KVUSLMsd/ONFOD0fnJoGtIk+T/+3yybVL8M+RI+HzbE/jdYa/+
- //yQ+vHwHqXhuzZ/N8iNg=
- cipher.init(Cipher.DECRYPT_MODE, publicKey, random);
- byte[] plainData = cipher.doFinal(cipherData);
- System.out.println("plainText : " + new String(plainData));
- //Hello , world !
- Signature signature = Signature.getInstance("MD5withRSA");
- signature.initSign(privateKey);
- signature.update(cipherData);
- byte[] signData = signature.sign();
- System.out.println("signature : " + new BASE64Encoder().encode(signData));
- //ADfoeKQn6eEHgLF8ETMXan3TfFO03R5u+cQEWtAQ2lRblLZw1DpzTlJJt1RXjU451I84v3297LhR
- //co64p6Sq3kVt84wnRsQw5mucZnY+jRZNdXpcbwh2qsh8287NM2hxWqp4OOCf/+vKKXZ3pbJMNT/4
- ///t9ewo+KYCWKOgvu5QQ=
- signature.initVerify(publicKey);
- signature.update(cipherData);
- boolean status = signature.verify(signData);
- System.out.println("status : " + status);
- //true
- }
Ok,这个blog的内容够长的了,还是在下一篇博客中对加密解密封装成一个工具类吧,然后简单介绍一下Commons Codec对BASE64的扩展支持!
相关推荐
包括了Delphi AES DES MD5 RSA BASE64 2DES 3DES Blowfish CRC32-Static SHA等 常用的加密算法用法实例,比较不错的Delphi加密实例代码了,浅显易懂而且实用的常见加密算法实例,包括字符串和文件加密解密等。
MD5 单向加密 SHA1 单向加密 DES 双向,可解密 加密字符串 ...RSA加密解密及RSA签名和验证 RSA 的密钥产生 产生私钥 和公钥 RSA 方式加密 RSA的解密函数 获取Hash描述表 RSA签名 RSA 签名验证
MD5算法,URLEncoding,Base64编码,AES,DES,DESede,RSA加密解密工具类和使用实例
RAS 能用于数据加密也能用于数字签名的算法。 DES加密,RAS 非对称算法加密,DES RAS 混合加密,公钥私钥算法,数字签名等等示例。
md5,aes,des,des3,rsa,sha,base64加密解密实例,含有所需jar包,注释详细,导入项目直接可用。
C#编写的加密解密小工具,可以对DES、RSA、Base64、SHA、MD5算法,轻松实现数据加密解密需求。...使用方法可浏览博文《C#集成数据加密算法,包含DES、RSA、Base64、SHA、MD5算法,轻松实现数据加密解密需求》
MD2, MD5, SHA-1, HAVAL, Tiger, RIPE-MD160, MD5-MAC, HMAC, XOR-MAC, DES,IDEA, WAKE, 3-WAY, TEA, SAFER, Blowfish,SHARK, GOST, CAST-128, Square,Diamond2, Sapphire, RC2, RC5, RC6, MARS, SEAL, Luby-Rackoff...
可以攻玉1094.1 加固你的系统1094.2 加密组件Bouncy Castle 1114.3 辅助工具Commons Codec 1204.4 小结121第二部分实践篇第5章电子邮件传输算法—Base64 1345.1 Base64算法的由来1345.2 Base64算法的定义1345.3 Base...
自己写的非常强大的一个加密解密工具,有DES、3DES(含ECB和CBC)、RSA、SHA1、SHA256、SHA512、MD5、CRC、base64、异或运算等
可以攻玉109 4.1 加固你的系统109 4.2 加密组件Bouncy Castle 111 4.3 辅助工具Commons Codec 120 4.4 小结121 第二部分实践篇 第5章电子邮件传输算法—Base64 134 5.1 Base64算法的由来134 5.2 Base64算法的定义134...
包含Base64 包含对称加密算法:DES,3DEA,AES,PBE 包含对称加密算法:DH,RAS,ElGamal 包含摘要算法:MD2,MD4,MD5,SHA1,SHA2(SHA-224,SHA-256,SHA-384,SHA-512) 数字签名算法:RSA,DSA,ECDSA 详情请查看:...
Java 加解密技术,详细介绍常用算法:BASE64/MD5/SHA/HMAC/DES/3DES/AES/PBE/RSA/DH,25页内容,有代码
Vive.Crypto(Vive.Crypto对各种常用的加密算法进行封装,有 Base64、对称加密(DES、3DES、AES、SM4)、非对称加密(RSA、SM2)、Hash(MD4、MD5、HMAC、HMAC-MD5、HMAC-SHA1、HMAC-SHA256、HMAC-SHA384、HMAC-SHA...
•Android数据加密之Base64编码算法 •Android数据加密之SHA安全散列算法 DES加密介绍: DES是一种对称加密算法,所谓对称加密算法即:加密和解密使用相同密钥的算法。DES加密算法出自IBM的研究, 后来被...
VC 加密 解密 算法集(130个源码),比如simple、des、cryptlib、rsa、mqueue、cast、blowfish、xtrcrypt、gf256、base32,base64、modexppc、network等常见加密、解密算法,超过130个,大部分都是可以编译通过的,而且...
Dephi加解密源码大全【源码+实例】 2DES、3DES、3DES3、AES、BASE64、BLOWFISH、CRC、DES、MD5、RSA、SHA算法源码。Delphi的数据加密技术演示实例:文本加密解密源代码,随便在文本框中输入一段字符,可显示文本加密...
C#的类库,需要.net framework 4.0及以上,集成多种数据加密算法,包含DES、RSA、Base64、SHA、MD5算法,轻松实现数据加密解密需求
用,没有必要作类似于PGP、RSA 或DES 等复杂的加密算法。本实例介绍如何使用ROT13 算法加密和解密数 C#开发实战1200 例(第II卷) 832 据。实例运行效果如图19.3 所示。 图19.3 使用ROT13算法加密解密数据 关 键技术...
目前这个工具支持对称加密算法(AES、3DES)、非对称加密算法(RSA)、单向散列算法(MD5、SHA1、CRC32)、Base64算法等,后期还会不定时新增别的算法,在使用过程中如有问题欢迎邮件给我,我会及时优化和反馈。
基于Base64,MD5,SHA,Hmac,DES,AES,RSA信息加密的设计与实现。 实现Base64对于文字的加密和解密。 实现MD5对于文字的校验。 实现SHA1,SHA256,SHA384,SHA512对于文字的加密。 实现HmacMD5,HmacSHA1,HmacSHA256,...