信息摘要算法 MessageDigestUtil
- package com.xgh.message.digest.test;
- import java.math.BigInteger;
- import java.security.MessageDigest;
- import java.security.SecureRandom;
- import javax.crypto.Cipher;
- import javax.crypto.KeyGenerator;
- import javax.crypto.Mac;
- import javax.crypto.SecretKey;
- import javax.crypto.spec.SecretKeySpec;
- import junit.framework.TestCase;
- import sun.misc.BASE64Decoder;
- import sun.misc.BASE64Encoder;
- /***
- * 单向加密方法
- *
- * MessageDigest 类提供【信息摘要算法】的功能,
- * 如HMAC、MD2、MD4、MD5、SHA-1、SHA-256、RIPEMD128、RIPEMD160。
- * 信息摘要是安全的单向哈希函数,它接收任意大小的数据,并输出固定长度的哈希值。
- * @author xgh
- *
- *==================================================
- *速度排名:MD4 > MD5 > RIPEMD-128 > SHA-1 > REPEMD-160
- *按照《应用密码学手册》提供的表格数据为:
- *MD4 长度 128 相对速度 1
- *MD5 长度 128 相对速度 0.68
- *REPEMD-128 长度 128 相对速度 0.39
- *SHA-1 长度 160 相对速度 0.29
- *REPEMD-160 长度 160 相对速度 0.24
- *==================================================
- *结论:
- *又要安全又要速度,选择MD5
- *追求安全,不在意速度,相信传说,不相信阴谋论,选择SHA系列
- *追求速度,安全次之,可以选择MD4。
- *==================================================
- */
- public class MessageDigestUtil extends TestCase{
- /***
- * MD5摘要生成
- * MD5 -- message-digest algorithm 5 (信息-摘要算法)缩写
- * md5摘要算法算返回的数据长度为128个位,即16个字节。
- * @throws Exception
- */
- public void testEncryptMD5() throws Exception {
- String message ="Hell,在我心中,也许";
- MessageDigest md5 = MessageDigest.getInstance("MD5");
- md5.update(message.getBytes());
- //md5摘要算法算返回的数据长度为128个位,即16个字节。
- byte[] digestbytes = md5.digest();
- System.out.println("md5摘要原数据:"+message);
- System.out.println("信息摘要长度:"+(digestbytes.length*8)+"位");
- System.out.println("摘要BigInteger结果:"+new BigInteger(digestbytes));
- System.out.println("摘要Base64结果:"+new BASE64Encoder().encode(digestbytes));
- System.out.println("--------------md5 end-----------------------");
- }
- /***
- * SHA摘要生成
- * SHA(Secure Hash Algorithm,安全散列算法),
- * sha摘要算法算返回的数据长度为160个位,即20个字节。
- * @throws Exception
- */
- public void testEncryptSHA() throws Exception {
- String message ="Hell,在我心中,也许";
- MessageDigest md5 = MessageDigest.getInstance("SHA");
- md5.update(message.getBytes());
- //md5摘要算法算返回的数据长度为128个位,即16个字节。
- byte[] digestbytes = md5.digest();
- System.out.println("sha摘要原数据:"+message);
- System.out.println("信息摘要长度:"+(digestbytes.length*8)+"位");
- System.out.println("摘要BigInteger结果:"+new BigInteger(digestbytes));
- System.out.println("摘要Base64结果:"+new BASE64Encoder().encode(digestbytes));
- System.out.println("--------------sha end-----------------------");
- }
- /***
- * SHA1摘要生成
- * SHA(Secure Hash Algorithm,安全散列算法),
- * sha1摘要算法算返回的数据长度为160个位,即20个字节。
- * @throws Exception
- */
- public void testEncryptSHA1() throws Exception {
- String message ="Hell,在我心中,也许";
- MessageDigest md5 = MessageDigest.getInstance("SHA-1");
- md5.update(message.getBytes());
- //md5摘要算法算返回的数据长度为128个位,即16个字节。
- byte[] digestbytes = md5.digest();
- System.out.println("sha1摘要原数据:"+message);
- System.out.println("信息摘要长度:"+(digestbytes.length*8)+"位");
- System.out.println("摘要BigInteger结果:"+new BigInteger(digestbytes));
- System.out.println("摘要Base64结果:"+new BASE64Encoder().encode(digestbytes));
- System.out.println("--------------sha1 end-----------------------");
- }
- /***
- * SHA256摘要生成
- * SHA(Secure Hash Algorithm,安全散列算法),
- * sha256摘要算法算返回的数据长度为160个位,即20个字节。
- * @throws Exception
- */
- public void testEncryptSHA256() throws Exception {
- String message ="Hell,在我心中,也许";
- MessageDigest md5 = MessageDigest.getInstance("SHA-256");
- md5.update(message.getBytes());
- //md5摘要算法算返回的数据长度为128个位,即16个字节。
- byte[] digestbytes = md5.digest();
- System.out.println("sha265摘要原数据:"+message);
- System.out.println("信息摘要长度:"+(digestbytes.length*8)+"位");
- System.out.println("摘要BigInteger结果:"+new BigInteger(digestbytes));
- System.out.println("摘要Base64结果:"+new BASE64Encoder().encode(digestbytes));
- System.out.println("--------------sha256 end-----------------------");
- }
- /***
- * SHA512摘要生成
- * SHA(Secure Hash Algorithm,安全散列算法),
- * sha512摘要算法算返回的数据长度为160个位,即20个字节。
- * @throws Exception
- */
- public void testEncryptSHA512() throws Exception {
- String message ="Hell,在我心中,也许";
- MessageDigest md5 = MessageDigest.getInstance("SHA-512");
- md5.update(message.getBytes());
- //md5摘要算法算返回的数据长度为128个位,即16个字节。
- byte[] digestbytes = md5.digest();
- System.out.println("sha512摘要原数据:"+message);
- System.out.println("信息摘要长度:"+(digestbytes.length*8)+"位");
- System.out.println("摘要BigInteger结果:"+new BigInteger(digestbytes));
- System.out.println("摘要Base64结果:"+new BASE64Encoder().encode(digestbytes));
- System.out.println("--------------sha512 end-----------------------");
- }
- /***
- * Md5摘要后,将字节摘要字节组转16进制数组
- * @param input
- * @return
- */
- public String testMD5ToHex() throws Exception{
- String data = "sfs有桂林地村要地wecllo";
- // 获得MD5摘要算法的 MessageDigest 对象
- MessageDigest mdInst = MessageDigest.getInstance("MD5");
- // 使用指定的字节更新摘要
- mdInst.update(data.getBytes());
- // 获得摘要密文
- byte[] md = mdInst.digest();
- // 把密文转换成十六进制的字符串形式
- StringBuffer hexString = new StringBuffer();
- // 字节数组转换为 十六进制 数
- for (int i = 0; i < md.length; i++) {
- String shaHex = Integer.toHexString(md[i] & 0xFF);
- if (shaHex.length() < 2) {//不足2位16进制位,则补0,一个字节是2位16进制位
- hexString.append(0);
- }
- hexString.append(shaHex);
- }
- return hexString.toString();
- }
- /***
- * SHA-1摘要后,将字节摘要字节组转16进制数组
- * @param input
- * @return
- */
- public String testSHA1ToHex() throws Exception{
- String data = "sfs有桂林地村要地wecllo";
- // 获得MD5摘要算法的 MessageDigest 对象
- MessageDigest mdInst = MessageDigest.getInstance("SHA-1");
- // 使用指定的字节更新摘要
- mdInst.update(data.getBytes());
- // 获得摘要密文
- byte[] md = mdInst.digest();
- // 把密文转换成十六进制的字符串形式
- StringBuffer hexString = new StringBuffer();
- // 字节数组转换为 十六进制 数
- for (int i = 0; i < md.length; i++) {
- int r = md[i] & 0xf;
- if (r <= 0xf) {//不足2位16进制位,则补0,一个字节是2位16进制位
- hexString.append(0);
- }
- hexString.append(Integer.toHexString(r));
- }
- return hexString.toString();
- }
- /***
- * HMAC摘要生成 单向加密算法
- * HMAC摘要算法算返回的数据长度为128个位,即16个字节。
- * HMAC(Hash Message Authentication Code,散列消息鉴别码,基于密钥的Hash算法的认证协议。
- * 消息鉴别码实现鉴别的原理是,用公开函数和密钥产生一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。
- * 使用一个密钥生成一个固定大小的小数据块,即MAC,并将其加入到消息中,然后传输。接收方利用与发送方共享的密钥进行鉴别认证等。
- * @throws Exception
- * HMAC算法可选以下多种算法 :
- * HmacMD5
- * HmacSHA1
- * HmacSHA256
- * HmacSHA384
- * HmacSHA512
- *
- */
- public void testEncryptHMAC() throws Exception {
- String message ="Hell,在我心中,也许";
- KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacSHA1");
- SecretKey secretKey1 = keyGenerator.generateKey();
- //Mac密钥
- String key = new BASE64Encoder().encode((secretKey1.getEncoded()));
- System.out.println("Mac密钥:"+key);
- SecretKey secretKey2 = new SecretKeySpec(new BASE64Decoder().decodeBuffer(key), "HmacSHA1");
- //返回此密钥编码格式的名称。
- //System.out.println(secretKey1.getFormat());
- Mac mac = Mac.getInstance(secretKey2.getAlgorithm());
- mac.init(secretKey2);
- byte[] digestbytes = mac.doFinal(message.getBytes());
- System.out.println("HMAC摘要原数据:"+message);
- System.out.println("信息摘要长度:"+(digestbytes.length*8)+"位");
- System.out.println("摘要BigInteger结果:"+new BigInteger(digestbytes));
- System.out.println("摘要Base64结果:"+new BASE64Encoder().encode(digestbytes));
- System.out.println("--------------HMAC end-----------------------");
- }
- /***
- * AES 双向加密算法
- * @param content 待加密内容
- * @param password 加密密钥
- * @return
- */
- public byte[] testEncryptAES() throws Exception{
- String content = "Hello,明天天气不错";
- String password = "123456";
- KeyGenerator kgen = KeyGenerator.getInstance("AES");
- kgen.init(128, new SecureRandom(password.getBytes()));
- SecretKey secretKey = kgen.generateKey();
- byte[] enCodeFormat = secretKey.getEncoded();
- SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
- Cipher cipher = Cipher.getInstance("AES");// 创建密码器
- byte[] byteContent = content.getBytes("utf-8");
- cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化
- byte[] result = cipher.doFinal(byteContent);
- System.out.println("AES加密后的Base64结果:");
- System.out.println(new BASE64Encoder().encode(result));
- return result; // 加密
- }
- /***
- * AES 双向加密算法
- * @param content 待解密内容
- * @param password 解密密钥
- * @return
- */
- public byte[] testDecryptAES() throws Exception{
- String content = "2M8d6HQ0qtXqSSuL83ILs348ls6C8JlZnfu0UFgCkOw=";
- String password = "123456";
- byte[] contentbyte = new BASE64Decoder().decodeBuffer(content);
- KeyGenerator kgen = KeyGenerator.getInstance("AES");
- kgen.init(128, new SecureRandom(password.getBytes()));
- SecretKey secretKey = kgen.generateKey();
- byte[] enCodeFormat = secretKey.getEncoded();
- SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
- Cipher cipher = Cipher.getInstance("AES");// 创建密码器
- cipher.init(Cipher.DECRYPT_MODE, key);// 初始化
- byte[] result = cipher.doFinal(contentbyte);
- System.out.println("解密结果:");
- System.out.println(new String(result,"UTF-8"));
- return result; // 加密
- }
- }
package com.xgh.message.digest.test; import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.SecureRandom; import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec; import junit.framework.TestCase;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder; /***
- 单向加密方法
- MessageDigest 类提供【信息摘要算法】的功能,
- 如HMAC、MD2、MD4、MD5、SHA-1、SHA-256、RIPEMD128、RIPEMD160。
- 信息摘要是安全的单向哈希函数,它接收任意大小的数据,并输出固定长度的哈希值。
- @author xgh
*速度排名:MD4 > MD5 > RIPEMD-128 > SHA-1 > REPEMD-160
*按照《应用密码学手册》提供的表格数据为:
*MD4 长度 128 相对速度 1
*MD5 长度 128 相对速度 0.68
*REPEMD-128 长度 128 相对速度 0.39
*SHA-1 长度 160 相对速度 0.29
*REPEMD-160 长度 160 相对速度 0.24
*==================================================
*结论:
*又要安全又要速度,选择MD5
*追求安全,不在意速度,相信传说,不相信阴谋论,选择SHA系列
*追求速度,安全次之,可以选择MD4。
*==================================================
*/
public class MessageDigestUtil extends TestCase{
/***
* MD5摘要生成
* MD5 -- message-digest algorithm 5 (信息-摘要算法)缩写
* md5摘要算法算返回的数据长度为128个位,即16个字节。
* @throws Exception
*/
public void testEncryptMD5() throws Exception {
String message ="Hell,在我心中,也许";
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(message.getBytes());
//md5摘要算法算返回的数据长度为128个位,即16个字节。
byte[] digestbytes = md5.digest();
System.out.println("md5摘要原数据:"+message);
System.out.println("信息摘要长度:"+(digestbytes.length*8)+"位");
System.out.println("摘要BigInteger结果:"+new BigInteger(digestbytes));
System.out.println("摘要Base64结果:"+new BASE64Encoder().encode(digestbytes));
System.out.println("--------------md5 end-----------------------");
}
/***
* SHA摘要生成
* SHA(Secure Hash Algorithm,安全散列算法),
* sha摘要算法算返回的数据长度为160个位,即20个字节。
* @throws Exception
*/
public void testEncryptSHA() throws Exception {
String message ="Hell,在我心中,也许";
MessageDigest md5 = MessageDigest.getInstance("SHA");
md5.update(message.getBytes());
//md5摘要算法算返回的数据长度为128个位,即16个字节。
byte[] digestbytes = md5.digest();
System.out.println("sha摘要原数据:"+message);
System.out.println("信息摘要长度:"+(digestbytes.length*8)+"位");
System.out.println("摘要BigInteger结果:"+new BigInteger(digestbytes));
System.out.println("摘要Base64结果:"+new BASE64Encoder().encode(digestbytes));
System.out.println("--------------sha end-----------------------");
}
/***
* SHA1摘要生成
* SHA(Secure Hash Algorithm,安全散列算法),
* sha1摘要算法算返回的数据长度为160个位,即20个字节。
* @throws Exception
*/
public void testEncryptSHA1() throws Exception {
String message ="Hell,在我心中,也许";
MessageDigest md5 = MessageDigest.getInstance("SHA-1");
md5.update(message.getBytes());
//md5摘要算法算返回的数据长度为128个位,即16个字节。
byte[] digestbytes = md5.digest();
System.out.println("sha1摘要原数据:"+message);
System.out.println("信息摘要长度:"+(digestbytes.length*8)+"位");
System.out.println("摘要BigInteger结果:"+new BigInteger(digestbytes));
System.out.println("摘要Base64结果:"+new BASE64Encoder().encode(digestbytes));
System.out.println("--------------sha1 end-----------------------");
}
/***
* SHA256摘要生成
* SHA(Secure Hash Algorithm,安全散列算法),
* sha256摘要算法算返回的数据长度为160个位,即20个字节。
* @throws Exception
*/
public void testEncryptSHA256() throws Exception {
String message ="Hell,在我心中,也许";
MessageDigest md5 = MessageDigest.getInstance("SHA-256");
md5.update(message.getBytes());
//md5摘要算法算返回的数据长度为128个位,即16个字节。
byte[] digestbytes = md5.digest();
System.out.println("sha265摘要原数据:"+message);
System.out.println("信息摘要长度:"+(digestbytes.length*8)+"位");
System.out.println("摘要BigInteger结果:"+new BigInteger(digestbytes));
System.out.println("摘要Base64结果:"+new BASE64Encoder().encode(digestbytes));
System.out.println("--------------sha256 end-----------------------");
}
/***
* SHA512摘要生成
* SHA(Secure Hash Algorithm,安全散列算法),
* sha512摘要算法算返回的数据长度为160个位,即20个字节。
* @throws Exception
*/
public void testEncryptSHA512() throws Exception {
String message ="Hell,在我心中,也许";
MessageDigest md5 = MessageDigest.getInstance("SHA-512");
md5.update(message.getBytes());
//md5摘要算法算返回的数据长度为128个位,即16个字节。
byte[] digestbytes = md5.digest();
System.out.println("sha512摘要原数据:"+message);
System.out.println("信息摘要长度:"+(digestbytes.length*8)+"位");
System.out.println("摘要BigInteger结果:"+new BigInteger(digestbytes));
System.out.println("摘要Base64结果:"+new BASE64Encoder().encode(digestbytes));
System.out.println("--------------sha512 end-----------------------");
}
/***
* Md5摘要后,将字节摘要字节组转16进制数组
* @param input
* @return
*/
public String testMD5ToHex() throws Exception{
String data = "sfs有桂林地村要地wecllo";
// 获得MD5摘要算法的 MessageDigest 对象
MessageDigest mdInst = MessageDigest.getInstance("MD5");
// 使用指定的字节更新摘要
mdInst.update(data.getBytes());
// 获得摘要密文
byte[] md = mdInst.digest();
// 把密文转换成十六进制的字符串形式
StringBuffer hexString = new StringBuffer();
// 字节数组转换为 十六进制 数
for (int i = 0; i < md.length; i++) {
String shaHex = Integer.toHexString(md[i] & 0xFF);
if (shaHex.length() < 2) {//不足2位16进制位,则补0,一个字节是2位16进制位
hexString.append(0);
}
hexString.append(shaHex);
}
return hexString.toString();
}
/***
* SHA-1摘要后,将字节摘要字节组转16进制数组
* @param input
* @return
*/
public String testSHA1ToHex() throws Exception{
String data = "sfs有桂林地村要地wecllo";
// 获得MD5摘要算法的 MessageDigest 对象
MessageDigest mdInst = MessageDigest.getInstance("SHA-1");
// 使用指定的字节更新摘要
mdInst.update(data.getBytes());
// 获得摘要密文
byte[] md = mdInst.digest();
// 把密文转换成十六进制的字符串形式
StringBuffer hexString = new StringBuffer();
// 字节数组转换为 十六进制 数
for (int i = 0; i < md.length; i++) {
int r = md[i] & 0xf;
if (r <= 0xf) {//不足2位16进制位,则补0,一个字节是2位16进制位
hexString.append(0);
}
hexString.append(Integer.toHexString(r));
}
return hexString.toString();
}
/***
* HMAC摘要生成 单向加密算法
* HMAC摘要算法算返回的数据长度为128个位,即16个字节。
* HMAC(Hash Message Authentication Code,散列消息鉴别码,基于密钥的Hash算法的认证协议。
* 消息鉴别码实现鉴别的原理是,用公开函数和密钥产生一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。
* 使用一个密钥生成一个固定大小的小数据块,即MAC,并将其加入到消息中,然后传输。接收方利用与发送方共享的密钥进行鉴别认证等。
* @throws Exception
* HMAC算法可选以下多种算法 :
* HmacMD5
* HmacSHA1
* HmacSHA256
* HmacSHA384
* HmacSHA512
*
*/
public void testEncryptHMAC() throws Exception {
String message ="Hell,在我心中,也许";
KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacSHA1");
SecretKey secretKey1 = keyGenerator.generateKey();
//Mac密钥
String key = new BASE64Encoder().encode((secretKey1.getEncoded()));
System.out.println("Mac密钥:"+key);
SecretKey secretKey2 = new SecretKeySpec(new BASE64Decoder().decodeBuffer(key), "HmacSHA1");
//返回此密钥编码格式的名称。
//System.out.println(secretKey1.getFormat());
Mac mac = Mac.getInstance(secretKey2.getAlgorithm());
mac.init(secretKey2);
byte[] digestbytes = mac.doFinal(message.getBytes());
System.out.println("HMAC摘要原数据:"+message);
System.out.println("信息摘要长度:"+(digestbytes.length*8)+"位");
System.out.println("摘要BigInteger结果:"+new BigInteger(digestbytes));
System.out.println("摘要Base64结果:"+new BASE64Encoder().encode(digestbytes));
System.out.println("--------------HMAC end-----------------------");
}
/***
* AES 双向加密算法
* @param content 待加密内容
* @param password 加密密钥
* @return
*/
public byte[] testEncryptAES() throws Exception{
String content = "Hello,明天天气不错";
String password = "123456";
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128, new SecureRandom(password.getBytes()));
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
Cipher cipher = Cipher.getInstance("AES");// 创建密码器
byte[] byteContent = content.getBytes("utf-8");
cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化
byte[] result = cipher.doFinal(byteContent);
System.out.println("AES加密后的Base64结果:");
System.out.println(new BASE64Encoder().encode(result));
return result; // 加密
}
/***
* AES 双向加密算法
* @param content 待解密内容
* @param password 解密密钥
* @return
*/
public byte[] testDecryptAES() throws Exception{
String content = "2M8d6HQ0qtXqSSuL83ILs348ls6C8JlZnfu0UFgCkOw=";
String password = "123456";
byte[] contentbyte = new BASE64Decoder().decodeBuffer(content);
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128, new SecureRandom(password.getBytes()));
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
Cipher cipher = Cipher.getInstance("AES");// 创建密码器
cipher.init(Cipher.DECRYPT_MODE, key);// 初始化
byte[] result = cipher.doFinal(contentbyte);
System.out.println("解密结果:");
System.out.println(new String(result,"UTF-8"));
return result; // 加密
}
}
信息摘要算法 MessageDigestUtil的更多相关文章
- MD5加密算法(信息摘要算法)、Base64算法
1 什么是MD5 信息摘要算法,可以将字符进行加密,每个加密对象在进行加密后都是等长的 应用场景:将用户密码经过MD5加密后再存储到数据库中,这样即使是超级管理员也没有能力知道用户的具体密码是多少:因 ...
- MD5( 信息摘要算法)的概念原理及python代码的实现
简述: message-digest algorithm 5(信息-摘要算法).经常说的“MD5加密”,就是它→信息-摘要算法. md5,其实就是一种算法.可以将一个字符串,或文件,或压缩包,执行md ...
- 信息摘要算法之一:MD5算法解析及实现
MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致.是计算机广泛使用的杂凑算法之一(又译摘要算法.哈希算法),主流编程语言普遍已有MD5实现. ...
- 信息摘要算法之五:HMAC算法分析与实现
MAC(Message Authentication Code,消息认证码算法)是含有密钥散列函数算法,兼容了MD和SHA算法的特性,并在此基础上加上了密钥.因此MAC算法也经常被称作HMAC算法. ...
- OpenSSL实现了5种信息摘要算法有哪些?
OpenSSL实现了5种信息摘要算法,分别是MD2.MD5.MDC2.SHA(SHA1)和RIPEMD.SHA算法事实上包括了SHA和SHA1两种信息摘要算法.此外,OpenSSL还实现了DSS标准中 ...
- 详解 MD5 信息摘要算法
对于软件研发人员来说 MD5 不是一个陌生的词汇,平时的软件研发中,经常使用 MD5 校验消息是否被篡改.验证文件完整性,甚至将MD5当作加密算法使用. MD5虽不陌生,但不是所有研发人员都了解其算法 ...
- 信息摘要算法之三:SHA256算法分析与实现
前面一篇中我们分析了SHA的原理,并且以SHA1为例实现了相关的算法,在这一片中我们将进一步分析SHA2并实现之. 1.SHA简述 前面的篇章中我们已经说明过,SHA实际包括有一系列算法,分别是SHA ...
- 信息摘要算法之六:HKDF算法分析与实现
HKDF是一种特定的键衍生函数(KDF),即初始键控材料的功能,KDF从其中派生出一个或多个密码强大的密钥.在此我们想要描述的是基于HMAC的HKDF. 1.HKDF概述 密钥派生函数(KDF)是密码 ...
- 信息摘要算法之四:SHA512算法分析与实现
前面一篇中我们分析了SHA256的原理,并且实现了该算法,在这一篇中我们将进一步分析SHA512并实现之. 1.SHA简述 尽管在前面的篇章中我们介绍过SHA算法,但出于阐述的完整性我依然要简单的说明 ...
随机推荐
- 最全的CSS hack没有之一
1.何为HACK? 简单的说,HACK就是只有特定浏览器才能识别这段hack代码.Hack也可以说是让前端最为头疼的问题,因为要写N多种兼容代码.当然,IE是最让人蛋疼的. 一般来说,CSS HACK ...
- 1008-Redo
关于flag,都立下了 T1 考试的时候就觉得是贪心,但是不会反悔emm…… 于是正解就是一个堆优化可反悔的贪心=.= 每次找前面最小的,于是是小根堆. 我们在交易的时候发现后面的一个可以更优. 于是 ...
- naturalWidth、naturalHeight来获取图片的真实宽高
一般在图片放大缩小,或动态插入图片时使用 function imagea(img){ var w = img.naturalWidth; var h = img.naturalHeight; } 注: ...
- DLINK 企业路由器内网部署web开启端口转发后还需要开启是否支持端口回流功能
跑后台使用的服务器,配置一般都很低,带宽只有2Mb 一些大型文件比如app的更新包使用这种服务器不可行 但是公司的网络是100Mb对等静态ip专线 所以能利用起来,每年将会省下8万块 说干就干,这个步 ...
- Springboot2集成Activiti设计器并去除security
前言 鉴于项目需要将acitiviti设计器整合到原工程中,在网上查了不少资料都不太适用,经过借鉴和自己倒腾终于搞定了,分享一下经验,如果有问题,可以在留言区咨询. 文中用到的资源代码链接: http ...
- 跟我一起做一个vue的小项目(十一)
接下来我们进行的是详情页动态路由及banner布局 先看页面的效果 下面是代码部分 <template> <div> <div class="banner&qu ...
- ThinkPHP实现导出Excel表格
/** * 导出数据为excel表格 *@param $data 一个二维数组,结构如同从数据库查出来的数组 *@param $title excel的第一行标题,一个数组,如果为空则没有标题 *@p ...
- TZ_10_常用的2中加密算法MD5,spring-sucrity
1.MD5 在注册时需要进行加密,在登陆时也需要加密进行配对 public class MD5util { public static String stringToMD5(String psd) { ...
- 前端小知识--区分get和post请求
get和post是HTTP协议中的两种发送请求的方法. 如果你还不了解http,可以点击[HTTP协议①介绍](https://www.jianshu.com/p/632b890b75ac)[HTTP ...
- js中的定义变量之①用不用var
var 是js定义变量的意思. 由于js中的变量是弱类型的,因此js中的所有变量包括number(数字型).string(字符串类型).boolean(布尔类型,true和false)等均通过var关 ...