继蚂蚁集团宣布即将IPO后,以金融支付起家的京东数科也将于9月11日晚间上市。近年来,第三方支付业务资本规模不断扩大,支付业务体量稳步增长,“第三方支付”、“移动支付”成为年度热搜词。支付平台作为互联网产品及其商业化进程的信息流、资金流的支撑,也成为国内外各大互联网公司必建的基础平台之一。
安全交易是互联网产品电子商务发展的核心内容之一,而支付系统的安全是交易安全的关键。
对于从事支付行业的第三方支付机构来说,终端数据的安全防护无疑是支付业务开展的重要保障之一,也是安全防护墙的第一步。支付系统一般采用安全加密、访问授权、传输安全等方法来保障终端数据的安全。
本文选自《支付平台架构:业务、规划、设计与实现》一书,将详细介绍支付平台终端安全的技术实现。
终端安全技术实现
首先我们来说明一下本地加密存储的方法,加密方式有两种:对称加解密和非对称加解密。
实际场景:支付系统中有些配置文件需要加密存储到本地,比如跳转服务器的地址或者支付SDK的运行参数等,使用前需要解密,对于这种场景,对称加密算法比较合适。
当然也可以采用非对称加密,但由于非对称加密适用于安全级别要求较高的场景,运算速度较慢,且私钥一般不存储在终端,因此在技术选型上并不适合使用。
说到对称加密算法,有几种选项可供选择。
此处的终端安全示例代码以操作系统为例,使用Java实现安全加密、访问授权、传输安全等。
1. 中、低安全等级的数据(DES)
数据加密标准(DES)是一种采用对称密钥加密的块加密算法,其数据处理速度快,性能好,通常适用于对大块数据进行加密和解密的场景。
**该算法的明显缺点就是密钥较短,**这意味着可以被暴力破解,降低了加密的安全性,但是对于支付系统配置文件安全加密等场景还是比较适合的。
以下是基于系统的DES加密的代码实现:
对应的解密函数如下:
这样就实现了加密和解密的功能,只需要在加密时调用该函数,传入明文数据和8位的Key即可得到密文数据,然后再以相同的Key值和密文调用该函数即可完成密文解密,得到明文信息。
上述代码也是通过编码方式将二进制数据编码成可见的字符串数据,在系统(全称是.util.)中已经是一个内置的工具类编码转换算法,很多人把它当成加解密算法,但严格来说,它不能算是加解密算法,只能算是一个编码格式转换算法。
2.DES算法演进3DES
三重数据加密算法(3DES)是在DES基础上演化而来的,该算法采用K1、K2、K3对同一组明文进行多重加密,其基本原理是对每个数据块使用三次DES加密,如果密钥小于64位,其加密强度与DES一致,一般建议使用64位以上的密钥。
以下是3DES加密函数的示例:
涉及的加密编码和填充方法包括3DES-ECB,3DES-CBC,3DES-CTR,3DES-OFB和3DES-CFB。
解密函数示例如下:
三重数据加密算法的密钥长度为128位,除了3DES算法外,还有人计算出了N-DES(N-DES)。
高安全级别数据 (AES)
由于存在密钥长度短、密钥强度弱等缺点,DES很容易被暴力破解。随着计算机性能的不断提高,DES被暴力破解的频率越来越高。因此,美国国家标准与技术研究院(NIST)于1997年放弃了对DES的官方支持,并开发了AES(高级加密标准)作为DES的替代品。

在系统上使用AES的实现难度、代码量、编写方法与使用DES相差无几,速度比DES更快,性能更高。在实际开发过程中,建议使用AES算法对数据进行加密解密,加密代码如下:
解密代码如下:
针对对称加密解密算法都有密钥需要存储的问题,目前有三种实现方案。
(1)密钥生成后,可以保存在存储设备中,比如密钥文件或者系统等,使用时读入内存。
(2)密钥生成后,根据固定的设备特征(例如OSID等)将密钥信息发送到服务器,在本地获取密钥信息供应用启动时使用。由于移动网络通信的不确定性,不建议使用此方案。
(3)将密钥放置在NDK代码中,然后使用数据位移或者分裂的方式组装出真正的密钥数据,这种算法比较难破解,也比较安全,所以推荐使用这种存储方案。
非对称加密(RSA)
RSA 是由三位数学家设计的一种非对称加密算法,其核心思想是将密钥分成下面两个密钥,简称密钥对。
一个密钥对中有一个公钥和一个私钥。
您可以使用工具的命令来生成公钥和私钥,也可以使用开发语言来生成公钥和私钥。
(1)生成RSA算法的私钥,使用以下命令:
-出.pem 2048
(2)使用以下命令将X509编码文件转换为编码格式:
-输入.pem -输出 8.pem - -
(3)导出私钥对应的X509编码的公钥文件:
rsa-输入.pem-输出.pem-
注意 -
您可以使用Java代码从8.pem文件中读取私钥信息并生成数字签名,然后使用.pem公钥文件验证数字签名的正确性。
Java虚拟机还提供了内置的方法来生成公钥和私钥,代码如下:
获取公钥和私钥数据后,就可以对数据进行加密解密、签名验证等操作,加密解密流程如下。
加密数据的一方使用可以公开获得的公钥(一般建议使用1024位的密钥,密钥越长越安全,但也意味着加密性能较差)对明文数据进行加密,得到密文:
(2)解密方拥有私钥,得到密文后,用对应的私钥进行解密:
(3)如果解密失败,说明公钥或私钥不匹配(不是密钥对)。这也意味着如果没有对应的私钥,就无法解密密文的内容。
RSA一般只适用于小数据块的加密解密场景(例如加密动态密钥、较短的关键数据),且其加密解密速度较AES、DES慢。
传输安全