Java版SHA-1加密算法
SHA-1(英语:Secure Hash Algorithm 1,中文名:安全散列算法1)是一种密码散列函数,美国国家安全局设计,并由美国国家标准技术研究所(NIST)发布为联邦数据处理标准(FIPS)。SHA-1可以生成一个被称为消息摘要的160位(20字节)散列值,散列值通常的呈现形式为40个十六进制数。
原理
SHA-1是一种数据加密算法,该算法的思维是接纳一段明文,然后以一种不可逆的方式将它转换成一段(一般更小)密文, 也能够简略的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程
public String sha1Encode(String data) throws Exception {
MessageDigest messageDigest = MessageDigest.getInstance("SHA-1");
if (data!= null){
data +="salt";//加点盐
//使用指定的字节来更新我们的摘要
messageDigest.update(data.getBytes("utf-8"));
//获取密文 (完成摘要计算)
byte[] bytes = messageDigest.digest();
//获取计算的长度
int length = bytes.length;
System.out.println(length);
//16进制字符串
String str = "0123456789abcdef";
//把字符串转为字符串数组
char[] ch = str.toCharArray();
//创建一个40位长度的字节数组
char[] chs = new char[length*2];
for(int i=0,k=0;i<length;i++) {
byte b3 = bytes[i];//获取摘要计算后的字节数组中的每个字节
// >>>:无符号右移
// &:按位与
//0xf:0-15的数字
chs[k++] = ch[b3 >>> 4 & 0xf];
chs[k++] = ch[b3 & 0xf];
}
return new String(chs);
}else {
return null;
}
}
但是在实际的应用中,我们可以直接引org.apache.commons.codec.digest.DigestUtils,然后按照如下方法调用加密即可
public static String sha1Encode(String data) {
if(StringUtils.isEmpty(data)){
return null;
}else{
return DigestUtils.sha1Hex(data);
}
}
SHA-1算法输入报文的长度不限,产生的输出是一个160位的报文摘要。输入是按512 位的分组进行处理的。SHA-1是不可逆的、防冲突,并具有良好的雪崩效应。
雪崩效应:在密码学中,雪崩效应(Avalanche effect)指加密算法(尤其是块密码和加密散列函数)的一种理想属性。雪崩效应是指当输入发生最微小的改变(例如,反转一个二进制位)时,也会导致输出的剧变(如,输出中一半的二进制位发生反转)。在高品质的块密码中,无论密钥或明文的任何细微变化都应当引起密文的剧烈改变。