日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

使用EVSM實(shí)現(xiàn)應(yīng)用層敏感數(shù)據(jù)加解密

更新時(shí)間:
重要

本文中含有需要您注意的重要提示信息,忽略該信息可能對(duì)您的業(yè)務(wù)造成影響,請(qǐng)務(wù)必仔細(xì)閱讀。

通過(guò)加密服務(wù),您能對(duì)應(yīng)用服務(wù)的數(shù)據(jù)進(jìn)行可靠的加解密運(yùn)算,實(shí)現(xiàn)數(shù)據(jù)保護(hù),同時(shí)滿(mǎn)足數(shù)據(jù)安全方面的監(jiān)管合規(guī)要求。本文介紹如何通過(guò)加密服務(wù)實(shí)現(xiàn)應(yīng)用服務(wù)數(shù)據(jù)的加解密。

背景信息

下圖為在應(yīng)用系統(tǒng)中實(shí)現(xiàn)敏感數(shù)據(jù)加密和解密的典型部署方案。敏感數(shù)據(jù)加密部署方案

數(shù)據(jù)加密流程

  1. 通過(guò)加密服務(wù)產(chǎn)生加密密鑰。

  2. 使用加密密鑰對(duì)應(yīng)用服務(wù)數(shù)據(jù)的明文進(jìn)行加密,產(chǎn)生應(yīng)用數(shù)據(jù)密文,并將應(yīng)用數(shù)據(jù)密文返回給應(yīng)用服務(wù)。

  3. 應(yīng)用服務(wù)把密文數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫(kù)。

數(shù)據(jù)解密流程

  1. 應(yīng)用系統(tǒng)從數(shù)據(jù)庫(kù)讀取已加密的密文數(shù)據(jù),并將應(yīng)用數(shù)據(jù)密文透?jìng)鹘o云密碼機(jī)進(jìn)行解密。

  2. 密文解密后云密碼機(jī)將明文信息返回給應(yīng)用系統(tǒng)。

密碼機(jī)提供密鑰生成和管理、數(shù)據(jù)加密和解密功能。整個(gè)密碼算法運(yùn)算過(guò)程都在云密碼機(jī)中完成,數(shù)據(jù)通過(guò)密碼機(jī)處理后把密文數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)中,提高了系統(tǒng)的安全性。下圖為敏感數(shù)據(jù)加密的時(shí)序圖。敏感數(shù)據(jù)加密時(shí)序圖

資源準(zhǔn)備

開(kāi)始配置前,您需要準(zhǔn)備以下資源:

  • 數(shù)據(jù)庫(kù):用于對(duì)應(yīng)用數(shù)據(jù)密文進(jìn)行安全存儲(chǔ)和讀取。

  • 應(yīng)用服務(wù)器:用于部署用戶(hù)的業(yè)務(wù)系統(tǒng),支持如下系統(tǒng)。

    • 64位Linux系統(tǒng)

    • 32位或64位Windows系統(tǒng)

  • EVSM:TASS EVSM,用于提供加密和解密等密碼服務(wù)。

步驟一:配置密碼機(jī)客戶(hù)端

如果您的業(yè)務(wù)需要正式上線(xiàn),在購(gòu)買(mǎi)加密服務(wù)實(shí)例后,您需要配置密碼機(jī)客戶(hù)端。

  1. 登錄加密服務(wù)管理控制臺(tái),在頂部菜單欄,選擇目標(biāo)地域。

  2. 下載并安裝密碼機(jī)實(shí)例管理工具。

    1. 實(shí)例列表頁(yè)面,找到目標(biāo)密碼機(jī)實(shí)例。

    2. 單擊規(guī)格列的金融數(shù)據(jù)密碼機(jī),然后單擊下載密碼機(jī)實(shí)例管理工具

    3. 解壓獲取到的密碼機(jī)實(shí)例管理工具,選擇以下任一方式安裝密碼機(jī)實(shí)例管理工具。

      • 在本地終端安裝密碼機(jī)客戶(hù)端管理工具:安裝后需要通過(guò)VPN或物理專(zhuān)線(xiàn)使本地終端連接到密碼機(jī)實(shí)例所屬的VPC網(wǎng)絡(luò)。

      • 在Windows操作系統(tǒng)的ECS實(shí)例上安裝密碼機(jī)客戶(hù)端管理工具:安裝后需要通過(guò)本地終端遠(yuǎn)程登錄ECS實(shí)例,在ECS實(shí)例上操作密碼機(jī)實(shí)例管理工具。購(gòu)買(mǎi)ECS實(shí)例的具體操作,請(qǐng)參見(jiàn)自定義購(gòu)買(mǎi)實(shí)例

  3. 使用密碼機(jī)實(shí)例管理工具初始化密碼機(jī)實(shí)例。

    1. 登錄密碼機(jī)實(shí)例管理工具。具體操作,請(qǐng)參見(jiàn)密碼機(jī)實(shí)例管理工具用戶(hù)使用手冊(cè)的《登錄》章節(jié)。

    2. 初始化密碼機(jī)實(shí)例。具體操作,請(qǐng)參見(jiàn)密碼機(jī)實(shí)例管理工具用戶(hù)使用手冊(cè)的《出廠(chǎng)初始化》或《快速初始化》章節(jié)。

步驟二:初始化SDK

使用以下方法初始化SDK。

hsm=hsmGeneralFinance.getInstance("./cacipher.ini");

步驟三:調(diào)用Java接口生成密鑰

說(shuō)明

您也可以通過(guò)密碼機(jī)管理工具產(chǎn)生隨機(jī)密鑰。具體操作,請(qǐng)從解壓后的密碼機(jī)管理工具軟件包中獲取管理工具的用戶(hù)使用手冊(cè),參考用戶(hù)使用手冊(cè)中的《對(duì)稱(chēng)密鑰管理》章節(jié)。

調(diào)用以下Java接口生成工作密鑰。

hsm.genWorkKey(keyType,algFlag,keyIndex,keyLable);

接口定義

public String[] genWorkKey(String keyType,
                                    char keyFlag,
                                    int storeKeyIndex,
                                    String storeKeyLabel)
                              throws cn.tass.exceptions.TAException

請(qǐng)求參數(shù)

參數(shù)名稱(chēng)

參數(shù)類(lèi)型

參數(shù)描述

keyType

String

密鑰類(lèi)型。支持密鑰類(lèi)型編碼和密鑰類(lèi)型名稱(chēng)兩種格式。例如:ZEK/DEK可以傳"00A"和"ZEK/DEK"兩種格式。取值:

  • 000:ZMK/KEK

  • 001:ZPK

  • 002:PVK/TPK/TMK

  • 003:TAK

  • 008:ZAK

  • 009:BDK

  • 00A:ZEK/DEK

  • 00B:TEK

  • 011:KMC

  • 109:MK-AC/MDK

  • 10C:HMAC

  • 209:MK-SMI

  • 309:MK-SMC

  • 402:CVK

  • 409:MK-DAK

  • 509:MK-DN

algFlag

char

在LMK下加密的密鑰密文標(biāo)識(shí)。取值:

  • Z:?jiǎn)伪堕L(zhǎng)DES密鑰

  • X:雙倍長(zhǎng)3DES密鑰

  • Y:三倍長(zhǎng)3DES密鑰

  • U:雙倍長(zhǎng)的3DES算法密鑰,變種方式加密

  • T:三倍長(zhǎng)的3DES算法密鑰,變種方式加密

  • R:16字節(jié)SM4密鑰

  • P:16字節(jié)SM1密鑰

  • L:16字節(jié)AES密鑰

  • M:AES-192算法密鑰

  • N:AES-256算法密鑰

KeyIndex

int

密鑰存儲(chǔ)索引。取值范圍:1~2048。

KeyLabel

String

密鑰存儲(chǔ)標(biāo)簽。包含0~16個(gè)ASII字符。

說(shuō)明

在云密碼機(jī)內(nèi)部存儲(chǔ)密鑰時(shí)標(biāo)記密鑰的標(biāo)簽說(shuō)明。

請(qǐng)求示例

keyType:00A
algFlag:R
keyIndex:1
KeyLabel:test

返回值

  • 0號(hào)索引:密鑰在LMK下加密的密文。

  • 1號(hào)索引:密鑰校驗(yàn)值。

拋出異常

cn.tass.exceptions.TAException //接口自定義異常。

步驟四:配置Java接口

您可以通過(guò)文件形式或者內(nèi)容形式配置Java接口。

  • 文件形式:支持直接將配置文件絕對(duì)路徑傳入初始化接口內(nèi)。示例:

    [LOGGER]
    logsw=error
    logPath=./
    
    [HOST1]
    hsmModel=SJJ1310
    linkNum=-5
    host=192.168.19.19
    port=8018
    timeout=5
    ifHeart=yes

    文件格式要求:

    分類(lèi)

    要求

    示例

    注釋

    注釋行以符號(hào)“#”起始,不支持行內(nèi)注釋。

    #內(nèi)容形式中的屬性字段與文件形式中的屬性字段保持一致。

    配置域

    配置域以方括號(hào)“[”和“]”標(biāo)識(shí)。

    說(shuō)明

    配置域鍵名不區(qū)分大小寫(xiě),為了便于區(qū)分建議配置域使用大寫(xiě)。

    [LOGGER]

    配置項(xiàng)

    配置項(xiàng)格式:“鍵名(Key)=鍵值(Value)”。

    linkNum=-5

    配置內(nèi)容

    支持使用空白字符(空格或制表符)等對(duì)內(nèi)容進(jìn)行對(duì)齊操作。

    說(shuō)明
    • 您可以在接口內(nèi)拼裝字符串傳遞配置。

    • 使用“{”和“}”,表示包括所有內(nèi)容;使用“;”,表示換行。

    無(wú)

    Java接口中配置文件的基本屬性配置域包括日志屬性EVSM屬性應(yīng)用屬性等,日志屬性EVSM屬性的屬性字段說(shuō)明請(qǐng)參見(jiàn)下表。

    屬性分類(lèi)

    配置域

    屬性字段

    屬性字段說(shuō)明

    日志屬性

    [LOGGER]

    logsw

    設(shè)置日志類(lèi)別的開(kāi)關(guān),每種日志通過(guò)獨(dú)立的關(guān)鍵字開(kāi)啟。取值:

    • error:錯(cuò)誤日志

    • debug:調(diào)試日志

    logPath

    設(shè)置日志文件的保存目錄。

    說(shuō)明

    您需確保配置文件的目錄已經(jīng)存在,且應(yīng)用系統(tǒng)具有寫(xiě)入權(quán)限。

    EVSM屬性

    [HOSTn]

    說(shuō)明

    n為該EVSM在當(dāng)前配置文件中從1開(kāi)始的序號(hào),Java接口會(huì)按順序讀取多個(gè)EVSM的屬性,直到最后1個(gè)序號(hào)。

    hsmModel

    VSM類(lèi)型標(biāo)識(shí),用于指定EVSM驅(qū)動(dòng)。默認(rèn)值SJJ1310

    linkNum

    與云密碼機(jī)建立長(zhǎng)連接的數(shù)量。默認(rèn)值-10

    說(shuō)明

    數(shù)字前的負(fù)號(hào)(-)表示僅使用連接池,如果數(shù)字前沒(méi)有負(fù)號(hào)表示優(yōu)先使用連接池。優(yōu)先使用連接池時(shí),業(yè)務(wù)并發(fā)過(guò)高則Java接口中可能會(huì)創(chuàng)建短連接處理業(yè)務(wù),對(duì)系統(tǒng)資源造成較大的影響。

    host

    EVSM主機(jī)服務(wù)IP地址,支持設(shè)置成域名形式。

    port

    EVSM主機(jī)服務(wù)端口。

    timeout

    超時(shí)時(shí)間。單位為秒,默認(rèn)值6秒。

    connTimeout

    指定Java接口與逃生服務(wù)器建立網(wǎng)絡(luò)連接的超時(shí)時(shí)間。該屬性字段不存在時(shí),使用timeout的取值。

    readTimeout

    指定Java接口從逃生服務(wù)器讀取信息的超時(shí)時(shí)間。該屬性字段不存在時(shí),使用timeout的取值。

    socketProtocol

    通訊協(xié)議,支持TLSv1.2等版本協(xié)議。默認(rèn)值TCP

    ifHeart

    SDK對(duì)服務(wù)端的心跳探測(cè),默認(rèn)開(kāi)啟。

  • 內(nèi)容形式:支持直接將配置信息以字符串的形式傳入初始化接口內(nèi)。示例:

    //內(nèi)容形式中的屬性字段與文件形式中的屬性字段保持一致。
    Stringconfig=
    "{"
    +"[LOGGER];"
    +"logsw=error;logPath=./;"
    +"[HOST1];"
    +"hsmModel=SJJ1310;"
    +"host=192.168.19.19;"
    +"port=8018;"
    +"connTimeout=5;"
    +"}";

步驟五:調(diào)用Java接口進(jìn)行數(shù)據(jù)加解密

主要介紹了通過(guò)調(diào)用Java接口生成工作密鑰和進(jìn)行通用數(shù)據(jù)加解密的操作方法。

數(shù)據(jù)加密

調(diào)用以下Java接口進(jìn)行數(shù)據(jù)加密。

hsm.generalDataEnc(algType,keyType,sm4SymmKey,disperFactor,sessionType,sessionFactor,padFlag,inData,IV);

接口定義

public byte[] generalDataEnc(int algType,
                             String keyType,
                             Object key,
                             String disperFactor,
                             Int sessionType,
                             String sessionFactor,
                             Int padFlag,
                             byte[] inData,
                             String IV)
                      throws cn.tass.exceptions.TAException

請(qǐng)求參數(shù)

參數(shù)名稱(chēng)

參數(shù)類(lèi)型

參數(shù)描述

algType

int

加密算法模式。取值:

  • 0:ECB模式加密

  • 1:CBC模式加密

  • 2:CFB模式加密

  • 3:OFB模式加密

  • 4:CTR模式加密(16字節(jié)分組長(zhǎng)度)

keyType

String

加密數(shù)據(jù)的源密鑰類(lèi)型,支持密鑰類(lèi)型名稱(chēng)和密鑰類(lèi)型編碼兩種格式。例如:ZEK/DEK可以傳"00A"和"ZEK/DEK"兩種格式。取值:

  • 000:KEK

  • 109:MDK

  • 309:MK-SMC

  • 00A:ZEK/DEK

  • 00B:TEK

  • 011:KMC

key

Object

加密數(shù)據(jù)密鑰的索引或密文。

  • 當(dāng)隨機(jī)對(duì)稱(chēng)密鑰的入?yún)?shù)據(jù)類(lèi)型為int時(shí),通過(guò)密鑰索引調(diào)用密鑰。

  • 當(dāng)隨機(jī)對(duì)稱(chēng)密鑰的入?yún)?shù)據(jù)類(lèi)型為String時(shí),按LMK加密的密鑰密文調(diào)用密鑰。

disperFactor

String

密鑰分散因子的n級(jí)分散因子進(jìn)行串聯(lián),且每級(jí)分散因子必須為16個(gè)字節(jié)。

說(shuō)明

針對(duì)敏感數(shù)據(jù)加密場(chǎng)景該參數(shù)取值為空字符串或NULL。

sessionType

int

會(huì)話(huà)密鑰產(chǎn)生模式。

  • 0:不產(chǎn)生會(huì)話(huà)密鑰。

  • 1:ECB模式加密8字節(jié)會(huì)話(huà)密鑰因子,得到8字節(jié)會(huì)話(huà)密鑰。

  • 2:ECB模式加密16字節(jié)會(huì)話(huà)密鑰因子,得到16字節(jié)會(huì)話(huà)密鑰。

  • 3:密鑰的左右8字節(jié)異或,得到8字節(jié)會(huì)話(huà)密鑰。

  • 4:取密鑰的左8字節(jié)作為會(huì)話(huà)密鑰。

  • 5:CBC模式加密16字節(jié)會(huì)話(huà)密鑰因子,得到16字節(jié)會(huì)話(huà)密鑰。

說(shuō)明

針對(duì)敏感數(shù)據(jù)加密場(chǎng)景該參數(shù)取值為空字符串或NULL。

sessionFactor

String

會(huì)話(huà)密鑰因子。

  • 當(dāng)sessionType為1時(shí),該參數(shù)為8字節(jié)(16H)。

  • 當(dāng)sessionType為2時(shí),該參數(shù)為16字節(jié)(32H)。

  • 當(dāng)sessionType為5時(shí),該參數(shù)為16字節(jié)(32H)。

說(shuō)明

針對(duì)敏感數(shù)據(jù)加密場(chǎng)景該參數(shù)取值為空字符串或NULL。

padFlag

int

PAD填充標(biāo)識(shí)。取值:

  • 0:PBOC 2 .0填充模式

  • 1:ISO/IEC 9797-1的PADDING模式2

  • 2:ISO/IEC 9797-1的PADDING模式1

  • 3:ANSI X9.23

  • 4:PKCS#5

  • 5:NoPadding模式

  • 10:PBOC 3.0填充模式

  • 11:左填充+ISO/IEC 9797-1

說(shuō)明

針對(duì)敏感數(shù)據(jù)加密場(chǎng)景該參數(shù)取值為1。

inData

byte[]

輸入的明文數(shù)據(jù)。

說(shuō)明

您可以根據(jù)應(yīng)用業(yè)務(wù)自行輸入數(shù)據(jù)內(nèi)容。

IV

String

初始向量。僅當(dāng)algType取值為1234時(shí)支持該參數(shù)。

  • 密鑰算法為64分組,該參數(shù)為8字節(jié)(16H)。

  • 密鑰算法為128分組,該參數(shù)為16字節(jié)(32H)。

說(shuō)明

ECB加密算法模式不需要IV,該參數(shù)取值為空字符串或NULL。

請(qǐng)求示例

algType:1
keyType:"00A"
key:symmKey[0] //加密的對(duì)稱(chēng)密鑰密文,使用EVSM內(nèi)部的索引密鑰,使用內(nèi)部密鑰時(shí)為int類(lèi)型。
disperFactor:null
sessionType:0
sessionFactor:null
padFlag:1
inData:根據(jù)用戶(hù)業(yè)務(wù)自行輸入數(shù)據(jù)內(nèi)容。
IV:"00000000000000000000000000000000"

返回值

加密之后的密文數(shù)據(jù)。

拋出異常

cn.tass.exceptions.TAException //接口自定義異常。 

數(shù)據(jù)解密

調(diào)用以下Java接口進(jìn)行數(shù)據(jù)解密。

hsm.generalDataDec(algType,keyType,sm4SymmKey,disperFactor,sessionType,sessionFactor,padFlag,symmEnc,IV);

接口定義

public byte[] generalDataDec(int algType,
                            String keyType,
                             Object key,
                            String disperFactor,
                            int sessionType,
                            String sessionFactor,
                             int padFlag,
                            byte[] inData,
                             String IV)
                      throws cn.tass.exceptions.TAException

請(qǐng)求參數(shù)

參數(shù)名稱(chēng)

參數(shù)類(lèi)型

參數(shù)描述

algType

int

加密算法模式。取值:

  • 0:ECB模式加密

  • 1:CBC模式加密

  • 2:CFB模式加密

  • 3:OFB模式加密

  • 4:CTR模式加密(16字節(jié)分組長(zhǎng)度)

keyType

String

加密數(shù)據(jù)的源密鑰類(lèi)型,支持密鑰類(lèi)型名稱(chēng)和密鑰類(lèi)型編碼兩種格式。例如:ZEK/DEK可以傳"00A"和"ZEK/DEK"兩種格式。取值:

  • 000:KEK

  • 109:MDK

  • 309:MK-SMC

  • 00A:ZEK/DEK

  • 00B:TEK

  • 011:KMC

key

Object

加密數(shù)據(jù)密鑰的索引或密文。

  • 當(dāng)隨機(jī)對(duì)稱(chēng)密鑰的入?yún)?shù)據(jù)類(lèi)型為int時(shí),通過(guò)密鑰索引調(diào)用密鑰。

  • 當(dāng)隨機(jī)對(duì)稱(chēng)密鑰的入?yún)?shù)據(jù)類(lèi)型為String時(shí),按LMK加密的密鑰密文調(diào)用密鑰。

disperFactor

String

密鑰分散因子的n級(jí)分散因子進(jìn)行串聯(lián),且每級(jí)分散因子必須為16個(gè)字節(jié)。

說(shuō)明

針對(duì)敏感數(shù)據(jù)加密場(chǎng)景該參數(shù)取值為空字符串或NULL。

sessionType

int

會(huì)話(huà)密鑰產(chǎn)生模式。

  • 0:不產(chǎn)生會(huì)話(huà)密鑰。

  • 1:ECB模式加密8字節(jié)會(huì)話(huà)密鑰因子,得到8字節(jié)會(huì)話(huà)密鑰。

  • 2:ECB模式加密16字節(jié)會(huì)話(huà)密鑰因子,得到16字節(jié)會(huì)話(huà)密鑰。

  • 3:密鑰的左右8字節(jié)異或,得到8字節(jié)會(huì)話(huà)密鑰。

  • 4:取密鑰的左8字節(jié)作為會(huì)話(huà)密鑰。

  • 5:CBC模式加密16字節(jié)會(huì)話(huà)密鑰因子,得到16字節(jié)會(huì)話(huà)密鑰。

說(shuō)明

針對(duì)敏感數(shù)據(jù)加密場(chǎng)景該參數(shù)取值為空字符串或NULL。

sessionFactor

String

會(huì)話(huà)密鑰因子。

  • 當(dāng)sessionType為1時(shí),該參數(shù)為8字節(jié)(16H)。

  • 當(dāng)sessionType為2時(shí),該參數(shù)為16字節(jié)(32H)。

  • 當(dāng)sessionType為5時(shí),該參數(shù)為16字節(jié)(32H)。

說(shuō)明

針對(duì)敏感數(shù)據(jù)加密場(chǎng)景該參數(shù)取值為空字符串或NULL。

padFlag

int

PAD填充標(biāo)識(shí)。取值:

  • 0:PBOC 2 .0填充模式

  • 1:ISO/IEC 9797-1的PADDING模式2

  • 2:ISO/IEC 9797-1的PADDING模式1

  • 3:ANSI X9.23

  • 4:PKCS#5

  • 5:NoPadding模式

  • 10:PBOC 3.0填充模式

  • 11:左填充+ISO/IEC 9797-1

說(shuō)明

針對(duì)敏感數(shù)據(jù)加密場(chǎng)景該參數(shù)取值為1。

inData

byte[]

輸入的明文數(shù)據(jù)。

說(shuō)明

您可以根據(jù)應(yīng)用業(yè)務(wù)自行輸入數(shù)據(jù)內(nèi)容。

IV

String

初始向量。僅當(dāng)algType取值為1234時(shí)支持該參數(shù)。

  • 密鑰算法為64分組,該參數(shù)為8字節(jié)(16H)。

  • 密鑰算法為128分組,該參數(shù)為16字節(jié)(32H)。

說(shuō)明

ECB加密算法模式不需要IV,該參數(shù)取值為空字符串或NULL。

請(qǐng)求示例

algType:1
keyType:"00A"
key:symmKey[0] //加密的對(duì)稱(chēng)密鑰密文,使用EVSM內(nèi)部的索引密鑰,使用內(nèi)部密鑰時(shí)為int類(lèi)型。
disperFactor:null
sessionType:0
sessionFactor:null
padFlag:1
inData:自行輸入加密后的數(shù)據(jù)。
IV:"00000000000000000000000000000000"

返回值

解密后的數(shù)據(jù)。

拋出異常

cn.tass.exceptions.TAException //程序運(yùn)行異常。  

示例

public class SensitiveDataEnc {

    public static void main(String[] args) throws TAException {
        // 接口初始化,采用配置文件的方式。
        hsmGeneralFinance hsm = hsmGeneralFinance.getInstance("./cacipher.ini");
        // 接口初始化2,采用配置內(nèi)容的方式。
//        String config =
//                "{"
//                        + "[LOGGER];"
//                        + "logsw=error;logPath=./;"
//                        + "[HOST1];"
//                        + "hsmModel=SJJ1310;"
//                        + "host=192.168.19.19;"
//                        + "port=8018;"
//                        + "connTimeout=5;"
//                        + "}";
//
//        hsmGeneralFinance hsm = hsmGeneralFinance.getInstance(config);

        // 測(cè)試1產(chǎn)生隨機(jī)密鑰keyIndex為可變參數(shù)。
        // 當(dāng)該密鑰索引值取值為0時(shí),表示不需要加密機(jī)保存生成的該條隨機(jī)對(duì)稱(chēng)密鑰。
        // 當(dāng)keyIndex取值為1~2048時(shí),表示將對(duì)稱(chēng)密鑰儲(chǔ)存在加密機(jī)中,且執(zhí)行覆蓋操作(相同索引執(zhí)行覆蓋操作)。
        int keyIndex = 0;

        switch (keyIndex) {
            case 0:
                // 產(chǎn)生隨機(jī)SM4算法對(duì)稱(chēng)密鑰。
                String keyType = "00A";
                char algFlag = 'R';
                String keyLable = "sm4Key";
                // 調(diào)用產(chǎn)生隨機(jī)密鑰接口。
                String[] symmKey = hsm.genWorkKey(keyType, algFlag, keyIndex, keyLable);
                System.out.println("對(duì)稱(chēng)密鑰lmk下的密文值:" + symmKey[0]);
                System.out.println("對(duì)稱(chēng)密鑰校驗(yàn)值:" + symmKey[1]);

                // 測(cè)試2。
                String str = "要加密的數(shù)據(jù)";
                // CBC模式。
                int algType = 1;
                // 密鑰類(lèi)型固定。
                keyType = "00A";
                // 執(zhí)行加密的對(duì)稱(chēng)密鑰密文。
                String sm4SymmKey = symmKey[0];
                // 也可以使用加密機(jī)內(nèi)部的索引密鑰,使用內(nèi)部密鑰時(shí)為int類(lèi)型。
                String disperFactor = null;
                int sessionType = 0;
                String sessionFactor = null;
                // 遵循強(qiáng)制80填充。
                int padFlag = 1;
                byte[] inData = str.getBytes();
                String IV = "00000000000000000000000000000000";
                // 調(diào)用數(shù)據(jù)加密接口。
                byte[] symmEnc = hsm.generalDataEnc(algType, keyType, sm4SymmKey, disperFactor, sessionType, sessionFactor,
                        padFlag, inData, IV);
                System.out.println("16進(jìn)制字符串輸出對(duì)稱(chēng)加密結(jié)果:" + Forms.byteToHexString(symmEnc)
                        + ",如果進(jìn)行解密,可使用接口功能函數(shù)'Forms.hexStringToByte()'將16進(jìn)制字符串轉(zhuǎn)換為byte[]參與解密。");
                // 調(diào)用數(shù)據(jù)解密接口。
                byte[] symmDec = hsm.generalDataDec(algType, keyType, sm4SymmKey, disperFactor, sessionType, sessionFactor,
                        padFlag, symmEnc, IV);
                System.out.println("解密結(jié)果與加密數(shù)據(jù)比較結(jié)果:" + Arrays.equals(symmDec, inData));
                System.out.println("還原解密結(jié)果,通過(guò)字符集還原原文:" + new String(symmDec));
                break;
            // 此時(shí)生成對(duì)稱(chēng)密鑰到1號(hào)索引位置,若已經(jīng)存在,會(huì)執(zhí)行覆蓋操作。
            case 1:
                str = "要加密的數(shù)據(jù)";
                // CBC模式。
                algType = 1;
                // 密鑰類(lèi)型固定。
                keyType = "00A";
                // 執(zhí)行加密的對(duì)稱(chēng)密鑰密文,使用加密機(jī)內(nèi)部的索引密鑰,使用內(nèi)部密鑰時(shí)為int類(lèi)型。
                int sm4SymmKeyIndex = 1;
                disperFactor = null;
                sessionType = 0;
                sessionFactor = null;
                // 遵循強(qiáng)制80填充。
                padFlag = 1;
                inData = str.getBytes();
                IV = "00000000000000000000000000000000";
                // 調(diào)用數(shù)據(jù)加密接口。
                symmEnc = hsm.generalDataEnc(algType, keyType, sm4SymmKeyIndex, disperFactor, sessionType, sessionFactor,
                        padFlag, inData, IV);
                System.out.println("16進(jìn)制字符串輸出對(duì)稱(chēng)加密結(jié)果:" + Forms.byteToHexString(symmEnc)
                        + ",如果進(jìn)行解密,可使用接口功能函數(shù)'Forms.hexStringToByte()'將16進(jìn)制字符串轉(zhuǎn)換為byte[]參與解密。");
                // 調(diào)用數(shù)據(jù)解密接口。
                symmDec = hsm.generalDataDec(algType, keyType, sm4SymmKeyIndex, disperFactor, sessionType, sessionFactor,
                        padFlag, symmEnc, IV);
                System.out.println("解密結(jié)果與加密數(shù)據(jù)比較結(jié)果:" + Arrays.equals(symmDec, inData));
                System.out.println("還原解密結(jié)果,通過(guò)字符集還原原文:" + new String(symmDec));
                break;
            default:
                break;
        }

    }

}

步驟六:同步應(yīng)用系統(tǒng)密鑰

在部署密碼機(jī)實(shí)例時(shí),您需要同步應(yīng)用系統(tǒng)的密鑰和配置Java接口。應(yīng)用密鑰存儲(chǔ)在密碼機(jī)實(shí)例內(nèi)部和外部系統(tǒng)的同步方式不同。

密鑰存儲(chǔ)在密碼機(jī)實(shí)例內(nèi)部系統(tǒng)

您需要根據(jù)密鑰索引將應(yīng)用密鑰備份導(dǎo)出,然后通過(guò)密鑰恢復(fù)導(dǎo)入功能將備份密鑰導(dǎo)入到其他密碼機(jī)實(shí)例中,完成密鑰同步操作。以下內(nèi)容以從A密碼機(jī)實(shí)例導(dǎo)出應(yīng)用密鑰,并導(dǎo)入到B密碼機(jī)實(shí)例為例。

重要

應(yīng)用密鑰由隨機(jī)產(chǎn)生的備份密鑰加密,您可以將加密后的密文以文件的形式導(dǎo)出或存儲(chǔ)在UKEY中。同步密鑰時(shí),您需要將UKEY插入需要同步的設(shè)備中同步密鑰。

  1. 備份導(dǎo)出A密碼機(jī)實(shí)例的應(yīng)用密鑰。

    1. 打開(kāi)密碼機(jī)實(shí)例管理工具,通過(guò)A密碼機(jī)實(shí)例的IP地址登錄VSM管理系統(tǒng)。

      具體操作,請(qǐng)參見(jiàn)密碼機(jī)實(shí)例管理工具用戶(hù)使用手冊(cè)的《登錄》章節(jié)。

    2. 在頂部菜單欄,單擊密鑰管理頁(yè)簽,然后單擊備份導(dǎo)出

    3. 選擇導(dǎo)出密鑰類(lèi)型和索引對(duì)話(huà)框,根據(jù)實(shí)際需要選擇密鑰類(lèi)型并輸入密鑰索引,然后單擊確認(rèn)

      您可以選擇將密鑰備份保存到文件保存到UKEY內(nèi)。本文以將密鑰備份保存到文件為例進(jìn)行描述。選擇導(dǎo)出密鑰類(lèi)型

    4. 按照系統(tǒng)提示依次插入3個(gè)空UKEY并輸入口令,單擊下一步

      說(shuō)明

      密碼機(jī)實(shí)例將依次制作出3個(gè)密鑰備份密鑰KBK UKEY。建議3個(gè)KBK UKEY由3個(gè)密鑰管理員分別保管。

    5. 選擇要保存密鑰密文的文件,單擊下一步

      EVSM將導(dǎo)出全部應(yīng)用密鑰并保存到您選擇的文件中。

      說(shuō)明

      密鑰備份完成后,請(qǐng)您妥善保管3個(gè)KBK UKEY和密鑰備份文件,待密鑰恢復(fù)時(shí)使用。

  2. 將導(dǎo)出的應(yīng)用密鑰導(dǎo)入到B密碼機(jī)實(shí)例進(jìn)行恢復(fù)。

    1. 打開(kāi)密碼機(jī)實(shí)例管理工具,通過(guò)B密碼機(jī)實(shí)例的IP地址登錄VSM管理系統(tǒng)。

      具體操作,請(qǐng)參見(jiàn)密碼機(jī)實(shí)例管理工具用戶(hù)使用手冊(cè)的《登錄》章節(jié)。

    2. 在頂部菜單欄,單擊密鑰管理頁(yè)簽,然后選擇恢復(fù)導(dǎo)入 > 從文件中恢復(fù)密鑰

      說(shuō)明

      恢復(fù)密鑰時(shí)使用任意2個(gè)密鑰備份UKEY即可還原出原始的KBK文件,然后將密鑰恢復(fù)到其他密碼機(jī)實(shí)例內(nèi)部或者同步到熱備份的其他密碼機(jī)實(shí)例內(nèi)部。

    3. 按照系統(tǒng)提示依次插入任意2個(gè)KBK UKEY并輸入口令,單擊下一步

    4. 選擇要讀取的密鑰備份文件,等待系統(tǒng)完成應(yīng)用密鑰的恢復(fù),單擊完成

密鑰存儲(chǔ)在密碼機(jī)實(shí)例外部系統(tǒng)

當(dāng)應(yīng)用密鑰經(jīng)過(guò)本地主密鑰LMK(Local Master Key)分組加密保護(hù)后存儲(chǔ)在外部系統(tǒng),如果需要同步應(yīng)用系統(tǒng)密鑰,您還需要同步密碼機(jī)實(shí)例的域名主密鑰DMK(Domain Master Key)。您可以通過(guò)密碼機(jī)實(shí)例的原始初始化,來(lái)產(chǎn)生DMK成分的UKEY。

當(dāng)多個(gè)密碼機(jī)實(shí)例進(jìn)行密鑰備份時(shí),只需要在第一個(gè)密碼機(jī)實(shí)例上完成原始初始化后,對(duì)其他密碼機(jī)實(shí)例恢復(fù)初始化,即可完成多個(gè)密碼機(jī)實(shí)例的密鑰同步。以下內(nèi)容以在A密碼機(jī)實(shí)例進(jìn)行原始初始化,并在B密碼機(jī)實(shí)例恢復(fù)初始化為例。

  1. 在A密碼機(jī)實(shí)例上進(jìn)行原始初始化。

    警告

    原始初始化將清空密碼機(jī)實(shí)例內(nèi)的所有密鑰,如果您希望保存密碼機(jī)中的數(shù)據(jù),請(qǐng)使用UKEY備份。備份的具體操作請(qǐng)參見(jiàn)密碼機(jī)實(shí)例管理工具的用戶(hù)使用手冊(cè)。

    1. 打開(kāi)密碼機(jī)實(shí)例管理工具,通過(guò)A密碼機(jī)實(shí)例的IP地址登錄VSM管理系統(tǒng)。

      具體操作,請(qǐng)參見(jiàn)密碼機(jī)實(shí)例管理工具用戶(hù)使用手冊(cè)的《登錄》章節(jié)。

    2. 在頂部菜單欄,單擊密鑰管理頁(yè)簽,然后單擊原始初始化

    3. 在彈出的警示提示框,單擊下一步

    4. 根據(jù)系統(tǒng)提示,制作至少2個(gè)域名主密鑰DMK成份的UKEY。

      建議您采用3選2授權(quán)控制機(jī)制并制作3個(gè)授權(quán)UKEY。

      說(shuō)明

      具體操作,請(qǐng)參見(jiàn)密碼機(jī)實(shí)例管理工具用戶(hù)管理手冊(cè)的《原始初始化》章節(jié)。

  2. 對(duì)B密碼機(jī)實(shí)例進(jìn)行恢復(fù)初始化(即導(dǎo)入DMK)。

    警告

    恢復(fù)初始化將清空密碼機(jī)實(shí)例內(nèi)的所有密鑰,如果您希望保存密碼機(jī)中的數(shù)據(jù),請(qǐng)使用UKEY備份。備份的具體操作請(qǐng)參見(jiàn)密碼機(jī)實(shí)例管理工具的用戶(hù)使用手冊(cè)。

    1. 打開(kāi)密碼機(jī)實(shí)例管理工具,通過(guò)B密碼機(jī)實(shí)例的IP地址登錄VSM管理系統(tǒng)。

      具體操作,請(qǐng)參見(jiàn)密碼機(jī)實(shí)例管理工具用戶(hù)使用手冊(cè)的《登錄》章節(jié)。

    2. 在頂部菜單欄,單擊密鑰管理頁(yè)簽,然后單擊恢復(fù)初始化

    3. 在彈出的警示提示框,單擊下一步

    4. 恢復(fù)初始化-第一步對(duì)話(huà)框,輸入DMK成份UKEY數(shù)目,單擊下一步

    5. 恢復(fù)初始化-第二步對(duì)話(huà)框,依次插入n個(gè)成份UKEY并輸入U(xiǎn)KEY口令,單擊導(dǎo)入成份UKEY,密碼機(jī)實(shí)例將讀取UKEY內(nèi)的DMK成份數(shù)據(jù)。

    6. DMK成份導(dǎo)入完成后,單擊合成DMK

    7. DMK合成成功后,確定授權(quán)機(jī)制。

      • 如果您的其他密碼機(jī)實(shí)例共用一套授權(quán)UKEY,請(qǐng)選擇同步授權(quán)信息。您只需插入有效授權(quán)的UKEY并輸入口令,單擊完成,完成恢復(fù)初始化。

      • 如果您的每個(gè)密碼機(jī)實(shí)例都需要使用獨(dú)立的授權(quán)UKEY,選中制作新的授權(quán)UKEY,并從選擇授權(quán)機(jī)制列表中選擇請(qǐng)選擇1選1授權(quán)控制機(jī)制,制作授權(quán)UKEY完成恢復(fù)初始化。

  3. 在頂部菜單欄,單擊密鑰管理頁(yè)簽,然后單擊獲取DMK校驗(yàn)值

    當(dāng)DMK同步到多個(gè)密碼機(jī)實(shí)例時(shí),可以通過(guò)比對(duì)多個(gè)密碼機(jī)實(shí)例的DMK校驗(yàn)值來(lái)確定同步后的DMK是否一致。

  4. 密鑰管理頁(yè)簽,單擊導(dǎo)出DMK成份

    您可以將DMK成份導(dǎo)出到多個(gè)UKEY中,在原有密碼機(jī)實(shí)例的成份UKEY丟失或損壞的情況下,能夠重新合成出與原有密碼機(jī)實(shí)例同樣的DMK成份。

    重要

    導(dǎo)出DMK成份時(shí),不能保證DMK成份UKEY中的密鑰備份與原有密碼機(jī)實(shí)例的成份UKEY中的密鑰備份完全相同。