最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于SHA算法原理與常用實(shí)現(xiàn)方式

 更新時(shí)間:2022年08月18日 11:35:42   作者:zhangSir134  
這篇文章主要介紹了關(guān)于SHA算法原理與常用實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

看本文前,最好先看看之前的這一篇關(guān)于MD5算法的介紹。

MD5算法原理與常用實(shí)現(xiàn)

定義

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

SHA算法是基于MD4算法的基礎(chǔ)上,演變而來(lái)。

但SHA算法出生好,是美國(guó)國(guó)家安全局設(shè)計(jì)的。

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

JDK中對(duì)SHA-1、SHA-256、SHA-384、SHA-512都有實(shí)現(xiàn)。

  • SHA-1的最終密碼長(zhǎng)度是160位。
  • SHA-256的最終密碼長(zhǎng)度是256位。
  • SHA-384的最終密碼長(zhǎng)度是384位。
  • SHA-512的最終密碼長(zhǎng)度是512位。

SHA算法,實(shí)際上也是一種消息摘要算法,這個(gè)和MD算法是類似的。

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

任意長(zhǎng)度的消息文件,通過(guò)SHA-256算法加密,最終得到的密文都是256位(32字節(jié)),通常用一個(gè)長(zhǎng)度為64的十六進(jìn)制字符串來(lái)表示。

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

MD5和SHA-1的碰撞問(wèn)題

碰撞問(wèn)題,就是指對(duì)于一個(gè)算法,由明文生成的密文,并不是唯一的,甚至可以人為的通過(guò)構(gòu)造新的明文去得到指定的密文。

對(duì)于能出現(xiàn)這種情況的算法,我們就說(shuō)這個(gè)算法是有碰撞問(wèn)題的,簡(jiǎn)單理解就是兩個(gè)不同的明文,通過(guò)算法加密,卻得到了同樣的密文。

目前為止,MD5算法和SHA-1算法,都被證實(shí)了存在碰撞問(wèn)題。

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

常見應(yīng)用場(chǎng)景

1、類似MD5的應(yīng)用場(chǎng)景

MD5的應(yīng)用場(chǎng)景,SHA算法基本也都可以使用。

2、比特幣

比特幣中,挖礦算法其實(shí)就是SHA-256算法,礦工們根據(jù)不斷修改隨機(jī)數(shù),不斷的進(jìn)行SHA-256運(yùn)算,最終算的快的挖到礦。

3、https簽名算法會(huì)用到

打開瀏覽器,以谷歌為例,查看任意一個(gè)整數(shù)的詳情:

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

SHA-256算法原理

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

1、填補(bǔ)信息

類似MD5

2、拿到初始值

MD5中有4個(gè)初始值,而SHA-256中,有8個(gè)。

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

3、真正的計(jì)算

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

  • 循環(huán)先分為主循環(huán),每個(gè)主循環(huán)中又套有子循環(huán)。
  • 主循環(huán)次數(shù) = 原文長(zhǎng)度/512。
  • 子循環(huán)次數(shù) = 64次。

我們看看單次子循環(huán)都做了什么:

下面是單次子循環(huán)真正的計(jì)算邏輯(這段實(shí)現(xiàn)摘自網(wǎng)友):

java實(shí)現(xiàn)和使用

其實(shí)看過(guò)上一篇MD5介紹的,就會(huì)發(fā)現(xiàn),其實(shí)SHA的java實(shí)現(xiàn),和MD5的java實(shí)現(xiàn),幾乎一模一樣。

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

  • SHA-1算法的入?yún)⑹荢HA
  • SHA-256算法的入?yún)⑹荢HA-256
  • SHA-384算法的入?yún)⑹荢HA-384
  • SHA-512算法的入?yún)⑹荢HA-512

MD5的入?yún)⑹荕D5

public class SHA1Util {
    public static void main(String[] args) throws IOException {
        System.out.println(encodeString("123"));
    }
    public static String encodeString(String plainText) throws UnsupportedEncodingException {
        return encodeBytes(plainText.getBytes("UTF-8"));
    }
    public static String encodeBytes(byte[] bytes) {
        try {
            MessageDigest md = MessageDigest.getInstance("SHA");
            md.update(bytes);
            byte b[] = md.digest();
            int i;
            StringBuffer buf = new StringBuffer("");
            for (int offset = 0; offset < b.length; offset++) {
                i = b[offset];
                if (i < 0) {
                    i += 256;
                }
                if (i < 16) {
                    buf.append("0");
                }
                buf.append(Integer.toHexString(i));
            }
            return buf.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }
}

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。 

相關(guān)文章

  • SpringBoot如何使用TraceId日志鏈路追蹤

    SpringBoot如何使用TraceId日志鏈路追蹤

    文章介紹了如何使用TraceId進(jìn)行日志鏈路追蹤,通過(guò)在日志中添加TraceId關(guān)鍵字,可以將同一次業(yè)務(wù)調(diào)用鏈上的日志串起來(lái),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2025-01-01
  • 使用redisTemplate的scan方式刪除批量key問(wèn)題

    使用redisTemplate的scan方式刪除批量key問(wèn)題

    這篇文章主要介紹了使用redisTemplate的scan方式刪除批量key問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • IDEA配置JRebel實(shí)現(xiàn)熱部署的方法

    IDEA配置JRebel實(shí)現(xiàn)熱部署的方法

    這篇文章主要介紹了IDEA配置JRebel實(shí)現(xiàn)熱部署的方法,本文給大家介紹的非常想詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • java實(shí)現(xiàn)網(wǎng)上購(gòu)物車程序

    java實(shí)現(xiàn)網(wǎng)上購(gòu)物車程序

    這篇文章主要介紹了java實(shí)現(xiàn)網(wǎng)上購(gòu)物車程序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • MyBatis實(shí)現(xiàn)批量插入方法實(shí)例

    MyBatis實(shí)現(xiàn)批量插入方法實(shí)例

    最近在公司項(xiàng)目開發(fā)中遇到批量數(shù)據(jù)插入或者更新,下面這篇文章主要給大家介紹了關(guān)于MyBatis實(shí)現(xiàn)批量插入的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • 面試官問(wèn)如何啟動(dòng)Java?線程

    面試官問(wèn)如何啟動(dòng)Java?線程

    這篇文章主要介紹了面試官問(wèn)如何啟動(dòng)Java?線程,Java?的線程創(chuàng)建和啟動(dòng)非常簡(jiǎn)單,但如果問(wèn)一個(gè)線程是怎么啟動(dòng)起來(lái)的往往并不清楚,甚至不知道為什么啟動(dòng)時(shí)是調(diào)用start(),而不是調(diào)用run()方法呢?下面我們就一起進(jìn)入文章學(xué)習(xí)這個(gè)問(wèn)題吧
    2021-12-12
  • spring本地事務(wù)失效的原因分析

    spring本地事務(wù)失效的原因分析

    這篇文章給大家介紹了spring本地事務(wù)失效的情況原因分析,給大家羅列了五種原因分析,通過(guò)代碼示例介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2023-10-10
  • Java 連接Access數(shù)據(jù)庫(kù)的兩種方式

    Java 連接Access數(shù)據(jù)庫(kù)的兩種方式

    這篇文章主要介紹了Java 連接Access數(shù)據(jù)庫(kù)的兩種方式,本文著重講解使用JDBC連接操作Access數(shù)據(jù)庫(kù),需要的朋友可以參考下
    2015-06-06
  • SpringSecurity如何實(shí)現(xiàn)配置單個(gè)HttpSecurity

    SpringSecurity如何實(shí)現(xiàn)配置單個(gè)HttpSecurity

    這篇文章主要介紹了SpringSecurity如何實(shí)現(xiàn)配置單個(gè)HttpSecurity,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 使用SpringBoot注解方式處理事務(wù)回滾實(shí)現(xiàn)

    使用SpringBoot注解方式處理事務(wù)回滾實(shí)現(xiàn)

    這篇文章主要介紹了使用SpringBoot注解方式處理事務(wù)回滾實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08

最新評(píng)論

阳原县| 丁青县| 沐川县| 普格县| 邵东县| 灵武市| 蒲城县| 防城港市| 平凉市| 商河县| 夏河县| 淮阳县| 方山县| 梅州市| 文成县| 始兴县| 巴林左旗| 互助| 睢宁县| 德惠市| 山西省| 奉贤区| 阳谷县| 长宁县| 通海县| 县级市| 宁波市| 南京市| 禄劝| 湾仔区| 伊吾县| 邹城市| 电白县| 成武县| 澎湖县| 伊金霍洛旗| 鸡泽县| 淮阳县| 肇庆市| 陇川县| 侯马市|