敏感数据加解密
概述
在处理 API 请求时,特别是涉及到敏感数据(例如卡号、CVV、有效期 等)时,必须确保数据的安全性。为了保护这些敏感数据,我们使用了 RSA
加密算法,结合 ECB
模式和 OAEPPadding
填充方案进行加密。
RSA加密
加密算法
RSA/ECB/OAEPPadding
- RSA:一种非对称加密算法,使用公钥和私钥对数据进行加密和解密。
- ECB(电子密码本模式):一种加密模式,每个块独立加密,适用于加密长度相同的明文数据块。
- OAEPPadding:RSA 算法中的填充方案,提供了额外的安全性,防止了某些攻击类型。
加密和解密过程
- 生成密钥对:
- 生成 RSA 公钥和私钥。公钥用于加密数据,私钥用于解密数据。请参考上一篇文档 生成秘钥对 生成你的密钥,请安全存储你的私钥,并上传你的公钥到CodePay平台。
- 使用RSA加密,只需要使用CodePay的公钥,因此不需要生成密钥。如果需要解密CodePay返回的敏感数据,才需要使用你的私钥。目前业务场景中不存在返回敏感数据给开发者,因此可暂时忽略此步骤。
- 加密敏感数据:
- 使用 RSA 公钥对敏感数据进行加密。在我们的API使用场景中,当你请求CodePay时,请使用CodePay的公钥
GATEWAY_RSA_PUBLIC_KEY
进行加密。 - 在加密过程中,使用 ECB 模式和 OAEPPadding 填充方案。
- 传递加密数据:
- 将加密的Byte数组编码为Base64字符串,以便于在网络上进行传输。将加密后的数据通过API进行传输。
- 解密数据:
- 接收方对加密字符串进行Base64解码后,使用 RSA 私钥对加密数据进行解密。
- 在解密过程中,使用相同的填充方案(OAEPPadding)。
当你收到CodePay返回报文或Webhook通知报文的数据中,若包含加密数据,请按照同样的方法,使用你的私钥 APP_RSA_PRIVATE_KEY
进行解密。
注意事项
- 密钥管理:确保公钥和私钥的安全管理,不要将私钥暴露给未经授权的人员。
- 数据安全:加密前的数据应保持私密,不应在传输过程中泄露明文数据。
- 合规性:遵循适用的法规和标准(如 PCI-DSS)来处理敏感数据。
常见问题
- 对相同的明文进行RSA加密,得到的结果为什么每次都不一样?
RSA 加密每次对相同明文加密得到的结果不同是由于使用了随机填充机制。这是 RSA 加密过程中的一个重要特性,用于增强加密的安全性,防止加密模式攻击。
- 随机填充:在每次加密时,填充算法(如 OAEP)会生成新的随机数据。这些随机数据会与明文数据一起被加密,因此,即使明文数据相同,加密结果也会因为不同的随机填充而不同。
- 防止重放攻击:通过随机填充机制,RSA 加密可以避免重复的加密操作产生相同的密文,这对于防止某些类型的攻击(如重放攻击)是非常重要的。
因此,只要加密后能确保解密成功,就可以认为加密过程是正确的。
参考文献
示例代码
以下是使用Java SDK的示例代码,展示了如何使用RSA进行加密,完整的代码请参考 Java SDK:
![rsa 加密 java 示例](/docs/zh/assets/images/RsaEnc-79bdd7162312e3a93fa0d781c4b27e9f.png)
AES加密
AES(高级加密标准)是一种对称加密算法,广泛应用于数据保护领域。与RSA算法不同,AES使用相同的密钥进行数据的加密和解密,具有高效和强大的加密能力。
加密算法
AES/ECB/PKCS5Padding
AES:是一种对称加密算法,使用固定大小(128位)的密钥对数据进行加密和解密。AES算法支持多种密钥长度,包括128位、192位和256位。
ECB(电子密码本模式):是一种常见的加密模式,将输入的数据分成固定大小的块(通常是128位),对每个块独立加密。尽管ECB模式在加密操作中较为简单,但它容易受到某些攻击(例如,模式分析攻击),因此在某些应用场景中不建议使用。
PKCS5Padding:填充方案,确保数据块的长度满足算法要求。如果数据块的长度不足,可以使用PKCS5Padding填充到适当的长度。PKCS5Padding适用于对称加密算法,确保每个加密块都是完整的。
加密和解密过程
生成密钥:选择合适的密钥长度(例如128位、192位或256位)。密钥生成过程应确保其安全性,避免被未授权的人员获取。
加密敏感数据: 使用选择的密钥对敏感数据进行AES加密。在加密过程中,使用ECB模式对数据块进行独立加密,并使用PKCS5Padding填充方案来确保数据块长度符合要求。
传递加密数据: 将加密后的数据以字节数组的形式进行编码(通常使用Base64编码),以便于在网络上传输。编码后的加密数据可以作为API响应的一部分返回给客户端。
解密数据: 接收方在接收到加密数据时,首先对Base64编码的数据进行解码。然后,使用相同的AES密钥和填充方案(PKCS5Padding)进行解密操作,恢复原始明文数据。
注意事项
- 密钥管理:确保AES密钥的安全存储和管理,避免密钥泄露。建议使用安全的密钥管理系统来保护密钥。
- 填充方案:PKCS5Padding填充方案适用于数据长度不足时的填充,但在某些应用中,如果有特殊的长度要求,可能需要选择其他填充方式(如PKCS7)。
- ECB模式的局限性:尽管ECB模式简单易用,但由于它不引入任何额外的随机化,容易受到某些攻击。因此,在涉及高度敏感数据的场景中,通常推荐使用其他模式(如CBC模式)。
常见问题
为什么AES加密后的密文每次不同? AES加密在使用某些模式(如CBC模式)时,涉及到随机化处理,而ECB模式则没有这种特性,因此,若每次加密时密文相同,可能是由于填充方案或其他加密参数的问题。需要注意的是,ECB模式对相同的输入数据总是会产生相同的密文,这可能导致某些安全问题,因此在某些应用场景中应尽量避免使用。
如何提高AES加密的安全性? 虽然AES算法本身非常安全,但使用ECB模式时加密数据的模式简单,可能导致某些攻击。因此,建议使用更安全的加密模式(如CBC模式或GCM模式),并且结合适当的随机化策略(如IV初始化向量),以提高加密的安全性。
参考文献
示例代码
以下是使用Java SDK的示例代码,展示了如何使用AES进行加密,完整的代码请参考 Java SDK:
![rsa 加密 java 示例](/docs/zh/assets/images/AesEnc-4c102fa06f3802ebffb4393e8389a6b9.png)