AES加密和解密要求指南
<h1>接口安全加密和解密指南</h1>
<p><strong>重要说明</strong>:本文档中描述的AES加密和解密过程对于本系统的<strong>所有接口</strong>是<strong>强制性</strong>和<strong>不可忽视</strong>的。请确保在实现任何接口交互时,严格遵守以下指定的加密和解密标准。</p>
<h2>全局加密和解密要求</h2>
<p>每个接口在发送和接收数据时,必须实施以下AES加密和解密流程。这是确保数据传输安全的核心要求。</p>
<h3>关键配置</h3>
<ul>
<li><strong>加密模式</strong>:CBC(密码块链接)。</li>
<li><strong>填充方式</strong>:PKCS5。</li>
<li><strong>数据块大小</strong>:128位。</li>
<li><strong>密钥</strong>:略</li>
<li><strong>初始向量(IV)</strong>:略。</li>
</ul>
<h3>请求和响应格式(重要)</h3>
<p>所有请求和响应数据必须符合以下格式规范:</p>
<ul>
<li><strong>格式要求</strong>:数据包装在JSON对象中,使用<code>encryption</code>字段包含加密后的密文。
<ul>
<li>请求示例:<code>{&quot;encryption&quot;: &quot;&lt;加密后的Base64数据&gt;&quot;}</code></li>
<li>响应示例:<code>{&quot;encryption&quot;: &quot;&lt;加密后的Base64数据&gt;&quot;}</code></li>
</ul></li>
</ul>
<h3>加密流程</h3>
<ol>
<li><strong>生成密钥和IV</strong>:确保使用安全方式生成密钥和IV。</li>
<li><strong>数据加密</strong>:在发送请求前,对所有数据使用AES加密。</li>
<li><strong>封装请求</strong>:将加密后的数据放入<code>encryption</code>字段中发送。</li>
</ol>
<h4>加密示例</h4>
<p>假设您的原始请求JSON如下:</p>
<pre><code class="language-json">{
&quot;appKey&quot;: &quot;示例appKey&quot;,
&quot;deviceCode&quot;: &quot;示例deviceCode&quot;,
&quot;time&quot;: &quot;示例时间戳&quot;
}</code></pre>
<p>使用AES加密后,将加密数据封装在encryption(<code>&lt;加密后的Base64数据&gt;</code>)字段中:</p>
<pre><code class="language-json">{
&quot;encryption&quot;: &quot;DokeXjQkRp6zk3tJ0EUoDk8HZFYhhA/X5+n5Jmtugo7sD86diSywr+G25ja2+5Rj+b09DEadHgkGlkWNTy1uTgkZtK3hqq5SINyGAJywmDw=&quot;
}</code></pre>
<h3>解密流程</h3>
<ol>
<li><strong>接收数据</strong>:接收加密的JSON对象。</li>
<li><strong>提取密文</strong>:从<code>encryption</code>字段获取密文。</li>
<li><strong>数据解密</strong>:使用相同的密钥和IV解密,以获得原始数据。</li>
</ol>
<h4>解密示例</h4>
<p>假设您收到的加密响应JSON <code>&lt;加密后的Base64数据&gt;</code> 如下:</p>
<pre><code class="language-json">{
&quot;encryption&quot;: &quot;3bmumZQqFdSaK/2V+hq8RUT7SCWavUSWFT6CRdksyJ9VKgmv+zi0SA91sRRMyykxewIZT9/ma0YYwhokAMSVg3L+zBg2mTqLlwYnFg8DugfgG8s5g6IK7pmxmo/Z96bJfFXBk8EMV+zqO5tBgbZOWqDxM9PiIRMtKo6HU6e4KBsfmAumIxRnNr0ql3lmYy7H4fB9TsMV6HNcMX2Rkq24Eg==&quot;
}</code></pre>
<p>解密后,您将获取如下格式的原始数据:</p>
<pre><code class="language-json">{
&quot;code&quot;: &quot;000&quot;,
&quot;errorMessage&quot;: &quot;Success&quot;,
&quot;data&quot;: {
&quot;appKey&quot;: &quot;示例appKey&quot;,
&quot;deviceCode&quot;: &quot;示例deviceCode&quot;,
&quot;time&quot;: &quot;示例时间戳&quot;
}
}</code></pre>
<h3>JAVA示例代码</h3>
<pre><code class="language-java">public class AesUtil {
/**
* 偏移位
*/
public static final String VIPARA = &quot;xxxxxx&quot;;
/**
* 默认编码方式
*/
public static final String CHARSET = &quot;utf-8&quot;;
/**
* 密码
*/
public static final String DEFAULT_KEY = &quot;xxxxx&quot;;
/**
* AES 加密
*
* @param content 明文
* @param password 生成秘钥的关键字
* @return
*/
public static String aesEncrypt(String content, String password) {
try {
IvParameterSpec zeroIv = new IvParameterSpec(VIPARA.getBytes());
SecretKeySpec key = new SecretKeySpec(password.getBytes(), &quot;AES&quot;);
Cipher cipher = Cipher.getInstance(&quot;AES/CBC/PKCS5Padding&quot;);
cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv);
byte[] encryptedData = cipher.doFinal(content.getBytes(CHARSET));
return Base64.getEncoder().encodeToString(encryptedData);
} catch (Exception e) {
return null;
}
}
/**
* AES 解密
*
* @param content 密文
* @param password 生成秘钥的关键字
* @return
*/
public static String aesDecrypt(String content, String password) {
try {
byte[] byteMi = Base64.getDecoder().decode(content);
IvParameterSpec zeroIv = new IvParameterSpec(VIPARA.getBytes());
SecretKeySpec key = new SecretKeySpec(password.getBytes(), &quot;AES&quot;);
Cipher cipher = Cipher.getInstance(&quot;AES/CBC/PKCS5Padding&quot;);
cipher.init(Cipher.DECRYPT_MODE, key, zeroIv);
byte[] decryptedData = cipher.doFinal(byteMi);
return new String(decryptedData, &quot;utf-8&quot;);
} catch (Exception e) {
return null;
}
}
public static void main(String[] args) {
System.out.println(System.currentTimeMillis());
System.out.println(aesEncrypt(System.currentTimeMillis()+&quot;&quot;,DEFAULT_KEY));
}</code></pre>