首页 > 代码库 > 数字信息摘要常见算法
数字信息摘要常见算法
编解码算法
1. Hex 编码
将二进制数据按16进制转换为字符串,1字节=2个字符,编码后体积为2倍。
2. Base64
由MIME规范定义的编码算法,其将3个字节(24位)编码为4个字符。
字符集包括64个,可表示6二进制位的数据,因此一个字符对应一组6bit的数据。
编码后体积约为4/3倍,针对不足位数用=补齐。
HASH 算法
通常也称散列算法,是一种将任意长度的消息变成固定长度的消息摘要算法,不可逆;
1 MD5
Message Digest Algorithm 5,流行度极高,但目前被发现存在碰撞冲突风险;
任意长度输出为128bit=16字节摘要
2 SHA1
SHA 指Security Hash Algorithm,由美国国家安全局NSA设计的安全散列算法系列;
SHA1 输出长度为160bit=20字节摘要
3 SHA256
继SHA1 出现的算法(属于SHA-2类),安全性较SHA1更高;
SHA256 输出长度为256bit=32字节摘要。
MAC 算法
Message Authentication Code,消息认证码算法,基于HASH算法之上,增加了密钥的支持以提高安全性。
具体算法包括HmacMD5/HmacSHA1/HmacSHA256等,输入包括数据及密钥,输出长度与HASH算法一致。
密钥可以是任意长度的数据。
代码样例
HEX 编解码
/** * Write a byte array as hexadecimal String. */ public static String byteToHexString(byte[] bytes) { return String.valueOf(Hex.encodeHex(bytes)); } /** * Transform an hexadecimal String to a byte array. */ public static byte[] hexStringToByte(String hexString) { try { return Hex.decodeHex(hexString.toCharArray()); } catch (DecoderException e) { throw new RuntimeException(e); } } // Hex 来自 common-codec 扩展包// 字节编码片段 private static final char[] DIGITS_LOWER = {‘0‘, ‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘, ‘6‘, ‘7‘, ‘8‘, ‘9‘, ‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘, ‘f‘}; /** * @param data * a byte[] to convert to Hex characters * @return A char[] containing hexadecimal characters * @since 1.4 */ protected static char[] encodeHex(final byte[] data) { final int l = data.length; final char[] out = new char[l << 1]; // two characters form the hex value. for (int i = 0, j = 0; i < l; i++) { out[j++] = DIGITS_LOWER [(0xF0 & data[i]) >>> 4]; out[j++] = DIGITS_LOWER [0x0F & data[i]]; } return out; }
Base64编解码
/** * Encode a String to base64 * * @param value * The plain String * @return The base64 encoded String */ public static String encodeBASE64(String value) { try { return new String(Base64.encodeBase64(value.getBytes("utf-8"))); } catch (UnsupportedEncodingException ex) { throw new RuntimeException(ex); } } /** * Decode a base64 value * * @param value * The base64 encoded String * @return decoded binary data */ public static byte[] decodeBASE64(String value) { try { return Base64.decodeBase64(value.getBytes("utf-8")); } catch (UnsupportedEncodingException ex) { throw new RuntimeException(ex); } }
MD5 实现(SHA1、SHA256类似)
/** * Build an hexadecimal MD5 hash for a String * * @param value * The String to hash * @return An hexadecimal Hash */ public static String hexMD5(String value) { try { MessageDigest messageDigest = MessageDigest.getInstance("MD5"); messageDigest.reset(); messageDigest.update(value.getBytes("utf-8")); byte[] digest = messageDigest.digest(); return byteToHexString(digest); } catch (Exception ex) { throw new RuntimeException(ex); } }
MAC 计算摘要
static { // add bouncycastle support for md4 etc.. Security.addProvider(new BouncyCastleProvider()); } /** * 初始化密钥 * * @param type * @return */ public static String initHmacKey(MacType type) { try { KeyGenerator generator = KeyGenerator.getInstance(type.name()); SecretKey secretKey = generator.generateKey(); byte[] key = secretKey.getEncoded(); return Codec.byteToHexString(key); } catch (Exception e) { throw new RuntimeException(e); } } /** * 计算HMAC摘要 * * @param data * @param key * @param type * @return */ public static String computeHmac(byte[] data, String key, MacType type) { try { byte[] keydata =http://www.mamicode.com/ Codec.hexStringToByte(key); SecretKey secretKey = new SecretKeySpec(keydata, type.name()); Mac mac = Mac.getInstance(secretKey.getAlgorithm()); mac.init(secretKey); byte[] digest = mac.doFinal(data); return Codec.byteToHexString(digest); } catch (Exception e) { throw new RuntimeException(e); } }
bouncycastle 支持
maven 依赖
<dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.54</version> </dependency>
http://www.bouncycastle.org/
数字信息摘要常见算法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。