VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

密码算法的正确性和一致性检测

功能描述

Vastbase数据库支持密码算法的正确性和一致性检测功能,并提供了相应的内置函数可以测试sm2、sm3、sm4算法以及随机数生成。

该功能涉及到的相关函数如下表所示:

函数 函数描述 参数说明
cryptocard_gen_random(len) 提供密码卡产生随机数的功能。 len:要产生的随机数的长度。
取值范围:1~1024,其中1和1024可取。
cryptocard_hash(data_1,algorithm_1) 提供密码卡计算数据摘要的功能。
  • data_1:计算摘要的数据。
  • algorithm_1:加密算法名称,目前只支持sm3。
  • cryptocard_ecc_sign(data_2,keyidx,pucpwd) 提供密码卡生成数据签名的功能。
  • data_2:产生签名的数据。
    取值范围:要求数据长度为32字节。
  • keyidx:密码卡内部签名密钥对的索引。
  • pucpwd:签名密钥的私钥访问控制码。
    取值范围:密码卡上创建密钥时,由用户指定的控制码。
  • cryptocard_ecc_verify(data_2,keyidx,pucpwd,rvalue,svalue) 提供密码卡签名校验的功能。
  • data_2:产生签名的数据。
    取值范围:要求数据长度为32字节。
  • keyidx:密码卡内部签名密钥对的索引。
    取值范围:目前仅支持sm2密钥对。
  • pucpwd:签名密钥的私钥访问控制码。
    取值范围:密码卡上创建密钥时,由用户指定的控制码。
  • rvaue:数据签名中的r值,cryptocard_ecc_sign函数会输出此值。
  • svalue:数据签名中的s值,cryptocard_ecc_sign函数会输出此值。
  • cryptocard_encrypt(data_3,algorithm_2,key,iv) 提供密码卡数据加密的功能。
  • data_3:数据明文。
  • algorithm_2:加密算法名,目前仅支持sm4。
  • key:密钥。
    取值范围:长度为16的字符串。
  • iv:代表初始化向量,是函数的一个入参。
    取值范围:长度为16的字符串。
  • cryptocard_decrypt(data_4,algorithm_2,key,iv) 提供密码卡数据解密的功能。
  • data_4:数据密文。
  • algorithm_2:加密算法名,目前仅支持sm4。
  • key:密钥。
    取值范围:长度为16的字符串。
  • iv:代表初始化向量,是函数的一个入参。
    取值范围:长度为16的字符串。
  • 前置条件

    使用该功能必须配置光电安辰密码卡,并配置相关的系统环境变量,具体步骤如下:

    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)