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.length
2)+"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.length
2)+"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算法的更多相关文章

  1. 廖雪峰Java10加密与安全-3摘要算法-5Hmac

    1 比较MD5和HamcMD5 HmacMD5可以看作带安全salt的MD5 import javax.crypto.KeyGenerator; import javax.crypto.Mac; im ...

  2. 廖雪峰Java10加密与安全-3摘要算法-4BouncyCastle

    1.BouncyCastle: 第三方提供的一组加密/哈希算法 提供JDK没有提供的算法 RipeMD160哈希算法 官方网站 2.如何使用第三方提供的算法 2.1 添加第三方jar至classpat ...

  3. 廖雪峰Java10加密与安全-3摘要算法-1MD5

    1.摘要算法 1.1 摘要算法(哈希算法/Hash/数字指纹): 计算任意长度数据的摘要(固定长度) 相同的输入数据始终得到相同的输出 不同的输入尽量得到不同的输出 1.2 摘要算法目的: 验证数据和 ...

  4. 廖雪峰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 ...

  5. 廖雪峰Java10加密与安全-4加密算法-2口令加密算法

    对称加密key是一个byte数组,如AES256算法的key是一个32字节的数组,普通的加密软件由用户输入加密口令.如果由用户输入口令,进行加密/解密,需要用到PBE算法. 1.PBE:Passwor ...

  6. 廖雪峰Java10加密与安全-6数字证书-1数字证书

    数字证书: 非对称加密算法:对数据进行加密/解密 签名算法:确保数据完整性和抗否认性 摘要算法:确保证书本身没有被篡改

  7. 廖雪峰Java10加密与安全-5签名算法-1RSA签名算法

    1.数字签名 甲在发送加密消息的时候,还要发送自己的签名,而这个签名是用甲的privateKey计算的:而乙要验证这个签名是否是合法的,会用甲的publicKey去验证,如果验证成功,这个消息确实是甲 ...

  8. 廖雪峰Java10加密与安全-4加密算法-5非对称加密算法

    1.非对称加密 非对称加密就是加密和解密使用的不是相同的密钥 方法1: * 加密:用自己的私钥加密,然后发送给对方:encrypt(privateKeyA, message)->s * 解密:对 ...

  9. 廖雪峰Java10加密与安全-4加密算法-1对称加密算法

    1.对称加密算法 加密和解密使用同一个密钥,例如WinRAR. WinRAR在对文件进行打包的时候,可以设置一个密码,在解压的时候需要使用同样的密码才能正确的解压. 加密:encrypt(key,me ...

随机推荐

  1. leetcode-240-搜索二维矩阵②

    题目描述: 最佳方法:O(m+n) O(1) class Solution: def searchMatrix(self, matrix, target): if not matrix : retur ...

  2. sprintf、fprintf和printf这三个函数有什么区别?

    都是把格式好的字符串输出,只是输出的目标不一样:1 printf,是把格式字符串输出到标准输出(一般是屏幕,可以重定向).2 sprintf,是把格式字符串输出到指定字符串中,所以参数比printf多 ...

  3. QT之QSettings 学习

    1.读写配置文件. 代码如下: //创建配置文件 QSettings iniFile(QCoreApplication::applicationDirPath()+"/test.ini&qu ...

  4. 第十一篇:一点一滴学ibatis(一)

    一.常见ORM框架1.原生的JDBC.自己写的JDBC,基本上就只够程序跑起来,缺陷和漏洞一堆堆.回顾下jdbc的几个操作,加载驱动,建立连接,预处理语句,执行,结果集遍历.这个过程中,因为连接Con ...

  5. 数据可视化(matplotilb)

    一,matplotilb库(数学绘图库) mat数学 plot绘图  lib库 matplotlib.pyplot(缩写mp)->python 最常用接口 mp.plot(水平坐标,垂直坐标数组 ...

  6. <Django> 第三方扩展

    1.富文本编辑器 tinymce为例 安装 pip install django-tinymce 在settings.py中的配置 配置应用 INSTALLED_APPS = [ 'django.co ...

  7. 将近半个小时,把一小段简短的汇编代码写成了C语言代码

    我自己看,感觉好像一句一句翻译的,写得很是生硬,不如书上写的灵活 0040137E    8B7424 04       MOV ESI,DWORD PTR SS:[ESP+4]00401382    ...

  8. 2019-7-1-Roslyn-让编译时候-Message-内容默认输出

    title author date CreateTime categories Roslyn 让编译时候 Message 内容默认输出 lindexi 2019-07-01 14:16:59 +080 ...

  9. adb 使用记录

    127.0.0.1:21503 adb kill -server adb start -server adb devices adb logcat | fing "cocos" a ...

  10. LOJ#6075. 「2017 山东一轮集训 Day6」重建

    题目描述: 给定一个 n个点m 条边的带权无向连通图 ,以及一个大小为k 的关键点集合S .有个人要从点s走到点t,现在可以对所有边加上一个非负整数a,问最大的a,使得加上a后,满足:s到t的最短路长 ...