<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>可搜索加密 - tag - 沐木</title><link>https://oldletter.cn/tags/%E5%8F%AF%E6%90%9C%E7%B4%A2%E5%8A%A0%E5%AF%86/</link><description>可搜索加密 - tag - 沐木</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Sun, 10 Sep 2023 00:00:00 +0000</lastBuildDate><atom:link href="https://oldletter.cn/tags/%E5%8F%AF%E6%90%9C%E7%B4%A2%E5%8A%A0%E5%AF%86/" rel="self" type="application/rss+xml"/><item><title>可搜索加密：加密数据的模糊检索方案</title><link>https://oldletter.cn/posts/crypto-06-searchable-encryption/</link><pubDate>Sun, 10 Sep 2023 00:00:00 +0000</pubDate><author>mumu</author><guid>https://oldletter.cn/posts/crypto-06-searchable-encryption/</guid><description><![CDATA[<blockquote>
<p>作者:lin | 系列:密码学实战</p></blockquote>
<h2 id="一问题背景加密与检索的两难">一、问题背景:加密与检索的两难</h2>
<p>数据库安全的成熟实践是:敏感字段落盘前加密。比如用户的手机号、身份证号、姓名,写入数据库时用 AES 加密成一串乱码。</p>
<p>但业务马上就会遇到一个问题:</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-sql">
        <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-sql" data-lang="sql"><span class="line"><span class="cl"><span class="c1">-- 加密前,模糊查询很自然
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">SELECT</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">users</span><span class="w"> </span><span class="k">WHERE</span><span class="w"> </span><span class="n">name</span><span class="w"> </span><span class="k">LIKE</span><span class="w"> </span><span class="s1">&#39;%张%&#39;</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-- 加密后,name 字段变成了 &#39;a3f8b2c1d4e5...&#39;,LIKE 完全失效
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">SELECT</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">users</span><span class="w"> </span><span class="k">WHERE</span><span class="w"> </span><span class="n">name</span><span class="w"> </span><span class="k">LIKE</span><span class="w"> </span><span class="s1">&#39;%a3f8%&#39;</span><span class="p">;</span><span class="w">  </span><span class="c1">-- 这搜的是密文,不是张三</span></span></span></code></pre></div></div>
<p><strong>直接解密再搜索?</strong> 如果表有 1000 万行,每次查询都要全部解密再逐一比对,响应时间从毫秒级变成分钟级,完全不可接受。</p>
<p><strong>保留明文索引?</strong> 那加密等于白做&ndash;索引泄露的信息量和明文几乎一样。</p>
<p>这就是**可搜索加密(Searchable Encryption, SE)**要解决的核心矛盾:<strong>如何在不暴露明文的前提下,高效地对加密数据做检索?</strong></p>
<div class="details admonition info open">
    <div class="details-summary admonition-title">
        <i class="icon fas fa-info" aria-hidden="true"></i>适用场景<i class="details-icon fas fa-angle-right" aria-hidden="true"></i>
    </div>
    <div class="details-content">
        <div class="admonition-content">可搜索加密不是银弹。它更适合的场景是:数据必须落盘加密(合规要求),同时业务需要检索能力,且可以接受一定程度的信息泄露(比如搜索模式泄露)。如果你的数据完全不需要检索,直接加密存储就好,不需要这些技术。</div>
    </div>
</div>
<h2 id="二四种主流方案对比">二、四种主流方案对比</h2>
<h3 id="方案一桶索引bucket-index">方案一:桶索引(Bucket Index)</h3>
<p><strong>原理:</strong> 直接的思路&ndash;为每个关键词建立一个&quot;桶&quot;,查询时直接定位到桶。</p>]]></description></item></channel></rss>