支付平台架构:终端安全技术实现
前蚂蚁集团宣布即将IPO之后,9月11日晚间,以金融支付起家的京东数科也要上市了。近年来,第三方支付业务的资金规模不断
原创曹兵强博文视点Broadview昨天收录于话题#架构1#2020必读清单28 前蚂蚁集团宣布即将IPO之后,9月11日晚间,以金融支付起家的京东数科也要上市了。近年来,第三方支付业务的资金规模不断扩大,支付业务量稳步增长,“第三方支付”及“移动支付”已成为年度搜索热词,支付平台作为互联网产品及其在商业化过程中信息流和资金流的支撑,也成为国外内各大互联网公司必建的基础平台之一。 安全交易是互联网产品电子商务发展的核心内容之一,支付系统的安全则是安全交易的关键所在。对于从事支付行业的第三方支付机构来说,终端数据的安全防护无疑是支付业务发展的重要保证之一,是安全防护长城的第一关。支付系统一般会采用安全加密、访问授权、传输安全等方法来保障终端数据的安全。 ------本文选自《支付平台架构:业务、规划、设计与实现》一书,将详细介绍支付平台终端安全的技术实现。 ▼ 扫码获取本书详情 ▼ 终端安全技术实现 首先讲解在本地加密存储的方法,加密方法有两种:对称加解密和非对称加解密。 实用场景:支付系统中有部分配置文件的内容需要加密存储在本地,例如:跳转服务器的地址或支付SDK的运行参数在使用过程中需要先解密再使用。对于这种场景,比较适合采用对称加密算法。 当然,也可以使用非对称加密。但由于非对称加密适用于安全级别较高、运算速度较慢及私钥一般不在终端存储等场景中,所以在技术选型上面不宜使用。 说到对称加密算法,可以选择使用以下几种方案。 这里的终端安全示例代码以Android操作系统为例,并且使用Java来实现安全加密、访问授权和传输安全。 一、中低安全级别的数据(DES) 数据加密标准DES(Data Encryption Standard)是使用对称密钥加密的一种块加密算法,处理数据的速度较快,性能较好,通常适用于对大块数据加解密的场景中。 该算法的明显缺点是密钥较短,这意味着可以通过暴力破解来解密,降低了加密的安全性,但仍然适用于对支付系统配置文件的安全加密等场景中。 以下是基于Android系统的DES加密的代码实现: 对应的解密函数如下: 这样就实现了加解密函数,只需在加密时调用encryptByDES函数,将明文数据和8位Key传入就可以得到密文数据,然后在使用时以相同的Key值和密文调用decryptByDES函数完成密文解密得到明文信息。 在以上代码中还使用了Base64编码方式,可以将二进制数据编码成可见的ASCII码字符串数据。在Android系统中Base64(完整类名为android.util.Base64)已经是一种内置的工具类的编码转换算法,很多人都把Base64当成一个加解密算法,但从严格意义上来说,它不能算是一种加解密算法,只能算是一种编码格式的转换算法。 二、DES算法演进之3DES 在DES基础之上进化了三重数据加密算法(3DES),该算法使用了K1、K2、K3对同一组明文进行多重加密,其基本原理是对每个数据块都使用三次DES加密,如果密钥小于64位,则其加密强度与DES一致,一般建议采用的密钥超过64位。 3DES的加密函数示例如下: 其中涉及的加密编码方式和填充方式包括3DES-ECB、3DES-CBC、3DES-CTR、3DES-OFB和3DES-CFB。 解密函数示例如下: 其中三重数据加密算法的密钥长度是128位。除了3DES算法,还有人演算出N-DES(N重数据加密算法)。 高安全级别的数据(AES) 由于密钥长度过短、弱密钥等缺点的存在,DES容易被暴力破解。随着计算机性能不断提升,DES被暴力破解的频率越来越高。所以,美国国家标准与技术研究院(NIST)在1997年放弃了对DES的官方支持,研发出DES的替代者AES(Advanced Encryption Standard,高级加密标准)。 在Android系统上使用AES与使用DES的实现难度、代码量和写法相差无几,比DES速度更快、性能更高,在实际的开发过程中建议采用AES算法对数据进行加解密,其加密代码如下: 解密代码如下: 针对对称加解密算法都有一个密钥需要存储的问题,目前有三种实现方案。 (1)生成密钥之后,可以将其保存在存储设备中,例如密钥文件或Android系统的SharedPreferences中,在使用时将其读取到内存中。 (2)生成密钥之后,依据固定的设备特性(例如DeviceId、OSID等)将密钥信息上送到服务器端,在应用启动时将密钥信息获取到本地使用,由于移动网络通信存在不确定性,所以不推荐采用这种方案。 (3)将密钥放在 NDK 代码中,然后采用数据位移或拆分等方案,再拼装为真正的密钥数据。这种算法的破解难度较高支付系统安全,也较安全,推荐采用这种存储方案。 非对称加密(RSA) RSA是一种非对称加密算法,由三位数学家Rivest、Shamir和Adleman设计,其核心思想为将密钥分成以下两把密钥,简称密钥对。 在密钥对中有一个公钥,还有一个私钥。 可以使用OpenSSL工具的命令生成公私钥,也可以使用开发语言生成公私钥。 (1)生成RSA算法的私钥时,使用以下命令:openssl genrsa -out rsa_private_key.pem 2048 (2)使用以下命令将X509编码文件转换成PKCS8编码格式:openssl pkcs8 -in rsa_private_key.pem -out rsa_private_key_pkcs8.pem -nocrypt -topk8 (3)导出私钥对应的X509编码公钥文件:openssl rsa -in rsa_private_key.pem -out rsa_public_key.pem -pubout 注意 —— 可以使用Java代码从rsa_private_key_pkcs8.pem文件中读取私钥信息并生成数字签名,再使用rsa_public_key.pem公钥文件验证数字签名的正确性。 Java虚拟机也提供了内置的方法来生成公私钥,代码如下: 有了公私钥数据之后,就可以对数据进行加解密处理和数据加签、验签了,加解密过程如下。 其中,加密数据的一方使用公开获得的公钥(一般推荐使用1024位密钥,密钥越长越安全,也意味着加密性能越差),对明文数据进行加密得到密文: (2)解密的一方具有私钥,拿到密文时,使用对应的私钥进行解密: (3)如果解密失败,则代表公钥或私钥不匹配(不是一个密钥对),这也说明如果没有对应的私钥,则解不出密文中的内容。 RSA 一般只适用于小数据块的加解密场景中(例如加密动态密钥、短的关键数据),加解密速度较AES和DES慢。 传输安全 (编辑:武汉站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |