日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

SHA算法原理与常用实现方式是什么

發布時間:2023/12/15 综合教程 33 生活家
生活随笔 收集整理的這篇文章主要介紹了 SHA算法原理与常用实现方式是什么 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這篇文章主要介紹了SHA算法原理與常用實現方式是什么的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇SHA算法原理與常用實現方式是什么文章都會有所收獲,下面我們一起來看看吧。

定義

SHA算法(Secure Hash Algorithm),又叫安全散列算法。

SHA算法是基于MD4算法的基礎上,演變而來。

但SHA算法出生好,是美國國家安全局設計的。

SHA算法,是一個系列家族,包括SHA-1,SHA-2(SHA-224、SHA-256、SHA-384、SHA-512),括號中的四個通常被統稱為SHA-2。

JDK中對SHA-1、SHA-256、SHA-384、SHA-512都有實現。

  • SHA-1的最終密碼長度是160位。

  • SHA-256的最終密碼長度是256位。

  • SHA-384的最終密碼長度是384位。

  • SHA-512的最終密碼長度是512位。

SHA算法,實際上也是一種消息摘要算法,這個和MD算法是類似的。

本文主要介紹SHA-256算法。

任意長度的消息文件,通過SHA-256算法加密,最終得到的密文都是256位(32字節),通常用一個長度為64的十六進制字符串來表示。

效果上,SHA算法,與MD5算法都差不多,主要特點都是不可逆。

MD5和SHA-1的碰撞問題

碰撞問題,就是指對于一個算法,由明文生成的密文,并不是唯一的,甚至可以人為的通過構造新的明文去得到指定的密文。

對于能出現這種情況的算法,我們就說這個算法是有碰撞問題的,簡單理解就是兩個不同的明文,通過算法加密,卻得到了同樣的密文。

目前為止,MD5算法和SHA-1算法,都被證實了存在碰撞問題。

所以在安全性特別高的場景下,都不會用MD5算法和SHA-1算法,至少都用SHA-256算法了。

常見應用場景

1、類似MD5的應用場景

MD5的應用場景,SHA算法基本也都可以使用。

2、比特幣

比特幣中,挖礦算法其實就是SHA-256算法,礦工們根據不斷修改隨機數,不斷的進行SHA-256運算,最終算的快的挖到礦。

3、https簽名算法會用到

打開瀏覽器,以谷歌為例,查看任意一個整數的詳情:

簽名算法就是:帶 RSA 加密的 SHA-256,如下圖:

SHA-256算法原理

SHA家族的基本算法思想,都和MD5一樣,先定義常量,然后循環計算,最后組裝,不同的就是循環里面的計算方式。

1、填補信息

類似MD5

2、拿到初始值

MD5中有4個初始值,而SHA-256中,有8個。

h0:=0x6a09e667
h2:=0xbb67ae85
h3:=0x3c6ef372
h4:=0xa54ff53a
h5:=0x510e527f
h6:=0x9b05688c
h7:=0x1f83d9ab
h7:=0x5be0cd19

3、真正的計算

計算分為多次循環,每次循環,都是用ABCD和原文在第一步填補完的信息,進行計算,最終得到新的ABCD。最后將最后一次ABCD拼成字符串,就是最終的密文。

  • 循環先分為主循環,每個主循環中又套有子循環。

  • 主循環次數 = 原文長度/512。

  • 子循環次數 = 64次。

我們看看單次子循環都做了什么:

下面是單次子循環真正的計算邏輯(這段實現摘自網友):

java實現和使用

其實看過上一篇MD5介紹的,就會發現,其實SHA的java實現,和MD5的java實現,幾乎一模一樣。

唯一的不同,就是MessageDigest.getInstance(“SHA”);這個方法中:

  • SHA-1算法的入參是SHA

  • SHA-256算法的入參是SHA-256

  • SHA-384算法的入參是SHA-384

  • SHA-512算法的入參是SHA-512

MD5的入參是MD5

publicclassSHA1Util{
publicstaticvoidmain(String[]args)throwsIOException{
System.out.println(encodeString("123"));
}
publicstaticStringencodeString(StringplainText)throwsUnsupportedEncodingException{
returnencodeBytes(plainText.getBytes("UTF-8"));
}
publicstaticStringencodeBytes(byte[]bytes){
try{
MessageDigestmd=MessageDigest.getInstance("SHA");
md.update(bytes);
byteb[]=md.digest();
inti;
StringBufferbuf=newStringBuffer("");
for(intoffset=0;offset<b.length;offset++){
i=b[offset];
if(i<0){
i+=256;
}
if(i<16){
buf.append("0");
}
buf.append(Integer.toHexString(i));
}
returnbuf.toString();
}catch(Exceptione){
e.printStackTrace();
}
return"";
}
}

總結

以上是生活随笔為你收集整理的SHA算法原理与常用实现方式是什么的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。