金融業務安全增強方案:國密SM4/SM3加密+硬件加密機HSM+動態密鑰管理+ShardingSphere加密

在這里插入圖片描述

國密SM4/SM3

SM4:對稱加密算法,分組長度128位,密鑰長度128位,適用于數據加密(如數據庫字段、通信報文)】
加密存儲:用戶身份證號、銀行卡號等敏感字段(配合ShardingSphere等中間件自動加解密)
通信安全:API傳輸敏感數據時加密報文Body。

//加密銀行卡號(SpringBoot+BouncyCastle Provider)
public class SM4Util{public static String encrypt(String plaintext,String key)throws Exception{Cipher cipher = Cipher.getInstance("SM4/ECB/PKCS5Padding","BC");/**private static final String ALGORITHM_NAME = "SM4";private static final String HSM_PROVIDER = "SunPKCS11-HSM";*///KeyStore keyStore = KeyStore.getInstance("PKCS11", HSM_PROVIDER);//SecretKey keySpec = (SecretKey) keyStore.getKey("sm4_key", null);SecretKeySpec keySpec = new SecretKeySpec(key,getBytes(),"SM4");cipher.init(Cipher.ENCRYPT_MODE, keySpec);byte[] encrypted = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8));return Base64.getEncoder().encodeToString(encrypted);}
}
#基于ShardingSphere的加密配置(YAML)
spring:shardingsphere:datasource:encrypt:encryptors:sm4_encryptor:type: SM4props:sm4.key: ${secure.key} # 密鑰從HSM獲取tables:t_user:columns:id_card:cipherColumn: id_card_cipherencryptorName: sm4_encryptorphone:cipherColumn: phone_cipherencryptorName: sm4_encryptor

SM3:哈希算法,輸出256位摘要,用于數據完整性校驗(如交易簽名、文件防篡改)
交易簽名:將交易流水號、金額、時間戳拼接后哈希,作為防篡改簽名
文件校驗:下載對賬文件時驗證SM3哈希值是否匹配

// 生成交易簽名(防止篡改)
public class SM3Util {public static String hash(String data) throws Exception {MessageDigest md = MessageDigest.getInstance("SM3", "BC");byte[] digest = md.digest(data.getBytes(StandardCharsets.UTF_8));return Hex.toHexString(digest);}
}

符合《中華人民共和國密碼法》及金融行業安全標準。
等保三級要求核心敏感數據必須使用國密算法或AES-256。

硬件加密機

HSM:專用硬件設備,用于安全生成/存儲密鑰、執行加密運算,提供物理級防護(如防拆機自毀)
常見廠商:Thales Luna HSMs、IBM Crypto Express、阿里云加密服務

密鑰管理

  • 根密鑰(Master Key)永不離開HSM,應用僅獲取加密后的臨時密鑰
  • 執行SM4/SM3運算時,由HSM硬件加速(提升10倍以上性能)
# 通過PKCS#11標準接口調用HSM(示例命令)
pkcs11-tool --module /usr/lib/libCryptoki2.so --login --pin 123456 \--generate-random 32 --output-file random.key

數字證書

  • 簽發金融級數字證書(如網銀U盾)
  • 區塊鏈交易簽名(避免私鑰泄漏風險)
// 從HSM獲取證書簽名(Java)
KeyStore keyStore = KeyStore.getInstance("PKCS11", "SunPKCS11-HSM");
keyStore.load(null, "hsm-password".toCharArray());
PrivateKey privateKey = (PrivateKey) keyStore.getKey("signing-key", null);
Signature signature = Signature.getInstance("SM3withSM2", "BC");
signature.initSign(privateKey);
signature.update(data.getBytes());
byte[] signed = signature.sign();

PCI DSS要求:信用卡相關密鑰必須存儲在HSM中
銀聯標準:跨境支付系統必須使用HSM保護密鑰

動態密鑰管理

動態密鑰:每次會話或交易生成臨時密鑰,通過密鑰派生函數(KDF)從主密鑰派生,有效期內自動失效
關鍵技術:密鑰輪換、前向保密(PFS)、密鑰分發協議(如KMIP)

支付交易動態密鑰

每筆支付交易使用唯一密鑰加密卡號,即使某次密鑰泄漏也不影響其他交易

# 使用HMAC-SM3派生會話密鑰(Python示例)
import hmac, hashlib
def derive_key(master_key, transaction_id):derived_key = hmac.new(master_key, transaction_id.encode(), hashlib.sm3).digest()return derived_key[:16]  # 取前128位作為SM4密鑰

數據庫列級加密

定期輪換密鑰(如每月更換),舊數據通過密鑰ID解密后重新加密

-- 動態密鑰管理方案(配合KMS)
CREATE TABLE users (id BIGINT,phone_cipher TEXT,  -- 使用動態密鑰加密key_id VARCHAR(64)  -- 記錄當前使用的密鑰版本
);

從HSM獲取密鑰

public class HsmKeyLoader{@PostConstructpublic void init(){String sm4Key = hsmClient.getKey("sm4_enc_key");// 通過HSM API獲取System.setProperty("shardingsphere.encrypt.encryptors.sm4_encryptor.props.sm4.key", sm4Key);}
}

巴塞爾協議:要求密鑰生命周期管理(生成、分發、輪換、銷毀)
GDPR:密鑰輪換周期不得超過90天

在這里插入圖片描述

ShardingSphere加密

寫入流程:
應用明文 → ShardingSphere攔截 → 加密字段替換為密文 → 數據庫存儲

查詢流程:
應用查詢條件 → ShardingSphere攔截 → 加密字段條件加密 → 數據庫查詢 → 返回結果解密 → 明文返回應用

一、依賴

<!-- ShardingSphere JDBC + 加密模塊 -->
<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId><version>5.3.2</version>
</dependency>

二、配置加密規則

spring:shardingsphere:datasource:names: dsds:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.jdbc.Driverjdbc-url: jdbc:mysql://localhost:3306/finance_dbusername: rootpassword: 123456rules:encrypt:encryptors:sm4_encryptor:  # 定義SM4加密器type: SM4props:sm4.key: 1234567890abcdef1234567890abcdef # 256-bit密鑰(需從HSM獲取)aes_encryptor:   # 定義AES加密器(備用)type: AESprops:aes.key.value: 1234567890abcdeftables:t_user:  # 用戶表加密配置columns:id_card:  # 身份證字段cipherColumn: id_card_cipher  # 密文存儲列encryptorName: sm4_encryptorphone:   # 手機號字段cipherColumn: phone_cipherplainColumn: phone_plain      # 保留明文列(可選,用于模糊查詢)encryptorName: aes_encryptor

三、數據庫表設計

CREATE TABLE t_user (id BIGINT PRIMARY KEY,name VARCHAR(100),id_card_cipher VARCHAR(200),  -- SM4加密后的密文phone_cipher VARCHAR(200),    -- AES加密后的密文phone_plain VARCHAR(20)       -- 明文(如需模糊查詢)
);

四、業務代碼

// 插入數據(無需手動加密)
@Repository
public interface UserRepository extends JpaRepository<User, Long> {@Query("INSERT INTO t_user (name, id_card, phone) VALUES (:name, :idCard, :phone)")void saveUser(@Param("name") String name, @Param("idCard") String idCard,  // 自動加密@Param("phone") String phone);
}// 查詢數據(自動解密)
public User getUserById(Long id) {return userRepository.findById(id).orElse(null); // 返回的idCard/phone已是明文
}

審計日志脫敏

// 使用ShardingSphere的SQL解析器攔截日志
@Bean
public ShardingSphereDataSource dataSource() throws SQLException {Properties props = new Properties();props.setProperty("sql.show", "true"); // 顯示SQL日志(自動脫敏)return ShardingSphereDataSourceFactory.createDataSource(dataSourceMap, Collections.singleton(encryptRule), props);
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/93670.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/93670.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/93670.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Chaos Vantage 2.8.1 發布:實時探索與材質工作流的全新突破

作為行業領先的實時光線追蹤渲染器&#xff0c;Chaos Vantage再添利器。2.8.1版本更新聚焦材質工作流、硬件效率與API拓展&#xff0c;為建筑可視化、動畫制作等領域帶來更流暢的操作體驗與更深層的定制化可能。 一、核心功能更新&#xff1a;讓創作更順暢 完整V-Ray材質節點支…

【集合框架List接口】

&#x1f449; 用 ArrayList 存數據&#xff0c;結果插入時卡住了&#xff1f; &#x1f449; 想刪除某個元素&#xff0c;卻發現索引錯亂了&#xff1f; &#x1f449; 不知道該用 ArrayList 還是 LinkedList&#xff0c;選錯了導致性能瓶頸&#xff1f;一、List 是什么&#…

《棒球百科》奧運會取消了棒球·野球1號位

?? 奧運會棒球消失&復活之謎&#xff01;深度揭秘全球體育權力游戲 ??? 2008年為何被踢出奧運&#xff1f;(Why Removed in 2008?)MLB的致命抵制? 奧運賽期撞車MLB常規賽白熱化階段&#xff01;? 球隊老板拒放巨星&#xff1a;2000年悉尼奧運美國隊僅剩"替補陣…

基于js和html的點名應用

分享一個在課堂或者是公司團建上需要點名的應用程序&#xff0c;開箱即用。1、雙擊打開后先選擇人員名單&#xff08;可以隨時更改的&#xff09;2、下面的滾動速度可以根據需求調整<!DOCTYPE html> <html lang"zh"> <head> <meta charset"…

【深度學習-基礎知識】單機多卡和多機多卡訓練

1. 單機多卡訓練&#xff08;Single Machine, Multi-GPU&#xff09; 概念 在同一臺服務器上&#xff0c;有多塊 GPU。一個訓練任務利用所有 GPU 并行加速訓練。數據集存放在本地硬盤或共享存儲上。 核心原理數據并行&#xff08;Data Parallelism&#xff09; 將一個 batch 劃…

數據庫原理及應用_數據庫基礎_第2章關系數據庫標準語言SQL_SQL語言介紹數據庫的定義和刪除

前言 "<數據庫原理及應用>(MySQL版)".以下稱為"本書"中2.1節和2.2節第一部分內容 引入 本書P40:SQL(Structure Query Language結構化查詢語言)是一種在關系數據庫中定義和操縱數據的標準語言,是用戶和數據庫之間進行交流的接口. ---SQL是一種語言,是…

實變函數中集合E的邊界與其補集的邊界是否相等

在實變函數&#xff08;或一般拓撲學&#xff09;中&#xff0c;給定一個集合 E \subseteq \mathbb{R}^n &#xff08;或更一般的拓撲空間&#xff09;&#xff0c;集合 E 的邊界&#xff08;boundary&#xff09;與 E 的補集 E^c 的邊界是否相等&#xff1f; 即&#x…

# C++ 中的 `string_view` 和 `span`:現代安全視圖指南

C 中的 string_view 和 span&#xff1a;現代安全視圖指南 文章目錄C 中的 string_view 和 span&#xff1a;現代安全視圖指南目錄1. 原始指針的痛點1.1 安全問題1.2 所有權不明確1.3 接口笨拙1.4 生命周期問題2. string_view 深入解析2.1 基本特性2.2 高效解析示例2.3 防止常見…

Linux學習-多任務(線程)

定義輕量級進程&#xff0c;實現多任務并發&#xff0c;是操作系統任務調度最小單位&#xff08;進程是資源分配最小單位 &#xff09;。創建由進程創建&#xff0c;屬于進程內執行單元。- 獨立&#xff1a;線程有8M 獨立棧區 。 - 共享&#xff1a;與所屬進程及進程內其他線程…

高級堆結構

一、二項堆&#xff08;Binomial Heap&#xff09;&#xff1a;理解「合并操作」的優化二項堆的核心優勢是高效合并&#xff0c;類似 “二進制加法”。我們通過「合并兩個二項堆」的偽代碼和步驟來理解&#xff1a;核心結構偽代碼&#xff1a;class BinomialTreeNode:def __ini…

系統學習算法 專題十七 棧

題目一&#xff1a;算法思路&#xff1a;一開始還是暴力解法&#xff0c;即遍歷字符串&#xff0c;如果出現當前位置的字符等于后面的字符&#xff0c;則刪除這兩個字符&#xff0c;然后再從頭遍歷&#xff0c;如此循環即可但是這樣時間復雜度很高&#xff0c;每刪除一次就從頭…

深入解析函數指針及其數組、typedef關鍵字應用技巧

目錄 一、函數指針變量的創建 1、什么是函數指針變量&#xff1f; 2、函數是否有地址&#xff1f; 3、創建函數指針變量 4、函數指針類型解析 二、函數指針變量的使用 三、兩段有趣的代碼 1、解釋 (*(void (*)())0)(); 2、解釋 void (*signal(int, void(*)(int)))(int…

k8s集群搭建一主多從的jenkins集群

方案 --------------------- | Jenkins Master | | - 持久化配置 |<---(hostpath 存儲) | - 自動容災 | --------------------|| Jenkins JNLP 通信| ----------v---------- ------------------- | Jenkins Agent | | Kubernetes Pl…

重溫k8s基礎概念知識系列三(工作負載)

文章目錄1、工作負載簡述2、Deployment1.1、創建 Deployment1.2、檢查 Deployment上線狀態3、StatefulSet4、DaemonSet3.1、創建 DaemonSet3.2、運行DaemonSet5、Job5.1、運行示例 Job5.2、檢查 Job 的狀態6、CronJob上一節&#xff0c;我們復習了Pod相關知識&#xff0c;大多情…

開源 Arkts 鴻蒙應用 開發(十八)通訊--Ble低功耗藍牙服務器

文章的目的為了記錄使用Arkts 進行Harmony app 開發學習的經歷。本職為嵌入式軟件開發&#xff0c;公司安排開發app&#xff0c;臨時學習&#xff0c;完成app的開發。開發流程和要點有些記憶模糊&#xff0c;趕緊記錄&#xff0c;防止忘記。 相關鏈接&#xff1a; 開源 Arkts …

Go語言并發編程 ------ 鎖機制詳解

Go語言提供了豐富的同步原語來處理并發編程中的共享資源訪問問題。其中最基礎也最常用的就是互斥鎖&#xff08;Mutex&#xff09;和讀寫鎖&#xff08;RWMutex&#xff09;。1. sync.Mutex&#xff08;互斥鎖&#xff09;Mutex核心特性互斥性/排他性&#xff1a;同一時刻只有一…

8月17日星期天今日早報簡報微語報早讀

8月17日星期天&#xff0c;農歷閏六月廿四&#xff0c;早報#微語早讀。1、《南京照相館》領跑&#xff0c;2025年暑期檔電影總票房破95億&#xff1b;2、神舟二十號圓滿完成第三次出艙任務&#xff1b;3、宇樹G1人形機器人100米障礙賽再奪金牌&#xff1b;4、廣東佛山新增報告基…

在QML中使用Chart組件

目錄前言1. 如何安裝 Chart 組件2. 創建 QML 工程時的常見問題3. 解決方案&#xff1a;改用 QApplication QQuickView修改主函數&#xff08;main.cpp&#xff09;4. QApplication 與 QGuiApplication 的差異為什么 Qt Charts 需要 QApplication&#xff1f;總結示例下載前言 …

【P40 6-3】OpenCV Python——圖像融合(兩張相同屬性的圖片按比例疊加),addWeighted()

P40 6-3 文章目錄import cv2 import numpy as npback cv2.imread(./back.jpeg) smallcat cv2.imread(./smallcat1.jpeg)#只有兩張圖的屬性是一樣的才可以進行溶合 print(back.shape) print(smallcat.shape)result cv2.addWeighted(smallcat, 0.7, back, 0.3, 0) cv2.imshow(…

傳輸層協議 TCP(1)

傳輸層協議 TCP&#xff08;1&#xff09; TCP 協議 TCP 全稱為 “傳輸控制協議(Transmission Control Protocol”). 人如其名, 要對數據的傳輸進行一個詳細的控制; TCP 協議段格式 ? 源/目的端口號: 表示數據是從哪個進程來, 到哪個進程去; ? 32 位序號/32 位確認號: 后面詳…