廖雪峰Java10加密与安全-3摘要算法-3SHA-1算法
1.SHA-1算法
SHA-1算法也是一种哈希算法。
- 输出160 bits/20bytes
- 由美国国家安全局开发
- SHA-0/SHA-1/SHA-256/SHA-512
* SHA-0有问题,已经作废了
算法 | 输出长度:bits | 输出长度:bytes |
---|---|---|
SHA-1 | 160 bits | 20 bytes |
SHA-256 | 256 bits | 32 bytes |
SHA-512 | 512 bits | 64 bytes |
2.示例代码
SHA-1用法同MD5
import java.math.BigInteger;
import java.security.MessageDigest;
import java.util.Arrays;
public class SplitString {
public static void main(String[] args) throws Exception {
SplitString ns = new SplitString("helloworld");
String[] ng = {"hello","world"};
SplitString ns2 = new SplitString(ng);
}
public SplitString(String[] ss) throws Exception {
MessageDigest md = MessageDigest.getInstance("SHA-1");
for(String s:ss){
md.update(s.getBytes("UTF-8"));
}
byte[] br = md.digest();
String result = String.format("%032x",new BigInteger(1,br));
System.out.println(Arrays.toString(ss)+":\t"+result);
}
public SplitString(String s) throws Exception{
String[] ss = {s,};
new SplitString(ss);
}
}
## 3.优化算法代码,可以指定算法
```#java
package com.testList;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.util.Arrays;
public class SplitString {
public static byte[] digest(String hashAlggorithm, byte[] input){
MessageDigest md;
try{
md = MessageDigest.getInstance(hashAlggorithm);
}catch (Exception e){
throw new RuntimeException(e);
}
md.update(input);
return md.digest();
}
public static void main(String[] args) throws Exception{
String s = "Java摘要算法测试";
byte[] input = s.getBytes("UTF-8");
byte[] r1 = digest("MD5",input);
System.out.println(r1.length+":"+String.format("%0"+(r1.length2)+"x",new BigInteger(1,r1)));
byte[] r2 = digest("SHA-1",input);
System.out.println(r2.length+":"+String.format("%0"+(r2.length2)+"x",new BigInteger(1,r2)));
byte[] r3 = digest("SHA-256",input);
System.out.println(r3.length+":"+String.format("%0"+(r3.length2)+"x",new BigInteger(1,r3)));
byte[] r4 = digest("RipeMD160",input);
System.out.println(r4.length+":"+String.format("%0"+(r4.length2)+"x",new BigInteger(1,r4)));
}
<img src="https://img2018.cnblogs.com/blog/1418970/201905/1418970-20190508220053277-957444074.png" width="500" />
[通过oracle官网可以查看](https://docs.oracle.com/javase/8/docs/api/javax/xml/crypto/dsig/DigestMethod.html)
## 4.总结:
* SHA-1算法是比MD5更安全的哈希算法
* 其他哈希算法:SHA-256/SHA-512/RipeMD160
## 5.问题:
### 5.1 为什么经过哈希算法处理后,输出的字符串是byte数组长度的2倍
原因:byte转化为16进制是2位,因此数组的长度乘以2,即是输出字符串的长度
```#java
import java.math.BigInteger;
import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.Arrays;
public class SplitString {
public static byte[] digest(String hashAlggorithm, byte[] input){
MessageDigest md;
try{
md = MessageDigest.getInstance(hashAlggorithm);
}catch (Exception e){
throw new RuntimeException(e);
}
md.update(input);
return md.digest();
}
public static void main(String[] args) throws Exception{
String s = "Java摘要算法测试";
byte[] input = s.getBytes("UTF-8");
byte[] r1 = digest("MD5",input);
System.out.println(r1.length+":"+String.format("%0"+(r1.length*2)+"x",new BigInteger(1,r1)));
//为什么输出的长度是byte长度的2位
//byte转化为16进制是2位,因此数组的长度乘以2,即是输出字符串的长度
System.out.println(Arrays.toString(r1));
for(byte b:r1){
System.out.print(Integer.toHexString(b)+"\t");
}
}
}
廖雪峰Java10加密与安全-3摘要算法-3SHA-1算法的更多相关文章
- 廖雪峰Java10加密与安全-3摘要算法-5Hmac
1 比较MD5和HamcMD5 HmacMD5可以看作带安全salt的MD5 import javax.crypto.KeyGenerator; import javax.crypto.Mac; im ...
- 廖雪峰Java10加密与安全-3摘要算法-4BouncyCastle
1.BouncyCastle: 第三方提供的一组加密/哈希算法 提供JDK没有提供的算法 RipeMD160哈希算法 官方网站 2.如何使用第三方提供的算法 2.1 添加第三方jar至classpat ...
- 廖雪峰Java10加密与安全-3摘要算法-1MD5
1.摘要算法 1.1 摘要算法(哈希算法/Hash/数字指纹): 计算任意长度数据的摘要(固定长度) 相同的输入数据始终得到相同的输出 不同的输入尽量得到不同的输出 1.2 摘要算法目的: 验证数据和 ...
- 廖雪峰Java10加密与安全-4加密算法-4密钥交换算法
1DH算法 1.1.原根公式:g^i mod P 条件:1<g<P,0<i<P 原根:介于[1, p-1]之间的任意2个数i,j(p为素数,i≠j)的结果不相等,即 g^i m ...
- 廖雪峰Java10加密与安全-4加密算法-2口令加密算法
对称加密key是一个byte数组,如AES256算法的key是一个32字节的数组,普通的加密软件由用户输入加密口令.如果由用户输入口令,进行加密/解密,需要用到PBE算法. 1.PBE:Passwor ...
- 廖雪峰Java10加密与安全-6数字证书-1数字证书
数字证书: 非对称加密算法:对数据进行加密/解密 签名算法:确保数据完整性和抗否认性 摘要算法:确保证书本身没有被篡改
- 廖雪峰Java10加密与安全-5签名算法-1RSA签名算法
1.数字签名 甲在发送加密消息的时候,还要发送自己的签名,而这个签名是用甲的privateKey计算的:而乙要验证这个签名是否是合法的,会用甲的publicKey去验证,如果验证成功,这个消息确实是甲 ...
- 廖雪峰Java10加密与安全-4加密算法-5非对称加密算法
1.非对称加密 非对称加密就是加密和解密使用的不是相同的密钥 方法1: * 加密:用自己的私钥加密,然后发送给对方:encrypt(privateKeyA, message)->s * 解密:对 ...
- 廖雪峰Java10加密与安全-4加密算法-1对称加密算法
1.对称加密算法 加密和解密使用同一个密钥,例如WinRAR. WinRAR在对文件进行打包的时候,可以设置一个密码,在解压的时候需要使用同样的密码才能正确的解压. 加密:encrypt(key,me ...
随机推荐
- iptables 命令大全
1.连续端口配置 iptables可以方便的配置多个端口.其中根据端口的连续性,又可分为连续端口配置和不连续端口配置. 如: -A INPUT -p tcp –dport 21:25 -j DROP/ ...
- Docker系列(八):Kubernetes横空出世背后的秘密
Docker与CoreOS的恩怨情仇 2013年2月,Docker建立了一个网站发布它的首个演示版本, 3月,美国加州Alex Polvi正在自己的车库开始 他的 第二次创业 有了第一桶金的Alex这 ...
- CSS 常用的兼容性调试技巧
1.实现所有浏览器主页居中 Firefox下主页居中代码:.box{margin:0px auto} IE5.5下主页居中代码:body{text-align:center;} 将以上两种代码,合在一 ...
- java编程规约三
七.集合处理 1.尽量使用String对象做Map的key 2.list转数组,用list的toArray(T[] array),传入的参数array是类型完全一样的数组,大小是list.size() ...
- 小tips: zoom和transform:scale的区别
小tips: zoom和transform:scale的区别 转自 张鑫旭 前端大神 by zhangxinxu from http://www.zhangxinxu.com本文地址:http://w ...
- POJ 2074 /// 判断直线与线段相交 视野盲区
题目大意: 将所有物体抽象成一段横向的线段 给定房子的位置和人行道的位置 接下来给定n个障碍物的位置 位置信息为(x1,x2,y) 即x1-x2的线段 y相同因为是横向的 求最长的能看到整个房子的一段 ...
- 使用CEfSharp之旅(3)下载文件 弹出保存框 IDownloadHandler
原文:使用CEfSharp之旅(3)下载文件 弹出保存框 IDownloadHandler 版权声明:本文为博主原创文章,未经博主允许不得转载.可点击关注博主 ,不明白的进群191065815 我的群 ...
- OdDbAttribute和OdDbAttributeDefinition是什么关系
OdDbAttributeDefinition是定义,比如说是英文,是一个占位符: OdDbAttribute就是具体的东西,比如是abc
- 读《深入PHP 面向对象、模式与实践》笔记
1. include() 和require() 语句的不同在于它们如何处理错误.使用require()调用文件发生错误时,将会停止整个程序;调用include()时遇到相同的错误,则会生成警告并停止执 ...
- AM历史消息及文件记录删除
1.下载 folderclear.bat 文件 2.用编辑方式打开这个文件 3.对里面的参数做修改 4.这个批处理文件,保留了 完整的一个月的消息记录 (如 今天是 2017.3.15 ,那么 清除数 ...