spdatasecrity
注意:
对DATE类型字段加密,在添加加密规则时需要加上属性如 (NAME=phone,PLAIN=phone,CIPHER=c_phone,TYPE(NAME=SURSEN,PROPERTIES(t_order.birthday.isdate: 1)), t_order是表名,birthday是需要加密的date类型字段 其他不变
1.需要添加环境变量
//150.138.84.46:10083是密钥管理中心地址
KeyStoreService=http://150.138.84.46:12083/api/encryption/kms/v1/
//zookeeper连接地址
ZookeepConnect=localhost:2181
//表初始化,授权api的http端口,不设置默认8030
KeyApiPort=8030
//内存中的密钥超过n秒后清除,默认60
KeyExpiredTime=60
//字符串加密设置,不设置使用AES,想使用XOR加密,请设置
AlgorithmName=xor
//忽略无权限错误,默认 false无字段权限时,抛出错误,=true 则返回密文数据
IgnorePermissionErr=true
或者设置proxy启动时的java启动参数也可以:
-DKeyStoreService=http://150.138.84.46:10083/api/encryption/key/v1/
-DZookeepConnect=localhost:2181
-DKeyApiPort=8030
-DKeyExpiredTime=60
-DAlgorithmName=xor
-DIgnorePermissionErr=true
2.启动proxy
将解压后的jar,复制到proxy的lib目录下,启动proxy. 启动proxy后,会监听http://localhost/8030端口。接受表初始化,表授权请求。
3.设置加密规则
增加了字段脱敏规则设置,如:t_order.phone.mask= 1
表示数据表t_order的phone字段需要进行脱密,1表示脱敏规则号,目前固定填1
按照sphereex给的方式设置表的加密规则如:
ALTER ENCRYPT RULE t_user (
COLUMNS(
(NAME=`name`,PLAIN=`name`,CIPHER=c_name,TYPE(NAME=SURSEN,PROPERTIES(...)),
(NAME=age,PLAIN=age,CIPHER=c_age,TYPE(NAME=SURSEN,PROPERTIES(...)),
(NAME=phone,PLAIN=phone,CIPHER=c_phone,TYPE(NAME=SURSEN,PROPERTIES(t_order.phone.mask=1)),
(NAME=id_card,PLAIN=id_card,CIPHER=c_id_card,TYPE(NAME=SURSEN,PROPERTIES(...))
), QUERY_WITH_CIPHER_COLUMN=true);
4.在JDBC模式下配置脱敏,ss的jabc配置 文件encrypt.yaml如下
dataSources:
ds_0:
dataSourceClassName: com.zaxxer.hikari.HikariDataSource
driverClassName: com.mysql.jdbc.Driver
jdbcUrl: jdbc:mysql://127.0.0.1:3306/encrypt?serverTimezone=UTC&useSSL=false&useServerPrepStmts=true&cachePrepStmts=true&allowPublicKeyRetrieval=true
username: root
password: 123456
maximumPoolSize: 50
rules:
- !ENCRYPT
encryptors:
sursen_encryptor:
type: SURSEN
props:
t_order.mobile.mask: 1
tables:
t_order:
columns:
birthday:
dataType: DATE
cipherColumn: birthday_cipher
cipherDataType: BIGINT
encryptorName: sursen_encryptor
user_id:
cipherColumn: user_id
encryptorName: sursen_encryptor
mobile:
cipherColumn: mobile
encryptorName: sursen_encryptor
content:
cipherColumn: content_cipher
cipherDataType: VARCHAR(80) NOT NULL DEFAULT ''
encryptorName: sursen_encryptor
props:
sql-show: true
4.初始化表
上面的t_user表虽然设置了加密规则,但没指定密钥ID,暂时不能访问
初始化接口
curl -i -k -H "Content-type: application/json" -X POST -d '{"tabname":"t_user ","keyid":100,"fields":["name","age","phone","id_card"]}' http://localhost:8030/InitTable
tabname:要初始化的表名
keyid:密钥id,(当前登陆用户的id)
fields:要初始化的字段,上面规则里指定了4个字段加密,这里也必须把4个字段都填上,否则数据库读写还会有问题(没填的字段不能读写)
返回成功:{"code":0,"message":"OK"}
返回失败:{"code":100,"message":"已经初始化"}
可以在终端用curl直接发送初始化请求
表初始化完毕后,只要用户100(keyid)在登录状态,就可以读写该表
5.授权表
t_user被用户100初始化后,可以将权限授权给用户101
授权接口
curl -i -k -H "Content-type: application/json" -X POST -d '{"tabname":"t_user ","keyid":101,"fields":["name","age","id_card"]}' http://localhost:8030/AuthTable
tabname:要授权的表名,该表确定是已经被某个用户(如上面的100)初始化过,且该用户当前必须在登陆状态
keyid:密钥id,(当前必须登陆状态)
fields:要授权的字段,如上授权了3个字段
返回成功:{"code":0,"message":"OK"}
返回失败:{"code":100,"message":"已经初始化"}
可以在终端用curl直接发送初始化请求
授权成功后,100对 "name","age","phone","id_card"有权限
101对 "name","age","id_card"有权限
对于字段"name","age","id_card",100,101两个用户任意一个在登陆状态,都可访问
对于"phone",只有100在登陆状态才可访问
6.获取字段密钥接口
curl -i -k -H "Content-type: application/json" -X POST -d '{"tabname":"t_order","keyid":100}' http://localhost:8030/GetTableKey
返回
{
"code":0,
"message":{
"字段名1":"明文base64",
"字段名2":"明文base64",
....
}
}
字段密钥 = Base64.decodeBase64(sec);
code==0,成功
code!=0,错误
如:
{"code":100,
"message":"表名不对,或没被授权..."
}
7.列出用户授权状态
curl http://localhost:8030/ListAuth/101
返回:101拥有权限的表及字段
curl http://localhost:8030/ListAuth
返回:所有用户拥有权限的表及字段
8.数据库网关统计数据接口
GET proxyserver:8030/Statinfo/2023-12-11t13:01
时间格式:YYYY:MM:DDtHH:mm
返回json
{
code:0,
data:{
dbnum:0, //数据库个数,非累计数据
keynum:0, //密钥个数,非累计数据
encrypted:0, //加密字段总数,当前分钟之内
desensitized:0, //脱敏字段总数,当前分钟之内
watermarked:0, //水印字段总数,当前分钟之内
abnormal:0, //非法操作,当前分钟之内
abnormalDB:0 //异常访问数据库,当前分钟之内
}
}