国家医保的线上支付接口,需要签名算法SM2、加密算法SM4

​​​​​​目前已完成各地区国家医保在线支付,可通过dll,提供给第三方进行调用,如delphi,pb,asp等。技术交流可私信沟通。

  1. 安全规范
    1. 签名算法(SM2)
      1. 概述

根据SM2算法(Signature的algorithm选择SM3withSM2),签名报文。通过对报文数据筛选、排序和拼接,组成待签名报文数据。

        1. 请求参数签名
          1. 筛选

获取所有请求参数,不包括字节类型参数,如文件、字节流,剔除signData、encData、extra字段。

          1. 排序

将筛选的参数按照第一个字符的键值ASCII码递增排序(字母升序排序),如果遇到相同字符则按照第二个字符的键值ASCII码递增排序,以此类推。

          1. 拼接

将排序后的参数与其对应值,组合成“参数=参数值”的格式,并且把这些参数用&字符连接起来,最后拼接上应用密钥appSecret在“…参数=参数值…”后,此时生成的字符串为待签名字符串,将待签名字符串SM2运算,即是签名(signData)的值(“signData”、“encData”、“extra”参数不参与签名)。

JOSN对象签名规范(如data):内部按字母顺序升序排列空值不参与签名 将整理好的JSON内容,输出JSON字符串后拼接参与签名,例如下面的示例请求报文,参数值都是示例,开发者仅参考报文格式即可。

加签报文示例:

{

"appId":"43AF047BBA47FC8A1AE8EFB2XXXXXXXX",

"data":{"appId":"43AF047BBA47FC8A1AE8EFB2XXXXXXXX","appUserId":"o8z4C5avQXqC0aWFPf1Mzu6D7WCQ_bd","idNo":"350181199011193519","idType":"01","phoneNumber":"13763873033","userName":"测试"},

"encType":"SM4",

"signData":"URVQNdVNn5mz2EhKZhLTlXNwAWTSncFoSe8Ilx7jhn81eABJ46sdRRN1ZiAiQjPUTixG9bwqEhiJupHRGmyO5w==",

"signType":"SM2",

"timestamp":"20200207175759",

"version":"2.0.1"

}

组成的待签名字符串:

appId=43AF047BBA47FC8A1AE8EFB2XXXXXXXX&data={"appId":"43AF047BBA47FC8A1AE8EFB2XXXXXXXX","appUserId":"o8z4C5avQXqC0aWFPf1Mzu6D7WCQ_bd","idNo":"350181199011193519","idType":"01","phoneNumber":"13763873033","userName":"测试"}

&encType=SM4&signType=SM2&timestamp=20200207175759&version=2.0.1&key=4117E877F5FA0A0188891283E4B617D5

          1. 签名结果

使用各自语言对应的SM2签名函数,对拼接得出的待签名字符串使用私钥进行SM2签名后,再将字节码进行Base64编码,即是签名结果,如签名结果。

签名结果示例:

URVQNdVNn5mz2EhKZhLTlXNwAWTSncFoSe8Ilx7jhn81eABJ46sdRRN1ZiAiQjPUTixG9bwqEhiJupHRGmyO5w=

        1. 返回参数验签
          1. 筛选

获取所有请求参数,不包括字节类型参数,如文件、字节流,剔除signData、encData、extra字段。

          1. 排序

将筛选的参数按照第一个字符的键值ASCII码递增排序(字母升序排序),如果遇到相同字符则按照第二个字符的键值ASCII码递增排序,以此类推。

          1. 拼接

将排序后的参数与其对应值,组合成“参数=参数值”的格式,并且把这些参数用&字符连接起来,最后拼接上应用密钥appSecret在“…参数=参数值…”,此时生成的字符串为待签名字符串,将待签名字符串SM2运算,即是签名(signData)的值(“signData”、“encData”、“extra”参数不参与签名)。

请求报文示例:

{

"appId":"43AF047BBA47FC8A1AE8EFB2XXXXXXXX",

"data":{"appId":"43AF047BBA47FC8A1AE8EFB2XXXXXXXX","appUserId":"o8z4C5avQXqC0aWFPf1Mzu6D7WCQ_bd","idNo":"350181199011193519","idType":"01","phoneNumber":"13763873033","userName":"测试"},

"encType":"SM4",

"signData":"URVQNdVNn5mz2EhKZhLTlXNwAWTSncFoSe8Ilx7jhn81eABJ46sdRRN1ZiAiQjPUTixG9bwqEhiJupHRGmyO5w==",

"signType":"SM2",

"timestamp":"20200207175759",

"version":"2.0.1"

}

 

组成的待签名字符串:

appId=43AF047BBA47FC8A1AE8EFB2XXXXXXXX&data={"appId":"43AF047BBA47FC8A1AE8EFB2XXXXXXXX","appUserId":"o8z4C5avQXqC0aWFPf1Mzu6D7WCQ_bd","idNo":"350181199011193519","idType":"01","phoneNumber":"13763873033","userName":"测试"}

&encType=SM4&signType=SM2&timestamp=20200207175759&version=2.0.1&key=4117E877F5FA0A0188891283E4B617D5

          1. 签名结果

使用对应的SM2验签函数,对拼接得出的待签名字符串使用公钥进行SM2进行验签,对比验签内容的签名与返回报文里的signData字段比较是否验签通过。

      1. 加密算法(SM4)
        1. 概述

根据SM4加密算法,加密报文。通过对报文数据筛选、排序和拼接,组成待加密报文数据。

        1. 请求报文加密

1、组装请求报文 根据API列表定义参数,整理请求报文;

加密报文示例:

{

"appId":"43AF047BBA47FC8A1AE8EFB2XXXXXXXX",

"data":{"appId":"43AF047BBA47FC8A1AE8EFB2XXXXXXXX","appUserId":"o8z4C5avQXqC0aWFPf1Mzu6D7WCQ_bd","idNo":"350181199011193519","idType":"01","phoneNumber":"13763873033","userName":"测试"},

"encType":"SM4",

"signData":"URVQNdVNn5mz2EhKZhLTlXNwAWTSncFoSe8Ilx7jhn81eABJ46sdRRN1ZiAiQjPUTixG9bwqEhiJupHRGmyO5w==",

"signType":"SM2",

"timestamp":"20200207175759",

"version":"2.0.1"

}

2、将data字段值,转换为字符串jStr;

待加密串示例:

{"appId":"43AF047BBA47FC8A1AE8EFB2XXXXXXXX","appUserId":"o8z4C5avQXqC0aWFPf1Mzu6D7WCQ_bd","idNo":"350181199011193519","idType":"01","phoneNumber":"13763873033","userName":"测试"}

3、根据 SM4 加密算法,先使用appId(渠道id)作为Key加密appSecret(渠道秘钥)生成新的秘钥串。(补充:传入 SM4 加密算法长度秘钥为 32 位,实际底层算法秘钥应用长度为前 16 位);

4、使用3获得的报文加密密钥,截取新秘钥串的前32位作为SM4密钥,加密jStr(data字段值)字符串(补充:传入 SM4 加密算法秘钥长度为 32 位,实际底层算法秘钥应用长度为前 16 位),并将加密结果转换为大写,获得加密密文encData;

密文示例:

4470B6B96A8E0BADA051A318E6B6FBED66B9FC5AB2A4A3C66FDDD3C70BCADD6EF526AB57DC1DC916385CEF34843AABFCBAF8F1FDEA9DC51A2A56AB3EA3E170201E4EDD3137D6D1BA6A4A773F6F4872A718F56742E5052AD1C04E99C91EA048990F06A96E6E1E534E40BD28DFDC204ACA03CAE0DFE0DE5229EDADBD27BBD32DD4C3F9ADC833CD3CF01CD012CE1799BB6F

5、将加密结果encData,加入请求报文中,并清空报文的data字段;

加密请求报文示例:

{

"appId":"43AF047BBA47FC8A1AE8EFB2XXXXXXXX",

"encData":"64A9C5A7AB3AEA5FC01DE87025F999521C08D25DA13BD715D7E036A7D7C1DBCB6AB7914898A23A99C97EBEFE5277247AD7D0DD9B18F4DCC71A2C280C5143F25B857C795E6BA9F399652C3A4264FC2CBBA7E06B08E151362301659FC3F3773480966E8D19AB082B64A4F9B9BDBABCE57DC2CA95C9975090885AB286BB736BA3BB98F3540962552F40C8350926B93CD21CB7A624E6C4E41E349627E7B36B5C1B5F94604EDC42EA6034D63B2D387A87F42130F0D47B9445F9D729566FE183F9A959",

"encType":"SM4",

"signData":"URVQNdVNn5mz2EhKZhLTlXNwAWTSncFoSe8Ilx7jhn81eABJ46sdRRN1ZiAiQjPUTixG9bwqEhiJupHRGmyO5w==",

"signType":"SM2",

"timestamp":"20200207175759",

"version":"2.0.1"

}

6、返回报文解密;

响应报文示例:

{

"appId":"43AF047BBA47FC8A1AE8EFB2XXXXXXXX",

"encData":"64A9C5A7AB3AEA5FC01DE87025F999521C08D25DA13BD715D7E036A7D7C1DBCB6AB7914898A23A99C97EBEFE5277247AD7D0DD9B18F4DCC71A2C280C5143F25B857C795E6BA9F399652C3A4264FC2CBBA7E06B08E151362301659FC3F3773480966E8D19AB082B64A4F9B9BDBABCE57DC2CA95C9975090885AB286BB736BA3BB98F3540962552F40C8350926B93CD21CB7A624E6C4E41E349627E7B36B5C1B5F94604EDC42EA6034D63B2D387A87F42130F0D47B9445F9D729566FE183F9A959",

"encType": "SM4",

"code": "0",

"message": "成功",

"signData": " OTk0MUYwREIyODk1RDhDRDQ5NjQzRTU1RENCN0ZGMzdCRUY4MzFFNDMxMTM1OTY0MEM1MDk3N0E4REE2Nzk2QQ==",

"signType": "SM2",

"timestamp": "20161226093147927",

"success": true,
"version": "2.0.1"

}

加密密文数据enctData示例:

64A9C5A7AB3AEA5FC01DE87025F999521C08D25DA13BD715D7E036A7D7C1DBCB6AB7914898A23A99C97EBEFE5277247AD7D0DD9B18F4DCC71A2C280C5143F25B857C795E6BA9F399652C3A4264FC2CBBA7E06B08E151362301659FC3F3773480966E8D19AB082B64A4F9B9BDBABCE57DC2CA95C9975090885AB286BB736BA3BB98F3540962552F40C8350926B93CD21CB7A624E6C4E41E349627E7B36B5C1B5F94604EDC42EA6034D63B2D387A87F42130F0D47B9445F9D729566FE183F9A959

7、根据encType声明加密算法,先使用appId(渠道id)作为Key加密appSecret(渠道秘钥)生成新的秘钥串。(补充:传入 SM4 加密算法长度秘钥为 32 位,实际底层算法秘钥应用长度为前 16 位);

8、根据encType声明加密算法,使用7获取的报文解密密钥,解密encData获取明文字符串jStr示例:

{"appId":"43AF047BBA47FC8A1AE8EFB2XXXXXXXX","appUserId":"o8z4C5avQXqC0aWFPf1Mzu6D7WCQ_bd","idNo":"350181199011193519","idType":"01","phoneNumber":"13763873033","userName":"测试"}

9、将jStr转换为JSON赋值data,获取解密后返回报文示例:

 

{

"appId":"43AF047BBA47FC8A1AE8EFB2XXXXXXXX",

"data":{"appId":"43AF047BBA47FC8A1AE8EFB2XXXXXXXX","appUserId":"o8z4C5avQXqC0aWFPf1Mzu6D7WCQ_bd","idNo":"350181199011193519","idType":"01","phoneNumber":"13763873033","userName":"测试"},

"encType": "SM4",

"code": "0",

"message": "成功",

"signData": " OTk0MUYwREIyODk1RDhDRDQ5NjQzRTU1RENCN0ZGMzdCRUY4MzFFNDMxMTM1OTY0MEM1MDk3N0E4REE2Nzk2QQ==",

"signType": "SM2",

"timestamp": "20161226093147927",

"success": true,

"version": "2.0.1"

}

相关技术交流可私信。

 

国密SM4加解密SM2签名验签COM组件DLL.rar_SM4-其它文档类资源-CSDN下载提供给第三方软件,调用COM组件DLL方式进行实现,如delphi、PB等。调用方法与黑龙江省医保社SM4更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/wdsfeisng/31813059

 

提供给第三方软件,调用COM组件DLL方式进行实现,如delphi、PB等。调用方法与黑龙江省医保社保卡调用方式一致。各软件调用方法也可自行网上查询,如“delphi调用C#的COM组件DLL”。 基于C#编写的COM组件DLL,可实现SM2签名验签,SM4加解密,100%适用于黑龙江省国家医保接口中进行应用。 1、调用DLL名称:JQSM2SM4.dll 加解密类名:JQSM2SM4.SM2SM4Util CLSID=5B38DCB3-038C-4992-9FA3-1D697474FC70 2、GetSM2SM4函数说明 函数原型public string GetSM2SM4(string smType, string sM2Prikey, string sM4Key, string sInput) 1)参数一smType:填写固定字符串,识别功能,分别实现SM2签名SM4解密、SM4加密。SM2签名入参填写“SM2Sign”、SM4解密入参填写“SM4DecryptECB”、SM4加密入参填写“SM4EncryptECB”. 2)参数二sM2Prikey:SM2私钥 3)参数三sM4Key:SM4密钥 4)参数四sInput:当smType=SM2Sign,则sInput入参填写SM4加密串;当smType=SM4DecryptECB,则sInput入参填写待解密SM4密文串;当smType=SM4EncryptECB,则sInput入参填写待加密的明文串; 5)函数返回值:当smType=SM2Sign,则返回SM2签名信息;当smType=SM4DecryptECB,则返回SM4解密信息;当smType=SM4EncryptECB,则返回SM4加密信息;异常时,则返回“加解密异常:详细错误说明” 3、购买下载后,可加QQ65635204、微信feisng,免费提供技术支持。 4、注意事项: 1)基于.NET框架4.0编写,常规win7、win10一般系统都自带无需安装,XP系统则需安装;安装包详见压缩包dotNetFx40_Full_x86_x64.exe 2)C#编写的DLL,需要注册,解压后放入所需位置,使用管理员权限运行“JQSM2SM4注册COM.bat”即可注册成功,然后即可提供给第三方软件进行使用,如delphi、PB等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

feisng0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值