<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>SHA - tag - 沐木</title><link>https://oldletter.cn/tags/sha/</link><description>SHA - tag - 沐木</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Fri, 10 Feb 2023 00:00:00 +0000</lastBuildDate><atom:link href="https://oldletter.cn/tags/sha/" rel="self" type="application/rss+xml"/><item><title>散列函数：MD5、SHA、SM3 与 HMAC</title><link>https://oldletter.cn/posts/crypto-02-hash/</link><pubDate>Fri, 10 Feb 2023 00:00:00 +0000</pubDate><author>mumu</author><guid>https://oldletter.cn/posts/crypto-02-hash/</guid><description><![CDATA[<blockquote>
<p>作者：林 | 系列：密码学 | 适合读者：后端开发 / 安全工程师</p></blockquote>
<hr>
<h2 id="一什么是散列函数">一、什么是散列函数</h2>
<p>散列函数（Hash Function）将任意长度的输入映射为固定长度的输出，且这个过程<strong>不可逆</strong>。</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-text">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title=""><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">输入（任意长度）       →  散列函数  →  输出（固定长度）
</span></span><span class="line"><span class="cl">&#34;hello&#34;              →  SHA-256  →  2cf24dba5fb0a30e...（64 hex = 256 bit）
</span></span><span class="line"><span class="cl">&#34;hello world&#34;        →  SHA-256  →  b94d27b9934d3e08...（64 hex = 256 bit）
</span></span><span class="line"><span class="cl">整本《红楼梦》(2MB)   →  SHA-256  →  固定 64 hex 字符</span></span></code></pre></div></div>
<h3 id="11-密码学安全散列的四个性质">1.1 密码学安全散列的四个性质</h3>
<table>
  <thead>
      <tr>
          <th>性质</th>
          <th>含义</th>
          <th>被破坏的后果</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>单向性</strong>（Preimage Resistance）</td>
          <td>给定 h，找不到 m 使得 H(m)=h</td>
          <td>能从哈希值反推出原文</td>
      </tr>
      <tr>
          <td><strong>第二原像抗性</strong>（Second Preimage）</td>
          <td>给定 m1，找不到 m2≠m1 使得 H(m1)=H(m2)</td>
          <td>能伪造替换文件</td>
      </tr>
      <tr>
          <td><strong>抗碰撞性</strong>（Collision Resistance）</td>
          <td>找不到任意 m1≠m2 使得 H(m1)=H(m2)</td>
          <td>能伪造证书/签名</td>
      </tr>
      <tr>
          <td><strong>雪崩效应</strong>（Avalanche Effect）</td>
          <td>输入改 1 bit，输出至少变化 50%</td>
          <td>能通过输出推测输入特征</td>
      </tr>
  </tbody>
</table>
<hr>
<h2 id="二主流算法对比">二、主流算法对比</h2>
<h3 id="21-算法一览">2.1 算法一览</h3>
<table>
  <thead>
      <tr>
          <th>算法</th>
          <th>输出长度</th>
          <th>分组长度</th>
          <th>结构</th>
          <th>安全状态</th>
          <th>性能（相对）</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>MD5</td>
          <td>128 bit</td>
          <td>512 bit</td>
          <td>Merkle-Damgård</td>
          <td>❌ 碰撞已破解</td>
          <td>速度高</td>
      </tr>
      <tr>
          <td>SHA-1</td>
          <td>160 bit</td>
          <td>512 bit</td>
          <td>Merkle-Damgård</td>
          <td>❌ 碰撞已破解</td>
          <td>快</td>
      </tr>
      <tr>
          <td>SHA-256</td>
          <td>256 bit</td>
          <td>512 bit</td>
          <td>Merkle-Damgård</td>
          <td>✅ 安全</td>
          <td>中</td>
      </tr>
      <tr>
          <td>SHA-512</td>
          <td>512 bit</td>
          <td>1024 bit</td>
          <td>Merkle-Damgård</td>
          <td>✅ 安全</td>
          <td>64位机更快</td>
      </tr>
      <tr>
          <td>SHA-3(256)</td>
          <td>256 bit</td>
          <td>1088 bit</td>
          <td>Sponge（海绵结构）</td>
          <td>✅ 安全</td>
          <td>略慢</td>
      </tr>
      <tr>
          <td>SM3</td>
          <td>256 bit</td>
          <td>512 bit</td>
          <td>Merkle-Damgård</td>
          <td>✅ 安全</td>
          <td>与 SHA-256 相当</td>
      </tr>
      <tr>
          <td>BLAKE3</td>
          <td>256 bit</td>
          <td>64 byte</td>
          <td>Merkle Tree</td>
          <td>✅ 安全</td>
          <td>极快（可并行）</td>
      </tr>
  </tbody>
</table>
<h3 id="22-md5为什么不能再用">2.2 MD5：为什么不能再用</h3>
<p>MD5 的碰撞攻击已经非常成熟：</p>]]></description></item></channel></rss>