密码算法的正确性和一致性检测
功能描述
Vastbase数据库支持密码算法的正确性和一致性检测功能,并提供了相应的内置函数可以测试sm2、sm3、sm4算法以及随机数生成。
该功能涉及到的相关函数如下表所示:
函数 | 函数描述 | 参数说明 |
---|---|---|
cryptocard_gen_random(len) | 提供密码卡产生随机数的功能。 | len:要产生的随机数的长度。 取值范围:1~1024,其中1和1024可取。 |
cryptocard_hash(data_1,algorithm_1) | 提供密码卡计算数据摘要的功能。 |
|
cryptocard_ecc_sign(data_2,keyidx,pucpwd) | 提供密码卡生成数据签名的功能。 |
|
cryptocard_ecc_verify(data_2,keyidx,pucpwd,rvalue,svalue) | 提供密码卡签名校验的功能。 |
|
cryptocard_encrypt(data_3,algorithm_2,key,iv) | 提供密码卡数据加密的功能。 |
|
cryptocard_decrypt(data_4,algorithm_2,key,iv) | 提供密码卡数据解密的功能。 |
|
前置条件
使用该功能必须配置光电安辰密码卡,并配置相关的系统环境变量,具体步骤如下:
1、配置光电安辰密码卡。
2、获取光电安辰的硬件动态库文件(libskf.so、libsdf.so),并将库文件与数据库实例$GAUSSHOME/lib/postgresql
目录下的hwcipher.so放在同一目录下(可自定义路径)。
3、在~/.bashrc
文件中配置如下环境变量:
设置环境变量
CRYPTDEV_LIBPATH
为动态库所在路径(不需要包含动态库名称)。设置环境变量
CRYPTDEV_TYPE=gdaccard
表示使用光电安辰密码卡。
示例
前置步骤
1、服务器已安装配置光电安辰密码卡。
2、在~/.bashrc
文件中配置环境变量。
vi ~/.bashrc
添加如下内容(CRYPTDEV_LIBPATH已实际路径为准):
export CRYPTDEV_TYPE=gdaccard
export CRYPTDEV_LIBPATH=/home/wzr1
3、重新加载配置文件。
source ~/.bashrc
4、启动数据库服务。
vb_ctl start
功能使用示例
密码卡产生随机数。
select cryptocard_gen_random(2);
返回结果为:
cryptocard_gen_rasndom ------------------------ ivo= (1 rows)
密码卡计算数据摘要。
select cryptocard_hash(1234567,'sm3');
返回结果为:
cryptocard_hash ----------------------------------------------- axSfng41J17cDvSUGfEBA4S0N62Sc4hZjvWUm5Gwx2Y= (1 rows)
密码卡生成数据签名。
前提条件:已经通过密码卡创建加密密钥对,并记录密钥索引为001和签名私钥的私钥访问控制码为Aa123456。
select cryptocard_ecc_sign('abcdefghigklmnopabcdefghigklmnop','001','Aa123456');
显示结果如下,签名成功,返回R值和S值:
cryptocard_ecc_sign ----------------------------------------------------------------------------------------------------------- R_VALUE:cl6cqoorWCTc5qY2bPvUdhz7g30goKMB7YijDAlLhiU=,S_VALUE:FBCg/IkG80wXuqzDbGiT+69C2wjpaB2NPCVc1R3FLMo= (1 rows)
密码卡签名校验。
前提条件:已经通过密码卡创建加密密钥对,并记录密钥索引为001和签名私钥的私钥访问控制码为Aa123456。
select cryptocard_ecc_verify('abcdefghigklmnopabcdefghigklmnop','001','Aa123456','签名返回的R值','签名返回的S值');
当cryptocard_ecc_verify函数入参中签名返回的R值,签名返回的S值与密码卡生成数据签名时调用的函数cryptocard_ecc_sign的返回的R_VALUE、S_VALUE后跟的值一一对应,则校验结果为t。
签名返回的R值、 签名返回的S值与cryptocard_ecc_sign的返回的R_VALUE、S_VALUE后跟的值不对应,则校验结果为f。
密码卡数据加密。
select cryptocard_encrypt(1234567890,'sm4','1234567890123456','abcdefghigklmnop');
返回结果如下:
cryptocard_encrypt --------------------- IO8c+hz6ke7GIg== (1 rows)
密码卡数据解密。
select cryptocard_decrypt('IO8c+hz6ke7GIg==','sm4','1234567890123456','abcdefghigklmnop');
该函数入参
'IO8c+hz6ke7GIg=='
为cryptocard_encrypt函数加密后得到的结果。本例以明文为1234567890为例,加密后得到密文为IO8c+hz6ke7GIg==。返回结果如下:
cryptocard_decrypt ------------------ 1234567890 (1 rows)