# ClientRemoteEncryption 业务密钥用法

​ 调用服务端实现生成用户密钥,加解密等功能

# 生成用户密钥

  • 定义:
接口说明
接口名称 genUserKey
接口描述 生成用户密钥(数据密钥)
使用者 应用方
  • 输入参数:
参数 数据类型 说明
  • 返回类型:KMSUserKey
    返回用户密钥的加解密密钥密文 和 HMac密钥密文, 都需要存储在数据库

# 重新保护用户密钥

  • 定义:
接口说明
接口名称 reProtectUserKey
接口描述 重新保护用户密钥(数据密钥)
用户密钥是使用业务密钥保护的, 这里重新保护指的是申请了新的业务密钥,
使用新的业务密钥保护用户密钥, 用户密钥的实际内容不变
即使申请了新的业务密钥, 现有的用户密钥都是可以使用的,
如果怕有泄露的风险, 可以重新保护一下,
更好的建议是按周期申请新的用户密钥, 后续使用新的用户密钥
使用者 应用方
  • 输入参数:
参数 数据类型 说明
userkey String 用户密钥, BASE64格式
  • 返回类型:String
    返回 BASE64 格式的用户密钥, 需要存储在数据库

# 计算SM3HMAC值(输入为byte[])

  • 定义:
接口说明
接口名称 sm3HMAC
接口描述 使用 hmac key对输入数据计算 sm3hmac
使用者 应用方
  • 输入参数:
参数 数据类型 说明
data byte[] 要计算hmac的数据
outputFormat OutputFormat 输出格式 有长格式和短格式
  • 返回类型:String
    返回字符串格式的SM3HMAC值

# 计算SM3HMAC值(输入为Map<String,String>)

  • 定义:
接口说明
接口名称 sm3HMAC
接口描述 使用 hmac key对输入数据计算 sm3hmac
使用者 应用方
  • 输入参数:
参数 数据类型 说明
data Map<String,String> 数据库中的一行,包括需要进行完整性校验的字段
map 对应数据库密文的一行
map的value从这两个接口直接得到 行数据加密行数据加密并计算SM3HMAC
outputFormat OutputFormat 输出格式 有长格式和短格式
  • 返回类型:String
    返回字符串格式的SM3HMAC值

# 数据加密

  • 定义:
接口说明
接口名称 encryptBytes2Str
接口描述 对数据进行加密
使用者 应用方
  • 输入参数:
参数 数据类型 说明
data byte[] 需要加密的数据
outputFormat OutputFormat 输出格式 有长格式和短格式
  • 返回类型:String
    返回字符串类型的加密结果,内部为私有格式,不通用。
  • 注意:使用长格式输出时, 内部使用了随机的向量, 每次加密结果都不一样, 故无法用于有搜索的情况

# 数据解密

  • 定义:
接口说明
接口名称 decryptStr2Bytes
接口描述 对数据进行解密
使用者 应用方
  • 输入参数:
参数 数据类型 说明
ciphertext String 需要解密的数据,必须为 数据加密 返回的结果
  • 返回类型: byte[]
    返回byte[]类型的结果

# UTF8字符串加密

  • 定义:
接口说明
接口名称 encryptUTF8ToStr
接口描述 加密, 将 UTF-8 编码的字符串 加密后以字符串格式返回
使用者 应用方
  • 输入参数:
参数 数据类型 说明
plaintext String 需要加密的数据, 当UTF8字符串处理
outputFormat OutputFormat 输出格式 有长格式和短格式
  • 返回类型: String
    返回字符串, 密文为私有格式, 不通用
  • 注意:业务密钥 短格式 加密结果是不是BASE64
  • 注意:使用长格式输出时, 内部使用了随机的向量, 每次加密结果都不一样, 故无法用于有搜索的情况

# 解密为UTF8字符串

  • 定义:
接口说明
接口名称 decryptStrToUTF8
接口描述 解密, 将字符串的密文 解密后 以 UTF-8 编码的格式返回
使用者 应用方
  • 输入参数:
参数 数据类型 说明
ciphertext String 需要解密的数据,必须为 UTF8字符串加密 返回的结果
  • 返回类型: String
    返回UTF8格式的字符串

# 行数据加密

  • 定义:
接口说明
接口名称 encryptMap
接口描述 对数据库中的一行数据进行加密
使用者 应用方
  • 输入参数:
参数 数据类型 说明
data Map<String, String> Key为数据库的列名,
Value为列名对应的值, 按 UTF-8 处理
outputFormat OutputFormat 输出格式 有长格式和短格式
  • 返回类型: Map<String, String>

    返回Map<String, String>类型的加密结果,

    Key为数据库的列名

    Value为数据库列名对应的值的加密结果

  • 注意:使用长格式输出时, 内部使用了随机的向量, 每次加密结果都不一样, 故无法用于有搜索的情况

# 行数据解密

  • 定义:
接口说明
接口名称 decryptMap
接口描述 对数据库中的一行数据进行解密
使用者 应用方
  • 输入参数:
参数 数据类型 说明
data Map<String, String> Key为数据库的列名,
Value为列名对应的密文
  • 返回类型: Map<String, String>

    返回Map<String, String>类型的结果,

    Key为数据库的列名

    Value为数据库列名对应的值的解密结果, 按 UTF-8 格式返回

  • 注意:使用长格式输出时, 内部使用了随机的向量, 每次加密结果都不一样, 故无法用于有搜索的情况

# 行数据加密并计算SM3HMAC

  • 定义:
接口说明
接口名称 encryptMapWithSm3hmac
接口描述 对数据库中的一行数据进行加密,并计算sm3hmac值。
返回的map添加"sm3hmac"为key的一项返回
使用者 应用方
  • 输入参数:
参数 数据类型 说明
data Map<String, String> Key为数据库的列名,
Value为列名对应的值, 按 UTF-8 处理
outputFormat OutputFormat 输出格式 有长格式和短格式
  • 返回类型: Map<String, String>

    返回Map<String, String>类型的加密结果,

    Key为数据库的列名

    Value为数据库列名对应的值的加密结果,添加"sm3hmac"为key的一项返回

    Value不能单独更新,计算SM3HMAC的所有字段都当做是一个整体,需要重新计算SM3HMAC值,否则验证SM3HMAC会失败。

  • 注意:使用长格式输出时, 内部使用了随机的向量, 每次加密结果都不一样, 故无法用于有搜索的情况

# 行数据解密并验证SM3HMAC

  • 定义:
接口说明
接口名称 decryptMapAndVerifySm3hmac
接口描述 对数据库中的一行数据进行验证并解密
使用者 应用方
  • 输入参数:
参数 数据类型 说明
data Map<String, String> Key为数据库的列名,
Value为列名对应的密文
Key必须包含"sm3hmac",否则验证失败
  • 返回类型: Map<String, String>

    返回Map<String, String>类型的结果,

    Key为数据库的列名

    Value为数据库列名对应的值的解密结果, 按 UTF-8 格式返回

    如果SM3HMAC验证失败,不会返回解密结果

# 格式保留加密

  • 定义:
接口说明
接口名称 fpeEncrypt
接口描述 格式保留加密
使用者 应用方
  • 输入参数:
参数 数据类型 说明
simkeyFpeAlphabets List< SimkeyFpeAlphabet > 字符集, 大小写敏感
SimkeyFpeAlphabet支持的类型有:
Numeric 数字 0-9
LowerCaseLetter 小写字母 a-z
UpperCaseLetter 大写字母 A-Z
ChinaResidentIDNumber 居民身份证号码 0-9,X
UpperCaseHexNumeric 大写的十六进制字符 0-9,A-F
GB2312 GB/T 2312标准, 共收录6763个汉字
tweak byte[] 调整参数, 作用类似于对称加密里的向量
Tweak是任意长度的byte[],不是保密的, Tweak是为了解决因局部加密而导致结果冲突问题,通常情况下将数据的不可变部分作为Tweak
例如,在对手机号中间4位进行加密的场景中,132-1234-1111,132-1234-2222,如果没有tweak的参与,那么两者的加密结果肯定相同,因为key相同,被加密的原文都是1234,此时把手机号码的不可变部分1321111和1322222分别作为tweak参与加密,即可得到不一样的加密结果
注意解密时应使用加密时相同的tweak。
originalText String 原文, 每个字符都属于字符集里面的字符
  • 返回类型:String
    返回加密后的字符串, 加密后的字符串的字符串依然在 simkeyFpeAlphabets 里面 比如: 1234 fpe加密结果:3757

# 格式保留解密

  • 定义:
接口说明
接口名称 fpeDecrypt
接口描述 格式保留解密
使用者 应用方
  • 输入参数:
参数 数据类型 说明
simkeyFpeAlphabets List< SimkeyFpeAlphabet > 字符集, 大小写敏感
SimkeyFpeAlphabet支持的类型有:
Numeric 数字 0-9
LowerCaseLetter 小写字母 a-z
UpperCaseLetter 大写字母 A-Z
ChinaResidentIDNumber 居民身份证号码 0-9,X
UpperCaseHexNumeric 大写的十六进制字符 0-9,A-F
GB2312 GB/T 2312标准, 共收录6763个汉字
tweak byte[] 调整参数, 作用类似于对称加密里的向量
Tweak是任意长度的byte[],不是保密的, Tweak是为了解决因局部加密而导致结果冲突问题,通常情况下将数据的不可变部分作为Tweak
例如,在对手机号中间4位进行加密的场景中,132-1234-1111,132-1234-2222,如果没有tweak的参与,那么两者的加密结果肯定相同,因为key相同,被加密的原文都是1234,此时把手机号码的不可变部分1321111和1322222分别作为tweak参与加密,即可得到不一样的加密结果
注意解密时应使用加密时相同的tweak。
cipherText String 密文, 每个字符都属于字符集里面的字符
  • 返回类型:String
    返回加密后的字符串, 加密后的字符串的字符串依然在 simkeyFpeAlphabets 里面

    比如: 3757 fpe解密结果: 1234

# SM4 GCM 加密

  • 定义:
接口说明
接口名称 sm4GcmEncrypt
接口描述 SM4 GCM加密, 返回的是 对原始密文 直接 BASE64格式编码得到的字符串, 适用于数据加密传输
使用者 应用方
  • 输入参数:
参数 数据类型 说明
data byte[] 要加密的数据
iv byte[] 向量
aad byte[] 附加身份验证数据
  • 返回类型: String
    返回 String 类型的结果

# SM4 GCM 解密

  • 定义:
接口说明
接口名称 sm4GcmDecrypt
接口描述 SM4 GCM解密, 适用于数据加密传输
使用者 应用方
  • 输入参数:
参数 数据类型 说明
data String 要解密的数据
iv byte[] 向量
aad byte[] 附加身份验证数据
  • 返回类型: byte[]
    返回 byte[] 类型的结果