從SHA1到SHA256:密碼學(xué)哈希函數(shù)原理、演進(jìn)與安全實(shí)踐指南
1. 項(xiàng)目概述從“加密”到“哈?!钡恼J(rèn)知躍遷提到“加密算法”很多人的第一反應(yīng)是像AES、RSA那樣用一把密鑰把明文變成密文需要時(shí)再用密鑰解開的雙向過程。但今天要聊的SHA系列雖然常被歸在“加密算法”的大類里但它干的其實(shí)是另一件事哈希Hash或者更準(zhǔn)確地叫密碼學(xué)哈希函數(shù)。這不是一個(gè)文字游戲而是理解其核心價(jià)值和應(yīng)用場景的起點(diǎn)。簡單來說SHA不是用來“加密”一封情書以防別人偷看的而是用來給任何數(shù)據(jù)無論是情書、一個(gè)軟件安裝包還是一份電子合同生成一個(gè)獨(dú)一無二的“數(shù)字指紋”。這個(gè)指紋是單向的、不可逆的你無法從指紋反推出原始數(shù)據(jù)是什么但任何對原始數(shù)據(jù)的微小改動都會導(dǎo)致指紋發(fā)生天翻地覆的變化。為什么我們需要這樣的“指紋”場景無處不在。你從官網(wǎng)下載一個(gè)大型軟件怎么確保下載過程中文件沒被網(wǎng)絡(luò)攻擊者篡改或植入病毒網(wǎng)站會提供一個(gè)由SHA256計(jì)算出的“校驗(yàn)和”就是一串長長的十六進(jìn)制字符。下載后你自己用工具算一下文件的SHA256值和官網(wǎng)提供的對比一模一樣才能安心安裝。這就是數(shù)據(jù)完整性校驗(yàn)。再比如你的密碼在服務(wù)器端絕不會以明文存儲而是存儲其SHA256哈希值。登錄時(shí)服務(wù)器對你輸入的密碼再次哈希與存儲的哈希值比對。即使數(shù)據(jù)庫泄露攻擊者拿到的也只是無法直接使用的哈希值大大提升了安全性。所以SHA1、SHA256這些詞早已滲透到我們數(shù)字生活的底層是構(gòu)建信任的基石。這篇文章我就以一個(gè)在安全和數(shù)據(jù)領(lǐng)域摸爬滾打多年的從業(yè)者視角帶你徹底搞懂SHA特別是從經(jīng)典的SHA1到如今主流的SHA256它們到底是怎么工作的為什么SHA1被淘汰了以及在實(shí)際開發(fā)和應(yīng)用中你該如何正確、安全地使用它們。2. SHA家族的核心原理與演進(jìn)邏輯要理解SHA不能只停留在“輸入數(shù)據(jù)輸出一串固定長度字符”的層面。我們需要深入其內(nèi)部看看這個(gè)“數(shù)字指紋制造機(jī)”是如何保證那些關(guān)鍵特性的單向性、抗碰撞性很難找到兩個(gè)不同的數(shù)據(jù)產(chǎn)生相同的哈希值、雪崩效應(yīng)輸入微小改變輸出差異巨大。2.1 哈希函數(shù)的設(shè)計(jì)哲學(xué)與核心流程所有SHA算法的核心流程都遵循一個(gè)相似的模板理解了這個(gè)模板再看具體變種就容易多了。整個(gè)過程可以類比為一個(gè)精密的“數(shù)據(jù)攪拌機(jī)”預(yù)處理填充與附加長度輸入的數(shù)據(jù)消息長度千變?nèi)f化但攪拌機(jī)需要固定大小的“原料塊”來處理。所以第一步是填充數(shù)據(jù)使其長度恰好滿足總長度 % 512位 448位。然后在末尾附加一個(gè)64位的字段表示原始消息的比特長度。這樣最終的總長度就是512位的整數(shù)倍。這個(gè)步驟確保了任何長度的輸入都能被規(guī)范化。分塊處理將填充后的消息分割成一個(gè)個(gè)512位64字節(jié)的“消息塊”。這些塊將按順序進(jìn)入核心的“壓縮函數(shù)”進(jìn)行處理。初始化哈希值算法會定義一組固定的初始值Initial Hash Value這是一個(gè)魔術(shù)數(shù)字的起點(diǎn)。對于SHA256這是8個(gè)32位的常數(shù)源于前8個(gè)質(zhì)數(shù)的平方根的小數(shù)部分前32位。這些初始值作為第一個(gè)消息塊處理的“初始狀態(tài)”。核心壓縮函數(shù)心臟部分這是最復(fù)雜也最精妙的部分。每個(gè)512位的消息塊會與當(dāng)前的“中間哈希值”一開始是初始值一起經(jīng)過多輪復(fù)雜的位運(yùn)算。這些運(yùn)算包括位邏輯運(yùn)算AND與、OR或、XOR異或、NOT非。循環(huán)移位將數(shù)據(jù)的比特位向左或向右循環(huán)移動一定的位數(shù)。模加法對2^32或2^64取模的加法。 經(jīng)過幾十輪這樣的混合攪拌當(dāng)前消息塊的信息被徹底“壓縮”并融合到中間哈希值中。然后這個(gè)更新后的中間哈希值將作為處理下一個(gè)消息塊的輸入狀態(tài)。輸出當(dāng)所有消息塊都處理完畢后最終的中間哈希值就是整個(gè)消息的哈希結(jié)果以十六進(jìn)制字符串的形式輸出。這個(gè)流程的精髓在于前一個(gè)塊的處理結(jié)果會影響到后一個(gè)塊的處理形成了鏈?zhǔn)揭蕾嚒<词箖蓚€(gè)消息只有一個(gè)比特的差異在某個(gè)塊中引發(fā)的變化也會像多米諾骨牌一樣通過壓縮函數(shù)被放大并傳遞到所有后續(xù)塊的處理中最終導(dǎo)致完全不同的輸出這就是雪崩效應(yīng)的來源。2.2 SHA1昔日的功臣與致命的弱點(diǎn)SHA1由美國國家安全局設(shè)計(jì)于1995年發(fā)布輸出是160位20字節(jié)的哈希值。在很長一段時(shí)間里它是SSL/TLS證書、軟件版本控制如Git的提交ID、文件校驗(yàn)等領(lǐng)域的事實(shí)標(biāo)準(zhǔn)。它的核心結(jié)構(gòu)與上述模板一致但內(nèi)部壓縮函數(shù)操作的是32位字共進(jìn)行80輪運(yùn)算。它使用了更簡單的位運(yùn)算組合。在21世紀(jì)初SHA1被認(rèn)為是足夠安全的。然而密碼學(xué)安全的基石是“計(jì)算上的不可行性”。對于哈希函數(shù)最關(guān)鍵的安全屬性是抗碰撞性在現(xiàn)實(shí)可接受的時(shí)間和成本內(nèi)無法找到兩個(gè)不同的消息產(chǎn)生相同的哈希值。SHA1的衰落源于其內(nèi)在的數(shù)學(xué)結(jié)構(gòu)弱點(diǎn)被逐漸發(fā)現(xiàn)。2005年密碼學(xué)家發(fā)現(xiàn)了SHA1理論上存在碰撞攻擊的方法其計(jì)算復(fù)雜度遠(yuǎn)低于暴力破解“生日攻擊”所需的2^80次操作。真正的警鐘在2017年敲響谷歌的研究團(tuán)隊(duì)公開實(shí)施了世界上首次SHA1碰撞攻擊命名為“SHAttered”。他們成功制造了兩個(gè)內(nèi)容不同但SHA1值完全相同的PDF文件。這次實(shí)踐證明了SHA1的碰撞攻擊已經(jīng)從理論變?yōu)楝F(xiàn)實(shí)。注意這里必須澄清一個(gè)常見誤解。SHA1的“被破解”指的是碰撞攻擊而不是原像攻擊。原像攻擊是指給定一個(gè)哈希值反向找出原始消息這對SHA1來說目前仍然非常困難。但碰撞攻擊的可行性已經(jīng)足以致命。想象一下如果數(shù)字證書系統(tǒng)依賴SHA1攻擊者就可以偽造一個(gè)和合法證書具有相同SHA1指紋的惡意證書從而實(shí)施中間人攻擊。因此任何對安全性有要求的場景都必須立即棄用SHA1。2.3 SHA256當(dāng)前的中流砥柱SHA256屬于SHA-2家族于2001年發(fā)布。顧名思義它輸出256位32字節(jié)的哈希值。它并非簡單地將SHA1加長而是進(jìn)行了全面的加固設(shè)計(jì)更長的輸出和內(nèi)部狀態(tài)256位的輸出長度使得暴力碰撞攻擊的復(fù)雜度從SHA1的理論2^80飆升到2^128這在可預(yù)見的未來都是計(jì)算不可行的。其內(nèi)部使用了8個(gè)32位變量共256位作為狀態(tài)比SHA1的5個(gè)變量160位更復(fù)雜。更復(fù)雜的消息擴(kuò)展在壓縮函數(shù)中SHA256會將一個(gè)512位的消息塊擴(kuò)展成64個(gè)32位的“消息調(diào)度字”。這個(gè)擴(kuò)展過程包含了更多的移位和異或操作使得輸入消息的比特之間產(chǎn)生更復(fù)雜的非線性關(guān)聯(lián)。增強(qiáng)的壓縮函數(shù)SHA256的壓縮函數(shù)進(jìn)行64輪運(yùn)算。每輪運(yùn)算中它使用了6個(gè)不同的邏輯函數(shù)Ch, Maj, Σ0, Σ1, σ0, σ1這些函數(shù)由移位、旋轉(zhuǎn)和位運(yùn)算精心組合而成提供了更強(qiáng)的混淆和擴(kuò)散能力。其中Maj多數(shù)函數(shù)和Σ函數(shù)是SHA1中沒有的它們能更好地抵抗已知的密碼學(xué)分析技術(shù)。正是這些結(jié)構(gòu)上的增強(qiáng)使得SHA256至今仍然堅(jiān)如磐石被廣泛應(yīng)用于TLS 1.2/1.3、比特幣區(qū)塊鏈、軟件包分發(fā)校驗(yàn)、密碼存儲等至關(guān)重要的領(lǐng)域。它是目前平衡安全性與計(jì)算效率的最佳選擇之一。2.4 SHA家族的其他成員與選型參考除了SHA1和SHA256SHA-2家族還包括SHA224、SHA384、SHA512等。它們的內(nèi)部結(jié)構(gòu)相似主要區(qū)別在于輸出長度、內(nèi)部狀態(tài)大小和處理的塊大小SHA384/512使用64位字塊大小為1024位。選型原則很直接通用安全需求無腦選擇SHA256。它在絕大多數(shù)平臺和語言中都有原生或高效實(shí)現(xiàn)安全強(qiáng)度足夠應(yīng)對當(dāng)前及未來數(shù)十年的威脅。特定協(xié)議或兼容性要求遵循標(biāo)準(zhǔn)。例如某些老系統(tǒng)或標(biāo)準(zhǔn)可能指定使用SHA1盡管應(yīng)極力推動升級而一些對安全性要求極高的系統(tǒng)可能指定使用SHA384或SHA512。性能考量在64位處理器上SHA512有時(shí)可能比SHA256更快因?yàn)樗芨玫乩?4位寄存器。但通常差異不顯著安全性仍是首要考慮。3. 核心細(xì)節(jié)解析與實(shí)操要點(diǎn)理解了原理我們來看看在實(shí)際編程和應(yīng)用中如何使用SHA以及有哪些必須注意的“坑”。3.1 在代碼中計(jì)算SHA哈希值幾乎所有的現(xiàn)代編程語言都內(nèi)置或通過標(biāo)準(zhǔn)庫提供了SHA算法的實(shí)現(xiàn)。這里以Python和命令行為例展示最直接的使用方法。Python示例Python的hashlib模塊是首選。import hashlib def calculate_sha256(file_path): sha256_hash hashlib.sha256() with open(file_path, rb) as f: # 必須用二進(jìn)制模式打開 # 分塊讀取大文件避免內(nèi)存耗盡 for byte_block in iter(lambda: f.read(4096), b): sha256_hash.update(byte_block) return sha256_hash.hexdigest() # 返回十六進(jìn)制字符串 # 計(jì)算字符串的哈希 text Hello, World! text_hash hashlib.sha256(text.encode(utf-8)).hexdigest() print(fSHA256 of text: {text_hash}) # 計(jì)算文件的哈希 file_hash calculate_sha256(my_software.zip) print(fSHA256 of file: {file_hash})命令行工具在Linux/macOS上sha256sum和sha1sum是標(biāo)配工具。# 計(jì)算文件的SHA256校驗(yàn)和 sha256sum ubuntu-22.04.iso # 計(jì)算并保存校驗(yàn)和到文件 sha256sum ubuntu-22.04.iso ubuntu.sha256 # 驗(yàn)證文件是否與保存的校驗(yàn)和匹配 sha256sum -c ubuntu.sha256在Windows PowerShell 5.1及以上版本中可以使用Get-FileHash命令。Get-FileHash -Path C:\Downloads\software.zip -Algorithm SHA2563.2 密碼存儲絕對不要單獨(dú)使用SHA這是一個(gè)至關(guān)重要的實(shí)操要點(diǎn)也是新手最容易犯的致命錯誤。切勿直接使用SHA256哈希來存儲密碼原因如下彩虹表攻擊雖然SHA256不可逆但攻擊者可以預(yù)先計(jì)算海量常用密碼及其哈希值做成“彩虹表”。一旦數(shù)據(jù)庫泄露他們只需查表就能快速反推出原始密碼。相同密碼相同哈希如果兩個(gè)用戶使用了相同的密碼他們的哈希值也會相同。這既泄露了用戶習(xí)慣也使得攻擊者破解一個(gè)哈希就等于破解了所有使用該密碼的賬戶。正確的做法是使用加鹽哈?;?qū)iT的密碼哈希函數(shù)。加鹽Salt為每個(gè)密碼在哈希前拼接一個(gè)唯一、隨機(jī)的字符串鹽。鹽與哈希值一起存儲。import hashlib import os import binascii def hash_password(password): # 生成隨機(jī)鹽 salt os.urandom(16) # 將鹽與密碼組合后哈希 pwdhash hashlib.pbkdf2_hmac(sha256, password.encode(utf-8), salt, 100000) # 存儲時(shí)需要同時(shí)保存鹽和哈希值 stored_hash binascii.hexlify(salt pwdhash).decode(ascii) return stored_hash def verify_password(stored_hash, provided_password): # 從存儲的字符串中提取鹽 stored_hash_bytes binascii.unhexlify(stored_hash.encode(ascii)) salt stored_hash_bytes[:16] stored_pwdhash stored_hash_bytes[16:] # 用相同的鹽和參數(shù)計(jì)算提供密碼的哈希 pwdhash hashlib.pbkdf2_hmac(sha256, provided_password.encode(utf-8), salt, 100000) return pwdhash stored_pwdhash專用密碼哈希函數(shù)使用如bcrypt、scrypt或Argon2目前競賽冠軍這類算法。它們不僅加鹽還故意設(shè)計(jì)得非常慢可調(diào)節(jié)成本因子能有效抵抗彩虹表和暴力破解。# 使用bcrypt的示例需要安裝bcrypt庫 import bcrypt password bsuper secret password # 哈希密碼自動生成并包含鹽 hashed bcrypt.hashpw(password, bcrypt.gensalt(rounds12)) # 驗(yàn)證密碼 if bcrypt.checkpw(password, hashed): print(密碼匹配)3.3 文件完整性校驗(yàn)的完整流程在發(fā)布軟件或重要數(shù)據(jù)時(shí)提供哈希校驗(yàn)和是基本操作。一個(gè)專業(yè)的流程應(yīng)該包括生成在干凈、安全的環(huán)境下使用可信的工具如上述命令行或腳本生成文件的SHA256哈希值。發(fā)布將哈希值通過不同于文件分發(fā)渠道的、可信的次要渠道發(fā)布。例如將軟件安裝包放在CDN上但將哈希值發(fā)布在官方網(wǎng)站的下載頁面、GitHub Release的說明中甚至通過官方的社交媒體賬號公布。這樣即使文件分發(fā)渠道被劫持攻擊者也無法同時(shí)篡改文件和所有可信渠道上的哈希值。驗(yàn)證指導(dǎo)用戶下載文件后使用工具自行計(jì)算哈希值并與你通過可信渠道發(fā)布的哈希值進(jìn)行比對。必須強(qiáng)調(diào)用戶要使用自己系統(tǒng)上的工具計(jì)算而不是點(diǎn)擊某個(gè)聲稱能“自動驗(yàn)證”的鏈接。4. 實(shí)操過程與核心環(huán)節(jié)實(shí)現(xiàn)讓我們通過一個(gè)模擬的完整場景將上述知識點(diǎn)串聯(lián)起來為一個(gè)開源軟件項(xiàng)目發(fā)布新版本并確保用戶能安全地驗(yàn)證下載的文件。4.1 環(huán)境準(zhǔn)備與工具確認(rèn)首先確保你的工作環(huán)境是干凈、未被入侵的。用于生成發(fā)布版哈希值的機(jī)器其安全性至關(guān)重要。操作系統(tǒng)使用你熟悉的Linux發(fā)行版或macOS其命令行工具鏈成熟可靠。工具檢查確認(rèn)sha256sum或shasum命令可用。which sha256sum sha256sum --version項(xiàng)目構(gòu)建在隔離的構(gòu)建環(huán)境中如Docker容器或干凈的CI/CD流水線完成軟件的編譯和打包得到最終要分發(fā)的文件例如myapp-v1.2.0-linux-amd64.tar.gz。4.2 生成與記錄哈希值在構(gòu)建環(huán)境內(nèi)生成哈希值。強(qiáng)烈建議同時(shí)生成多個(gè)算法的哈希值如SHA256和SHA512以提供冗余和未來兼容性。cd /path/to/release/artifacts # 生成SHA256和SHA512校驗(yàn)和 sha256sum myapp-v1.2.0-linux-amd64.tar.gz myapp-v1.2.0-linux-amd64.tar.gz.sha256 sha512sum myapp-v1.2.0-linux-amd64.tar.gz myapp-v1.2.0-linux-amd64.tar.gz.sha512 # 查看生成的內(nèi)容 cat myapp-v1.2.0-linux-amd64.tar.gz.sha256 # 輸出類似a1b2c3...9z0 myapp-v1.2.0-linux-amd64.tar.gz生成后立即將.sha256和.sha512文件從構(gòu)建環(huán)境復(fù)制出來與發(fā)布文件分開保管。最好能打印出來或記錄在安全的筆記中作為最終參照。4.3 發(fā)布與簽名進(jìn)階安全對于關(guān)鍵軟件僅提供哈希值還不夠。哈希值本身也可能在傳輸中被篡改。更安全的做法是使用數(shù)字簽名。生成哈希文件如上所述。創(chuàng)建簽名文件使用GPG等工具用你的私鑰對哈希文件進(jìn)行簽名。# 假設(shè)你已配置GPG密鑰 gpg --detach-sign --armor myapp-v1.2.0-linux-amd64.tar.gz.sha256這會生成一個(gè)myapp-v1.2.0-linux-amd64.tar.gz.sha256.asc文件。發(fā)布包將軟件包、哈希文件、簽名文件一同發(fā)布。用戶驗(yàn)證流程用戶需要 a. 下載軟件包、哈希文件、簽名文件。 b. 使用你的公鑰驗(yàn)證簽名文件是否有效確保哈希文件來自你且未被改。 c. 如果簽名有效再使用哈希文件來驗(yàn)證軟件包的完整性。4.4 用戶端驗(yàn)證操作指南在你的項(xiàng)目發(fā)布頁面上需要提供清晰的操作指南。以Linux用戶為例## 驗(yàn)證下載完整性 1. 下載文件 myapp-v1.2.0-linux-amd64.tar.gz 及其對應(yīng)的校驗(yàn)和文件 myapp-v1.2.0-linux-amd64.tar.gz.sha256。 2. 打開終端進(jìn)入下載目錄。 3. 運(yùn)行以下命令計(jì)算下載文件的SHA256值 bash sha256sum myapp-v1.2.0-linux-amd64.tar.gz 4. 將命令輸出的哈希值與 myapp-v1.2.0-linux-amd64.tar.gz.sha256 文件中的內(nèi)容進(jìn)行比對。兩者應(yīng)該完全一致。 5. 如果一致說明文件下載完整且未被篡改。如果不一致**請勿使用該文件**并重新從官方源下載。對于Windows用戶可以指導(dǎo)他們使用PowerShell的Get-FileHash命令或第三方圖形化工具如HashCheck。5. 常見問題與排查技巧實(shí)錄在實(shí)際使用中你會遇到各種各樣的問題。下面是我踩過的一些坑和解決方案。5.1 哈希值比對失敗原因與排查這是最常見的問題。你計(jì)算出的哈希值和官方提供的對不上。別慌按以下步驟排查檢查文件是否完全下載這是最可能的原因。網(wǎng)絡(luò)中斷、瀏覽器下載工具異常都可能導(dǎo)致文件不完整。重新下載一次最好使用支持?jǐn)帱c(diǎn)續(xù)傳的工具如wget -c或curl -C -。確認(rèn)你計(jì)算的是正確的文件你是否解壓了壓縮包然后計(jì)算了里面某個(gè)文件的哈希官方提供的通常是壓縮包本身的哈希。仔細(xì)閱讀官方說明。檢查文本編碼和換行符對于文本文件哈希如果你在計(jì)算一個(gè)文本文件如腳本、配置文件的哈希要特別注意。在Windows上生成的文本文件CRLF換行和在Linux上生成的LF換行其哈希值會不同。同樣文件的編碼UTF-8帶BOM vs 不帶BOM也會影響結(jié)果。確保計(jì)算環(huán)境和生成環(huán)境一致。對于跨平臺分發(fā)最好明確說明文件格式。驗(yàn)證工具和算法是否匹配你用的是sha256sum但官方提供的是sha512sum的結(jié)果或者你用了shasum -a 256而官方用的是sha256sum雖然算法相同但不同工具的輸出格式是否包含文件名可能略有差異比較時(shí)只對比哈希字符串本身。警惕“哈希欺騙”極少數(shù)情況下攻擊者可能制造了碰撞對于SHA1已可行或同時(shí)篡改了文件和網(wǎng)站上的哈希值。這就是為什么強(qiáng)調(diào)要通過次要可信渠道如官方推特、項(xiàng)目GitHub倉庫的Release描述二次確認(rèn)哈希值。5.2 性能考量與優(yōu)化當(dāng)需要哈希大量數(shù)據(jù)或小文件時(shí)性能可能成為問題。大文件如前面Python代碼所示一定要使用流式處理分塊讀取避免將整個(gè)文件讀入內(nèi)存。hashlib的update()方法就是為此設(shè)計(jì)的。海量小文件頻繁創(chuàng)建哈希對象會有開銷。如果是在一個(gè)循環(huán)中處理成千上萬個(gè)小文件確保哈希對象的創(chuàng)建和update調(diào)用在循環(huán)內(nèi)正確進(jìn)行。對于極端性能要求可以考慮使用C擴(kuò)展庫或利用硬件加速如果CPU支持SHA-NI指令集某些庫如OpenSSL會利用它極大提升SHA256速度。選擇算法在僅需要非密碼學(xué)強(qiáng)度的快速哈希時(shí)如構(gòu)建哈希表可以考慮更快的非加密哈希函數(shù)如xxHash或MurmurHash。但絕不能將它們用于安全相關(guān)場景。5.3 關(guān)于“輕量級分組加密算法HIGHT”的聯(lián)想在搜索SHA時(shí)你可能看到過“輕量級分組加密算法HIGHT”這樣的詞。這里簡單厘清關(guān)系避免混淆。HIGHT是一種加密算法對稱加密用于在資源受限的環(huán)境如物聯(lián)網(wǎng)設(shè)備中加密數(shù)據(jù)是AES的輕量級替代品之一。而SHA是哈希算法用于生成摘要。它們屬于密碼學(xué)的不同分支。雖然某些模式如HMAC會將哈希函數(shù)用于消息認(rèn)證但哈希函數(shù)本身不用于加解密數(shù)據(jù)。理解你手中工具的本質(zhì)用途是正確應(yīng)用的第一步。5.4 Git中的SHA1它安全嗎Git使用SHA1作為提交對象、樹對象和標(biāo)簽對象的唯一標(biāo)識符。很多人擔(dān)心這是否會危及Git倉庫的安全。Git之父Linus Torvalds對此有過詳細(xì)解釋核心觀點(diǎn)是Git使用SHA1是為了保證數(shù)據(jù)完整性而非安全性。Git模型下的SHA1碰撞攻擊非常困難因?yàn)楣粽咝枰圃煲粋€(gè)既有意義符合Git對象格式又能與現(xiàn)有提交碰撞的文件。即便如此Git社區(qū)也早已未雨綢繆新版本的Git支持可插拔的哈希算法正在向更安全的哈希算法如SHA256過渡。對于普通開發(fā)者目前無需過度擔(dān)憂但了解這一演進(jìn)方向是有益的。最后關(guān)于“如何用SHA1下載資源”或“provide base commit sha1 for cherry-pick”這類搜索詞它們指向的是SHA1作為“唯一標(biāo)識符”的用法。在Git中你可以用提交的SHA1值來精確定位和操作某個(gè)提交。在有些下載鏈接中資源地址可能包含哈希值用于驗(yàn)證但這通常不是下載的主要手段而是下載后驗(yàn)證的手段。核心思想始終不變SHA生成的哈希值是一個(gè)強(qiáng)大、可靠的“數(shù)字指紋”是我們在數(shù)字世界中進(jìn)行身份識別、完整性驗(yàn)證和建立信任的基石。從棄用SHA1到擁抱SHA256正是這門技術(shù)不斷自我進(jìn)化、應(yīng)對挑戰(zhàn)的縮影。在實(shí)際工作中堅(jiān)持使用SHA256對密碼存儲采用加鹽或?qū)S煤瘮?shù)你就能為你的系統(tǒng)打下堅(jiān)實(shí)的安全基礎(chǔ)。

相關(guān)新聞

高校數(shù)字化通識教育的標(biāo)準(zhǔn)化配套路徑

高校數(shù)字化通識教育的標(biāo)準(zhǔn)化配套路徑

數(shù)字化崗位需求持續(xù)擴(kuò)張背景下,高校通用AI教學(xué)資源供給不足的矛盾逐步凸顯。教育部2025年高校畢業(yè)生就業(yè)質(zhì)量調(diào)研數(shù)據(jù)顯示,經(jīng)管、文法、普通工科61.4%的應(yīng)屆生崗位,明確要求求職者掌握基礎(chǔ)AI工具操作能力,但國內(nèi)超七成本科院校未開…

2026/8/1 1:29:36 閱讀更多
Git常用誤區(qū)總結(jié)

Git常用誤區(qū)總結(jié)

1. .gitignore vs .git/info/exclude 情景:在使用claude時(shí)通常會在當(dāng)前工作區(qū)生成CLUADE.md,在提交時(shí)一不小心會將CLUADE.md也提交到倉庫。 解決方法:使用.git/info/exclude 增加提交commit時(shí)應(yīng)該忽略的文件。它的特點(diǎn)是本地私有管理。而.git…

2026/8/1 1:29:36 閱讀更多
Fn+Q野獸模式修復(fù)方法

Fn+Q野獸模式修復(fù)方法

聯(lián)想小新 FnQ 野獸模式無法開啟 - 解決方案 2026/7/4 問題現(xiàn)象 按 FnQ 組合鍵無反應(yīng),無法切換野獸模式。 根本原因 Lenovo Notebook ITS Service 服務(wù)未運(yùn)行或未設(shè)置為自動啟動。 成功解決方案 第一步:啟用 ITS 服務(wù) 按 WinR,輸入 services.m…

2026/8/1 1:19:36 閱讀更多
I/O總線信號分線盒 M12/M8集線器解析!

I/O總線信號分線盒 M12/M8集線器解析!

在工業(yè)自動化現(xiàn)場,傳感器與執(zhí)行器星羅棋布。若每根線纜都直連控制柜,千平車間將變成線纜的海洋——布線耗時(shí)、故障難查、維護(hù)成本高昂。I/O總線信號分線盒(M12/M8集線器)正是為解決此痛點(diǎn)而生:它將分散的IO信號就近匯集…

2026/8/2 8:55:19 閱讀更多
工業(yè)AI邊緣設(shè)備刷機(jī)實(shí)戰(zhàn):從Jetson Orin NX系統(tǒng)部署到優(yōu)化

工業(yè)AI邊緣設(shè)備刷機(jī)實(shí)戰(zhàn):從Jetson Orin NX系統(tǒng)部署到優(yōu)化

1. 項(xiàng)目概述:為工業(yè)AI邊緣設(shè)備注入靈魂最近在折騰一塊來自Jetson生態(tài)的工業(yè)級AI計(jì)算設(shè)備——reComputer AI Industrial R2000。這玩意兒本質(zhì)上是一個(gè)基于NVIDIA Jetson Orin NX模組的工業(yè)載板,性能強(qiáng)悍,專為苛刻的工業(yè)環(huán)境設(shè)計(jì)。但拿到手的時(shí)…

2026/8/2 8:55:19 閱讀更多
邏輯函數(shù)化簡:從公式法到卡諾圖的數(shù)字電路設(shè)計(jì)核心技能

邏輯函數(shù)化簡:從公式法到卡諾圖的數(shù)字電路設(shè)計(jì)核心技能

1. 項(xiàng)目概述:從“會算”到“會變”的思維躍遷剛接觸數(shù)字電路的朋友,可能都有過這樣的經(jīng)歷:面對一個(gè)邏輯函數(shù)表達(dá)式,感覺每個(gè)字母和符號都認(rèn)識,但組合在一起就像一團(tuán)亂麻,不知道從何下手。課本上告訴你&…

2026/8/2 8:55:19 閱讀更多
C語言volatile與extern關(guān)鍵字:底層原理、應(yīng)用場景與實(shí)戰(zhàn)避坑指南

C語言volatile與extern關(guān)鍵字:底層原理、應(yīng)用場景與實(shí)戰(zhàn)避坑指南

1. 項(xiàng)目概述:為什么這兩個(gè)關(guān)鍵字值得深挖? 搞C語言開發(fā),尤其是嵌入式、驅(qū)動、操作系統(tǒng)內(nèi)核或者高性能服務(wù)端編程,你肯定不止一次在代碼里見過 volatile 和 extern 這兩個(gè)關(guān)鍵字。它們不像 int 、 if 、 for 那樣天天用&…

2026/8/2 8:55:19 閱讀更多
MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動化發(fā)布完整解決方案

MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動化發(fā)布完整解決方案

MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動化發(fā)布完整解決方案 【免費(fèi)下載鏈接】MoneyPrinterPlus AI一鍵批量生成各類短視頻,自動批量混剪短視頻,自動把視頻發(fā)布到抖音,快手,小紅書,視頻號上,賺錢從來沒有這么容易過! 支持本地語音模型chatTTS,fasterwhisper,…

2026/8/2 0:04:00 閱讀更多
3分鐘搞定!QQ空間歷史說說完整備份終極指南

3分鐘搞定!QQ空間歷史說說完整備份終極指南

3分鐘搞定!QQ空間歷史說說完整備份終極指南 【免費(fèi)下載鏈接】GetQzonehistory 獲取QQ空間發(fā)布的歷史說說 項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾想過,那些年發(fā)過的QQ空間說說,那些記錄青春的文字…

2026/8/2 0:04:01 閱讀更多
MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動化發(fā)布完整解決方案

MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動化發(fā)布完整解決方案

MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動化發(fā)布完整解決方案 【免費(fèi)下載鏈接】MoneyPrinterPlus AI一鍵批量生成各類短視頻,自動批量混剪短視頻,自動把視頻發(fā)布到抖音,快手,小紅書,視頻號上,賺錢從來沒有這么容易過! 支持本地語音模型chatTTS,fasterwhisper,…

2026/8/2 0:04:00 閱讀更多
3分鐘搞定!QQ空間歷史說說完整備份終極指南

3分鐘搞定!QQ空間歷史說說完整備份終極指南

3分鐘搞定!QQ空間歷史說說完整備份終極指南 【免費(fèi)下載鏈接】GetQzonehistory 獲取QQ空間發(fā)布的歷史說說 項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾想過,那些年發(fā)過的QQ空間說說,那些記錄青春的文字…

2026/8/2 0:04:01 閱讀更多
AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O分配PCB板是應(yīng)用材料(Applied Materials)公司生產(chǎn)的一款用于半導(dǎo)體設(shè)備的I/O信號分配電路板。該型號(0100-02186)的核心特點(diǎn)如下:專用于Endura等半導(dǎo)體工藝腔室。集成信號路由與分配功能。連接控制…

2026/8/2 2:51:21 閱讀更多
Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動機(jī)

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動機(jī)

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動機(jī)是日本日清(Nissei)品牌的一款工業(yè)用三相異步電機(jī),適用于自動化設(shè)備及通用機(jī)械驅(qū)動。該型號(FFMN-32L-10-T0 40AX)的核心特點(diǎn)如下:三相交流異步電動機(jī)。額定…

2026/8/2 2:52:49 閱讀更多