首先我们要明白 Codec 是什么含义。它是 Coder + decoder = Codec,也就是编码器解码器。即是编码器,也是解码器。

官网地址:http://commons.apache.org/proper/commons-codec/

Apache Commons Codec (TM) software provides implementations of common encoders and decoders such as Base64, Hex, Phonetic and URLs.

主要提供的是 Base64, Hex, Phonetic and URLs 等的编码和解密。

Impetus

Codec was formed as an attempt to focus development effort on one definitive implementation of the Base64 encoder. At the time of Codec's proposal, there were approximately 34 different Java classes that dealt with Base64 encoding spread over the Foundation's CVS repository. Developers in the Jakarta Tomcat project had implemented an original version of the Base64 codec which had been copied by the Commons HttpClient and Apache XML project's XML-RPC subproject. After almost one year, the two forked versions of Base64 had significantly diverged from one another. XML-RPC had applied numerous fixes and patches which were not applied to the Commons HttpClient Base64. Different subprojects had differing implementations at various levels of compliance with the RFC 2045.

Out of that confusing duplication of effort sprang this simple attempt to encourage code reuse among various projects. While this package contains a abstract framework for the creation of encoders and decoders, Codec itself is primarily focused on providing functional utilities for working with common encodings.

建立项目的原因是:促进 Base64 等编码算法的标准化,统一化。因为 Base64 有很多不同的实现,互不兼容

其实我们使用 Apache Commons Codec,主要原因并不是使用它的 编码解码的功能,一般我们是看中它实现了很完整的“消息摘要”算法,也称hash算法。

Hex,Base64等待编码解码功能只是辅助于“消息摘要”算法而已。

消息摘要算法的实现主要是其中的:DigestUtils

static MessageDigest     getDigest(String algorithm)  Returns a MessageDigest for the given algorithm.
static MessageDigest getMd2Digest()          Returns an MD2 MessageDigest.
static MessageDigest getMd5Digest()          Returns an MD5 MessageDigest.
static MessageDigest getSha1Digest()         Returns an SHA-1 digest.
static MessageDigest getSha256Digest()        Returns an SHA-256 digest.
static MessageDigest getSha384Digest()        Returns an SHA-384 digest.
static MessageDigest getSha512Digest()        Returns an SHA-512 digest.
static byte[] md2(byte[] data)      Calculates the MD2 digest and returns the value as a 16 element byte[].
static byte[] md2(InputStream data)   Calculates the MD2 digest and returns the value as a 16 element byte[].
static byte[] md2(String data)      Calculates the MD2 digest and returns the value as a 16 element byte[].
static String md2Hex(byte[] data)    Calculates the MD2 digest and returns the value as a 32 character hex string.
static String md2Hex(InputStream data) Calculates the MD2 digest and returns the value as a 32 character hex string.
static String md2Hex(String data)    Calculates the MD2 digest and returns the value as a 32 character hex string.
static byte[] md5(byte[] data)      Calculates the MD5 digest and returns the value as a 16 element byte[].
static byte[] md5(InputStream data)   Calculates the MD5 digest and returns the value as a 16 element byte[].
static byte[] md5(String data)      Calculates the MD5 digest and returns the value as a 16 element byte[].
static String md5Hex(byte[] data)    Calculates the MD5 digest and returns the value as a 32 character hex string.
static String md5Hex(InputStream data) Calculates the MD5 digest and returns the value as a 32 character hex string.
static String md5Hex(String data) Calculates the MD5 digest and returns the value as a 32 character hex string.
static byte[] sha1(byte[] data)     Calculates the SHA-1 digest and returns the value as a byte[].

static byte[] sha1(InputStream data)  Calculates the SHA-1 digest and returns the value as a byte[].
static byte[] sha1(String data)     Calculates the SHA-1 digest and returns the value as a byte[].
static String sha1Hex(byte[] data)   Calculates the SHA-1 digest and returns the value as a hex string.
static String sha1Hex(InputStream data)  Calculates the SHA-1 digest and returns the value as a hex string.
static String sha1Hex(String data)    Calculates the SHA-1 digest and returns the value as a hex string.
static byte[] sha256(byte[] data)     Calculates the SHA-256 digest and returns the value as a byte[].
static byte[] sha256(InputStream data)  Calculates the SHA-256 digest and returns the value as a byte[].
static byte[] sha256(String data)     Calculates the SHA-256 digest and returns the value as a byte[].
static String sha256Hex(byte[] data)   Calculates the SHA-256 digest and returns the value as a hex string.
static String sha256Hex(InputStream data)  Calculates the SHA-256 digest and returns the value as a hex string.
static String sha256Hex(String data)     Calculates the SHA-256 digest and returns the value as a hex string.
static byte[] sha384(byte[] data)     Calculates the SHA-384 digest and returns the value as a byte[].
static byte[] sha384(InputStream data)  Calculates the SHA-384 digest and returns the value as a byte[].
static byte[] sha384(String data)     Calculates the SHA-384 digest and returns the value as a byte[].
static String sha384Hex(byte[] data)   Calculates the SHA-384 digest and returns the value as a hex string.
static String sha384Hex(InputStream data)  Calculates the SHA-384 digest and returns the value as a hex string.
static String sha384Hex(String data)     Calculates the SHA-384 digest and returns the value as a hex string.
static byte[] sha512(byte[] data)       Calculates the SHA-512 digest and returns the value as a byte[].
static byte[] sha512(InputStream data)    Calculates the SHA-512 digest and returns the value as a byte[].
static byte[] sha512(String data)     Calculates the SHA-512 digest and returns the value as a byte[].
static String sha512Hex(byte[] data)   Calculates the SHA-512 digest and returns the value as a hex string.
static String sha512Hex(InputStream data)  Calculates the SHA-512 digest and returns the value as a hex string.
static String sha512Hex(String data)   Calculates the SHA-512 digest and returns the value as a hex string. static MessageDigest updateDigest(MessageDigest messageDigest, byte[] valueToDigest) Updates the given MessageDigest.
static MessageDigest updateDigest(MessageDigest digest, InputStream data) Reads through an InputStream and updates the digest for the data
static MessageDigest updateDigest(MessageDigest messageDigest, String valueToDigest) Updates the given MessageDigest.

针对上面怎么多和“摘要算法”相关的函数,其实他们的存在是为了方便使用。

我们看到这些函数的参数分为了三种:byte[], InputStream, String,为了方便使用。消息摘要算法分为了 MD 系列和 SHA系列。

其实区分他们的最重要的方法,是看他们的返回值类型:

1)如果返回类型为 byte[],那么他们是 加密函数,或者说Hash. 也就是 Calculates the digest,计算摘要的功能。

2)如果返回类型是 String, 那么他们是 既包含了加密的过程,也就是计算摘要的过程,同时还将计算的结果转换成16进制编码的String,以利于存储结果和比较结果。一步到位。

3)返回MessageDigest的函数有两类,他们都是为了实现:加盐的多次迭代的“消息摘要”算法。下面看一个例子:

import java.security.MessageDigest;

import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.codec.binary.Hex;
import org.apache.shiro.crypto.hash.SimpleHash;
import org.junit.Test; public class CodecTest {
@Test
public void test(){
MessageDigest digest = DigestUtils.getSha256Digest();
digest.update("salt".getBytes());
byte[] rs = digest.digest("just a test".getBytes());
int iterations = 10 - 1;
for (int i = 0; i < iterations; i++) {
digest.reset();
rs = digest.digest(rs);
} System.out.println(Hex.encodeHex(rs));
System.out.println(new SimpleHash("sha-256", "just a test", "salt", 10).toString()); MessageDigest digest2 = DigestUtils.getSha256Digest();
DigestUtils.updateDigest(digest2, "salt");
byte[] rs2 = digest2.digest("just a test".getBytes());
for (int i = 0; i < 9; i++) {
digest2.reset();
rs2 = digest2.digest(rs2);
}
System.out.println(Hex.encodeHex(rs2));
}
}

输出结果:

8cfa3262a7dd6af87f9c60fabd56eafd2d3861164b86b0afa6c103fed63ead49
8cfa3262a7dd6af87f9c60fabd56eafd2d3861164b86b0afa6c103fed63ead49
8cfa3262a7dd6af87f9c60fabd56eafd2d3861164b86b0afa6c103fed63ead49

上面使用了三种方法来实现:对字符串"just a test" 利于算法 "sha-256",盐为"salt",迭代次数为10,的算法。也演示了 Apache Commons Codec 中DigestUtils 和 Hex 的用法。

关于为什么要进行 Hex 16进制编码及相关问题,参见 加密解密基础问题:字节数组和字符串的相互转换

Hex 类在 16进制字符串和byte[]以及原始String的转换:

    @Test
public void testHex() throws DecoderException{
String str = "hello, 世界。";
char[] c = Hex.encodeHex(str.getBytes());
String hexStr = new String(c);
System.out.println(hexStr); hexStr = Hex.encodeHexString(str.getBytes());
System.out.println(hexStr); String originalStr = new String(Hex.decodeHex(hexStr.toCharArray()));
System.out.println(originalStr);
}

结果:

68656c6c6f2c20e4b896e7958ce38082
68656c6c6f2c20e4b896e7958ce38082
hello, 世界。

Apache Commons Codec 与消息摘要算法(hash算法)的更多相关文章

  1. Apache Commons Codec 编码解码

    Apache Commons Codec jar包官方下载地址 下载解压后把commons-codec-1.9.jar 放到lib中 关于SHA1算法的介绍可以参看Wiki:http://en.wik ...

  2. Java之加密(信息摘要)工具类(依赖:java.security.MessageDigest或org.apache.commons.codec.digest.DigestUtils)

    依赖于java.security.MessageDigest,支持MD5,SHA-1,SHA-256 import java.security.MessageDigest; import java.s ...

  3. ANDROID : java.lang.NoSuchMethodError: org.apache.commons.codec.binary.Base64.encodeBase64String in android

    Andriod系统包中现在已经自带加密函数,如果用apache的codec包则会报以上错误,用android.util.Base64以下方法代替org.apache.commons.codec.bin ...

  4. Handler processing failed; nested exception is java.lang.NoSuchMethodError: org.apache.commons.codec.digest.DigestUtils.sha1Hex(Ljava/lang/String;)Ljava/lang/String;

    异常:Handler processing failed; nested exception is java.lang.NoSuchMethodError: org.apache.commons.co ...

  5. Apache Commons Codec的Base64加解密库

    下载地址:http://commons.apache.org/proper/commons-codec/download_codec.cgi import org.apache.commons.cod ...

  6. java 调用apache.commons.codec的包简单实现MD5加密

    转自:https://blog.csdn.net/mmd1234520/article/details/70210002/ import java.security.MessageDigest; im ...

  7. md5加密(3)---org.apache.commons.codec.digest.DigestUtils.md5Hex(input)

    import org.apache.commons.codec.digest.DigestUtils;String sig = DigestUtils.md5Hex("str")

  8. 【报错】引入jar包import org.apache.commons.codec.digest.DigestUtils 报错,jar不存在

    import org.apache.commons.codec.digest.DigestUtils报错.缺少jar maven引用jar包地址: <!-- https://mvnreposit ...

  9. import org.apache.commons.codec.binary.Base64;

    import org.apache.commons.codec.binary.Base64;

随机推荐

  1. 反射调用发生错误信息 LoadNeither

    错误信息: Service cannot be started. System.Reflection.TargetInvocationException: Exception has been thr ...

  2. 在 if 条件句中使用向量

    上述例子的函数中,都只输入了单一值.如果我们提供一个向量,那么这个函数将产生警告,这是因为 if 语句不能与多值向量共存.check_ _positive(c(1,-1,0))## Warning i ...

  3. IntelliJ IDEA自定义类和方法注解模板

    现在Java开发主流工具应该是Intelij Idea 方便快捷. 本文将主要介绍如何用Intelij Idea配置类及方法的注释模板提高代码注释效率 1. 配置类注解模板 找到配置页面 File - ...

  4. CPU上下文切换详解

    CPU上下文切换详解 原文地址,译文地址,译者: 董明鑫,校对:郑旭东 上下文切换(有时也称做进程切换或任务切换)是指CPU 从一个进程或线程切换到另一个进程或线程.进程(有时候也称做任务)是指一个程 ...

  5. RoR unobtrusive scripting adapter--UJS(一些Javascript的语法糖)

    Learn how the new Rails UJS library works and compares with the old version of jquery_ujs that it re ...

  6. bzoj1054: [HAOI2008]移动玩具 状压+爆搜即可

    题意:在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动时只能将玩具向上下左右四个方向移动,并且移动的位置不能有玩具,请你用最少的移动次数将初的玩具状态 ...

  7. IOS-多线程(NSOperation)

    一.基础用法 // // ViewController.m // IOS_0120_NSOperation // // Created by ma c on 16/1/20. // Copyright ...

  8. Cortex_M3——存储器系统学习笔记

    看完一个章节完全不做学习笔记总结并进行知识转换,看了就会忘记啊~无奈脸. 一.CORTEX_M3总线一览 二.异常 编号为1-15的对应系统异常,大于等于16的则全是外部中断. 系统异常清单如下所示: ...

  9. Bayes' theorem (贝叶斯定理)

    前言 AI时代的到来一下子让人感觉到数学知识有些捉襟见肘,为了不被这个时代淘汰,我们需要不断的学习再学习.其中最常见的就是贝叶斯定理,这个定理最早由托马斯·贝叶斯提出. 贝叶斯方法的诞生源于他生前为解 ...

  10. Monkey测试练习

    1.下载Android SDK 2.打开SDK Manager.exe自动下载 3.配置环境变量 将platform-tools的路径(如: C:\001myWorkspace\eclipse(MAV ...