<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>签名验签 - tag - 沐木</title><link>https://oldletter.cn/tags/%E7%AD%BE%E5%90%8D%E9%AA%8C%E7%AD%BE/</link><description>签名验签 - tag - 沐木</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Wed, 15 Jun 2022 00:00:00 +0000</lastBuildDate><atom:link href="https://oldletter.cn/tags/%E7%AD%BE%E5%90%8D%E9%AA%8C%E7%AD%BE/" rel="self" type="application/rss+xml"/><item><title>国密实战（二）：SM2 签名验签前后端对接全指南</title><link>https://oldletter.cn/posts/guomi-02-sm2-sign-verify/</link><pubDate>Wed, 15 Jun 2022 00:00:00 +0000</pubDate><author>mumu</author><guid>https://oldletter.cn/posts/guomi-02-sm2-sign-verify/</guid><description><![CDATA[<blockquote>
<p>作者：林 | 系列：国密实战 | 适合读者：Java 后端/架构师 + 前端开发者</p></blockquote>
<hr>
<h2 id="一背景与问题">一、背景与问题</h2>
<p>在很多业务场景中，前端需要对请求参数进行签名，后端进行验签，以确保数据完整性和防篡改。传统方案多使用 RSA 签名，但在信创项目中，SM2 签名验签成为必选项。</p>
<p><strong>典型场景</strong>：</p>
<ul>
<li>前端提交表单数据，附带 SM2 签名</li>
<li>后端验签通过后才处理业务逻辑</li>
<li>API 网关层面的请求签名校验</li>
<li>合同/文档电子签章</li>
</ul>
<p>前后端对接 SM2 签名验签的核心挑战：</p>
<ol>
<li><strong>库的选择</strong>：Java 端用什么库？前端用什么库？</li>
<li><strong>密钥格式约定</strong>：私钥和公钥的格式必须统一</li>
<li><strong>userId 的一致性</strong>：SM2 签名有一个独特的 <code>userId</code> 参数，两端必须一致</li>
<li><strong>hash 参数的一致性</strong>：是否对消息做预哈希，两端必须统一</li>
<li><strong>签名格式</strong>：<code>r || s</code> 拼接 vs DER 编码，两端必须约定</li>
</ol>
<p>本文将给出 Java（Hutool）+ TypeScript（sm-crypto）的完整对接方案。</p>
<hr>
<h2 id="二sm2-签名验签原理">二、SM2 签名验签原理</h2>
<h3 id="21-签名过程">2.1 签名过程</h3>
<p>SM2 签名过程比 ECDSA 多了一个 <strong>Z 值</strong>（用户标识哈希）的计算。完整流程如下：</p>
<p><strong>输入参数</strong>：</p>
<ul>
<li>待签名消息 M</li>
<li>用户标识 ID（默认 <code>&quot;1234567812345678&quot;</code>）</li>
<li>私钥 d（256 位整数）</li>
<li>公钥 P = d × G = (xA, yA）</li>
</ul>
<p><strong>步骤</strong>：</p>]]></description></item></channel></rss>