技术交流 支付二代信息安全及其代收付实现

  • 657 views
Uploaded on

 

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
657
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
6
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. 技术交流 - 二代支付信息安全及其代收付实现 李潜德 2012.7.30 广州金电图腾软件有限公司
  • 2. 问题域• 什么是电子信息安全• 支付二代改进了什么• 改进的理论支持是什么• 该理论支持有何实现• 如何学习该实现• 该实现如何应用到代收付
  • 3. 电子信息安全1. 确保电子信息在传输、存取和处理过程中,保持其保密性、完整性和可用性,并实现鉴别、授权 、访问控制,抗否认性及可服务性等安全功能。2. 基本内容:实体安全、运行安全、信息资产安全、人员安全3. 保证措施:机构安全制度建设(其中密钥管理:生成、存储保护、备份恢复、分发装载、使用更换 、销毁删除、归档终止);相关法律、法规、标准。
  • 4. 从支付接口看安全 - 支付一代证明接收者能够核实发送者发送了这样的消息,而且只发送了一次。全国押(还是地方?)密钥 -> 产生 MAC 。加押字串包含流水号。1. 完整 - 能够确保消息不被修改 -- OK2. 鉴别 - 能够确认消息的发送者身份 -- NO3. 防抵赖 - 能够防止消息发送者抵赖 -- NO4. 防抵赖 - 能够保证消息不被重放 -- OK
  • 5. 从支付接口看安全 - 支付二代数字签名。加签字串包含流水号。1. 完整 - 能够确保消息不被修改 -- OK2. 鉴别 - 能够确认消息的发送者身份 -- OK3. 防抵赖 - 能够防止消息发送者抵赖 -- OK4. 防抵赖 - 能够保证消息不被重放 -- OK
  • 6. 公钥基础设施 (PKI)
  • 7. 公钥基础设施( PKI )公钥基础设施是由公开密钥密码技术、数字证书、证书认证中心和关于公开密钥的安全策略等基本成分共同组成,管理密钥和证书的系统或平台。RSA :公开密钥密码技术中的一种。
  • 8. 数字证书认证机构( CA, Certificate Authority )负责发放和管理数字证书的权威机构,并作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任。CA 也拥有一个证书(内含公钥)和私钥。网上的公众用户通过验证 CA 的签字从而信任 CA ,任何人都可以得到 CA 的证书(含公钥),用以验证它所签发的证书。
  • 9. 数字证书证书实际是由证书签证机关( CA )签发的对用户的公钥的认证。包含用户的信息,用户的公钥,还有 CA 中心对该证书里面的信息的签名。常用证书文件后缀名.cer,.crt,.der - 二进制的 DER 文件格式,不包含私钥.pem - 对二进制的 DER 文件格式再用Base64 编码后的文件,不包含私钥.p7b,.p7c - PKCS#7 证书格式,仅包含证书和 CRL 列表信息,不包含私钥.pfx,p12 - KCS#12 文件 , 包含证书(公钥)和私钥(受密码保护),以及完整的证书链信息
  • 10. 证书链 (Certificate Chain)证书链由两个环节组成—信任锚( CA 证书)环节和已签名证书环节。自我签名的证书仅有一个环节的长度—信任锚环节就是已签名证书本身。证书链可以有任意环节的长度,所以在三节的链中,信任锚证书 CA 环节可以对中间证书签名;中间证书的所有者可以用自己的私钥对另一个证书签名。可以遍历证书链以验证有效性,有效的证书链就构成了信任链。
  • 11. 根证书根证书是 CA 认证中心给自己颁发的证书 , 是信任链的起始点。安装根证书意味着对这个 CA 认证中心的信任,表明您对该根证书以下所签发的证书都表示信任,而技术上则是建立起一个验证证书信息的链条,证书的验证追溯至根证书即为结束。
  • 12. 证书吊销列表CRL 一定是被 CA 所签署的,可以使用与签发证书相同的私钥,也可以使用专门的 CRL 签发私钥。 CRL中包含了被吊销证书的序列号。证书具有一个指定的寿命,但 CA 可通过称为证书吊销的过程来缩短这一寿命。 CA 发布一个证书吊销列表 (CRL) ,列出被认为不能再使用的证书的序列号。
  • 13. PKI 实现之一 -OPENSSL
  • 14. OpenSSL 简介 - 概览• 功能丰富且自包含的开源安全工具箱• 以 C 语言为开发语言
  • 15. OpenSSL 简介 - 关注功能• 非对称加解密算法• 数字证书编解码• 数字证书验证• PKCS7 标准实现• PKCS12 个人数字证书格式实现
  • 16. OpenSSL 简介 - 学习方法• Apps 包含工具源码• Demos 包含范例源 码
  • 17. OpenSSL 应用 - 初始结束• 初始化OpenSSL_add_all_algorithms();ERR_load_crypto_strings();• 结束EVP_cleanup();CRYPTO_cleanup_all_ex_data();ERR_remove_state(0);ERR_free_strings();
  • 18. OpenSSL 应用 - 错误处理• 打印当前错误ERR_print_errors_fp (gf_log_ptr);
  • 19. OpenSSL 应用 - 内存分配• 可以记录内存的分配与释放• 可以基于记录将内存泄露的情况打印出来
  • 20. OpenSSL 应用 - 内存分配• 打开内存跟踪记录 CRYPTO_malloc_debug_init(); CRYPTO_set_mem_debug_options(V_CRYPTO_MDEBUG_ALL); CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);• 申请内存 gs_msg_buf = OPENSSL_malloc(MSG_MAX_LEN);• 释放内存 OPENSSL_free(gs_msg_buf);• 打印内存泄露 CRYPTO_mem_leaks_fp(arch_trc_get_trc_file());[13:12:54] 3156 file=digest.c, line=305, thread=3764460, number=104, address=1102B9FB0[13:11:07] 383 file=mbfe2_acore_app.c, line=222, thread=3764460, number=6291456, address=1102C4FB06291560 bytes leaked in 2 chunks
  • 21. OpenSSL 应用 - 抽象 IO• 对常见 IO 的抽象封装• 可以组成管道
  • 22. OpenSSL 应用 - 抽象 IO- 内存 IO• 从内存中构建 IOinData = BIO_new_mem_buf(s_x509_pem, strlen(s_x509_pem));• 在其他函数中使用该 IOx509 = PEM_read_bio_X509(inData, NULL, NULL, NULL);• 释放该 IOBIO_free_all(inData);
  • 23. OpenSSL 应用 - 抽象 IO- 嵌套 IO• 从内存中构建 IOout = BIO_new(BIO_s_mem());• 创建嵌套 IOb64 = BIO_new(BIO_f_base64());out = BIO_push(b64, out);• 释放该 IOBIO_free_all(out);
  • 24. OpenSSL 应用 -PEM• Privacy Enhanced Mail , OpenSSL 的默认信 息存放方式• 包含如下信息 1) 内容类型 2) 头信息 3) 信息体
  • 25. OpenSSL 应用 -PEM• CFCA 根证书-----BEGIN CERTIFICATE-----^MMIICvDCCAiWgAwIBAgIEPPx1qzANBgkqhkiG9w0BAQUFADAgMQswCQYDVQQGEwJD^MTjERMA8GA1UEChMIQ0ZDQSBSQ0EwHhcNMDIwNjA0MDczOTIwWhcNMjIwNjA0MDgw^MOTIwWjAgMQswCQYDVQQGEwJDTjERMA8GA1UEChMIQ0ZDQSBSQ0EwgZ8wDQYJKoZI^MhvcNAQEBBQADgY0AMIGJAoGBALjj9EbWFRz6rj4a42KpSB+jPqoHnkjmr3S69P4A^Micz9r6ZfFat1SvjJAG4XjB69ejGczrP2Acp3JVyH3jDMXSa4EfEfw/Erom1ILaWy^MjKTl/Cs78oJMjGyiZT5CJ14gH6o9rVYMEr2FjH6a7SJKJ/P/YBiQzNh6h97gynIy^MJ5ChAgMBAAGjggEBMIH+MBEGCWCGSAGG+EIBAQQEAwIABzBCBgNVHR8EOzA5MDeg^MNaAzpDEwLzELMAkGA1UEBhMCQ04xETAPBgNVBAoTCENGQ0EgUkNBMQ0wCwYDVQQD^MEwRDUkwxMCsGA1UdEAQkMCKADzIwMDIwNjA0MDczOTIwWoEPMjAyMjA2MDQwODA5^MMjBaMAsGA1UdDwQEAwIBBjAfBgNVHSMEGDAWgBQAmjTyUflTFGF0bnKhBt7HgXAb^MvDAdBgNVHQ4EFgQUAJo08lH5UxRhdG5yoQbex4FwG7wwDAYDVR0TBAUwAwEB/zAd^MBgkqhkiG9n0HQQAEEDAOGwhWNi4wOjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEA^MJv+gsBZv4egVVt7qPYUM8M0rfT2TjUd/vm7l7kmfGHLz2hJR2fMhgMXo8sxPBA6D^ML3ZW08X+UA5Gsa34enwtkDEVTe1Nvpz6L+W1C9hWpzyKsK0HQbrC5xTLAcEl7nlt^MZb/JN44RbcevYcdAt3SyOAaoOtGljBQwFI0TFdMwHrg=^M-----END CERTIFICATE-----^M
  • 26. OpenSSL 应用 -PEM- 证书• 读取证书x509 = PEM_read_bio_X509(inData, NULL, NULL, NULL);• 保存证书err = PEM_write_bio_X509(bMem, x509);
  • 27. OpenSSL 应用 - 证书• 从证书获取公钥pubkey=X509_get_pubkey(x509);• 从证书获取颁发者name = X509_get_issuer_name(signer);• 释放证书结构X509_free(g_x509);
  • 28. OpenSSL 应用 - 证书仓库• 用于简化证书链等操作
  • 29. OpenSSL 应用 - 证书仓库• 搭建证书仓库g_X509_store = X509_STORE_new();• 设置检查所有证书是否撤销X509_STORE_set_flags(g_X509_store, X509_V_FLAG_CRL_CHECK);• 设置证书链检查深度X509_STORE_set_depth(g_X509_store, 10);• 设置回调函数,在回调函数中检查是否忽略错误X509_STORE_set_verify_cb_func(g_X509_store, _verify_callback);
  • 30. OpenSSL 应用 - 证书仓库• 指定证书搜索方法lookup=X509_STORE_add_lookup(g_X509_store, X509_LOOKUP_hash_dir());• 指定证书来源sprintf(szCACertFileName, "%s/keystore/cacerts", g_home);err = X509_LOOKUP_add_dir(lookup,szCACertFileName,X509_FILETYPE_PEM);
  • 31. OpenSSL 应用 -PKCS12• 一种交换数字证书的加 密标准• 用于描述个人身份信息用户公钥、私钥、证书等
  • 32. OpenSSL 应用 -PKCS12• 读取 PKCS12 信息p12 = d2i_PKCS12_fp(fp, NULL);• 解析 PKCS12 信息PKCS12_parse(p12, gf_PKCS12Password, &g_privkey, &g_x509, NULL)• 释放 PKCS12 内部结构PKCS12_free(p12);
  • 33. OpenSSL 应用 -EVP• 对编解码、摘要、加解密等提供统一函数 入口
  • 34. OpenSSL 应用 -EVP-Base64• 定义并初始化编码上下文EVP_ENCODE_CTX ectx;EVP_EncodeInit(&ectx);• 不断进行编码输出EVP_EncodeUpdate(&ectx, t, &ebuflen, f, n);• 结束编码EVP_EncodeFinal(&ectx, t+ebuflen, &ebuflen);
  • 35. OpenSSL 应用 -EVP-Base64• 定义并初始化解码上下文EVP_ENCODE_CTX ectx;EVP_DecodeInit(&ectx);• 不断进行解码输出EVP_DecodeUpdate(&ectx, t, &ebuflen, f, n);• 结束解码EVP_DecodeFinal(&ectx, t+ebuflen, &ebuflen);
  • 36. OpenSSL 应用 -EVP-Base64• 直接编码EVP_EncodeBlock(signB64,sign,signLen);• 直接解码len = EVP_DecodeBlock(sign, signB64, strlen(signB64));
  • 37. OpenSSL 应用 -EVP-Base64• 最大区别 第一种每 64 位会自动加上换行符 (n) ,方便阅读。第二种一长串输出。
  • 38. OpenSSL 应用 -EVP-MD5• 计算 MD5err = EVP_Digest(pDetailBgn, pTmp - pDetailBgn, md, NULL, EVP_md5(), NULL);
  • 39. OpenSSL 应用 -EVP- 裸签• 裸签EVP_MD_CTX md_ctx;EVP_SignInit (&md_ctx, EVP_sha1());EVP_SignUpdate (&md_ctx, pOrgData, nOrgDataSize);signDataSize = *pSignDataSize;err = EVP_SignFinal (&md_ctx, pSignData, &signDataSize, g_privkey);EVP_MD_CTX_cleanup(&md_ctx);
  • 40. OpenSSL 应用 -EVP- 裸验签• 裸验签EVP_MD_CTX md_ctx;EVP_VerifyInit(&md_ctx, EVP_sha1());EVP_VerifyUpdate(&md_ctx, pOrgData, nOrgDataSize);err = EVP_VerifyFinal (&md_ctx, pSignData, nSignDataSize, pubkey);EVP_MD_CTX_cleanup(&md_ctx);
  • 41. OpenSSL 应用 -EVP- 其他• 释放公私钥EVP_PKEY_free(g_privkey);
  • 42. OpenSSL 应用 -PKCS7• 加密消息的语法标准,由 RSA 安全体系在公钥加密系统中 交换数字证书产生的一种加密标准。
  • 43. OpenSSL 应用 -PKCS7• P7 分离式签名p7 = PKCS7_sign(g_x509, g_privkey, NULL, in, PKCS7_DETACHED | PKCS7_NOATTR);• 获取 P7 字串err = i2d_PKCS7_bio(out,p7);• 释放 P7 内部结构PKCS7_free(p7);
  • 44. OpenSSL 应用 -PKCS7• 从 P7 字串得到 P7 内部结构p7 = d2i_PKCS7_bio(inSign, NULL);• 验证err = PKCS7_verify(p7, NULL, g_X509_store, inData, NULL, 0);• 释放 P7 内部结构PKCS7_free(p7);
  • 45. OpenSSL 工具 -CRL 格式转换从 DER 格式转换到 PEM 格式openssl crl -inform DER -in crl.crl -outform PEM -out crl.pem
  • 46. OpenSSL 工具 - 证书格式转换从 DER 格式转换到 PEM 格式openssl x509 -inform DER -in der.cer -outform PEM -out pem.cer
  • 47. 代收付实现
  • 48. 代收付实现 - 登录 - 接口序 加签 或 报文要素 <XML Tag> 属性 类型 备注号 要素 Message root <LoginReq> [1..1] LoginRequest GroupHeader <GrpHdr> [1..1] 【业务头】 √ LoginInformation <LoginInf> [1..1] --LoginOperationType <LoginOprTp> [1..1] LoginOperationTypeCode 禁止中文 √ 操作类型
  • 49. 代收付实现 - 登录 - 接口 加签序号 OR 要素名称 XML Tag 属性 类型 备注 要素 MessageIdentification 报文标识号 <MsgId> [1..1] Max35Text 禁止中文 √ CreationDateTime 报文发送时间 <CreDtTm> [1..1] ISODateTime 禁止中文 √ InstructingParty <InstgPty> [1..1] --InstructingDirectParty 发起直接参与机构 <InstgDrctPty> [1..1] Max14Text 禁止中文 √ --InstructingParty 发起参与机构 <InstgPty> [1..1] Max14Text 禁止中文 √ InstructedParty <InstdPty> [1..1] --InstructedDirectParty 接收直接参与机构 <InstdDrctPty> [1..1] Max14Text 禁止中文 √ --InstructedParty 接收参与机构 <InstdPty> [1..1] Max14Text 禁止中文 √ SystemCode 系统编号 <SysCd> [1..1] SystemCode 禁止中文 √ Remark <Rmk> [0..1] Max256Text 允许中文 备注
  • 50. 代收付实现 - 登录 - 配置加签报 文static MSGSIGNMAPPING msgSignMapping[] ={ …. /* 签到签退请求报文 */ { "ccms.805.001.02", 1, NULL, xmlEntry_ccms_805}, ….};
  • 51. 代收付实现 - 登录 - 配置加签要 素/* 签到签退请求报文 */static XML_PATH_ENTRY xmlEntry_ccms_805[] ={ {"/Document/LoginReq/GrpHdr/MsgId", "", ""}, {"/Document/LoginReq/GrpHdr/CreDtTm", "", ""}, {"/Document/LoginReq/GrpHdr/InstgPty/InstgDrctPty","", ""}, {"/Document/LoginReq/GrpHdr/InstgPty/InstgPty","", ""}, {"/Document/LoginReq/GrpHdr/InstdPty/InstdDrctPty","", ""}, {"/Document/LoginReq/GrpHdr/InstdPty/InstdPty","", ""}, {"/Document/LoginReq/GrpHdr/SysCd","", ""}, {"/Document/LoginReq/LoginInf/LoginOprTp","", ""}, {"","", ""}};
  • 52. 代收付实现 - 登录 - 报文实例{H:02906581000018 BEPS BEPS20120425175450XMLccms.805.001.02 20120425MF100000001220120425MF10000000123U }^M{S:GHR4geKYh5mtnu9yEjrxpfX7inV7FyFHp0ErN2yI4bl/DJvn1udv/o2QeTpfh7+mLLhm2TQi5oX4AxjzdcqFhQE8uB1mfWSGgjJjcFOWbPXa10XLBxSuYMm/tFWdc38uJHBzFuX6wYogsaiXLmQV5bvkU518MEpQwZBTz5ZvjMU=}^M<?xml version="1.0" encoding="UTF-8"?>^M<Document xmlns="urn:cnaps:std:ccms:2010:tech:xsd:ccms.805.001.02" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">^M <LoginReq>^M <GrpHdr>^M <MsgId>2011110901000004</MsgId>^M <CreDtTm>2012-04-25T17:54:50</CreDtTm>^M <InstgPty>^M <InstgDrctPty>906581000018</InstgDrctPty>^M <InstgPty>906581000018</InstgPty>^M </InstgPty>^M <InstdPty>^M <InstdDrctPty>NT00</InstdDrctPty>^M <InstdPty>NT00</InstdPty>^M </InstdPty>^M <SysCd>BEPS</SysCd>^M <Rmk> 骞垮穅揲 ^ 佣琛 ^ 嚏 ^ 缘瀛 ^ 戌籢隅甞卒腑蹇 ^ 娩唬鎊远浠 ^ 劐癪祥葭錨劝绛鹃 ^ 繼 /Rmk>^M </GrpHdr>^M <LoginInf>^M <LoginOprTp>OT00</LoginOprTp>^M </LoginInf>^M </LoginReq>^M</Document>^M
  • 53. 代收付实现 - 登录 - 报文加签串[
  • 54. 代收付实现 - 裸签名int RawSign(int nSocketFd, unsigned char* pOrgData, int nOrgDataSize, char* sCertDN, unsigned char* pSignData, int*pSignDataSize){ …. /* 用私钥对数据进行裸签 */ EVP_SignInit (&md_ctx, EVP_sha1()); EVP_SignUpdate (&md_ctx, pOrgData, nOrgDataSize); signDataSize = *pSignDataSize; err = EVP_SignFinal (&md_ctx, pSignData, &signDataSize, g_privkey); /* 释放资源,避免内存泄露 */ EVP_MD_CTX_cleanup(&md_ctx); …. * pSignDataSize = signDataSize; return (0);}
  • 55. 代收付实现 - 函数调用链
  • 56. 代收付实现 - 继续了解可参考的独立程序SecureDemoSecureToolSVN 路径: http://56.16.32.156:8001/svn/code/mbfe2/Source/Main/src/app/secure
  • 57. 参考资料• 《 openssl 编程 .pdf 》 - 赵春平• mbfe2dev - 金电图腾• openssl-0.9.8u.tar.gz - www.openssl.org• 公钥密码技术讲义 - 四川大学计算机网络与安全研究所• 信息安全与加密解密核心技术 - 黄元飞• 百度百科• 维基百科• 二代接口文档
  • 58. 谢谢