高级加密标准(英语:Advanced Encryption Standard,缩写:AES),是目前对称密钥加密中比较通用的一种加密方式。
支付宝开放平台所有OpenAPI均支持对接口的请求内容和响应内容进行AES加密。加密后,在网络上传输的接口报文内容将会由明文内容变为密文内容,可以大大提升接口内容传输的安全性。
AES密钥配置入口有以下3处:
1. 登录支付宝开放平台创建任意类型应用并审核通过后在“应用详情-应用环境”页面可见。
2. 在应用详情页
3. 账户密钥管理页面点击配置AES密钥
首次使用,点击“生成AES密钥”后即可查看并使用由开放平台自动生成的AES密钥。
开放平台支持开发者自行对请求参数做AES加密然后再做RSA签名提交请求。以下是AES加密java示例处理逻辑(注:若您使用PHP,可能需要自行安装用于加密的php扩展)。
其它语言基本的加密逻辑一样,需要注意的是对加密后得到字节数组需要先做base64编码,然后再新建字符串(由于base64后的字节一定是ASCII范围内,所以最后一步new String的时候无需指定字符集)。
public static String encrypt() throws Exception { String key = "开发者自己的AES秘钥"; String content = "需要加密的参数"; String charset = "项目使用的字符编码集"; String fullAlg = "AES/CBC/PKCS5Padding"; Cipher cipher = Cipher.getInstance(fullAlg); IvParameterSpec iv = new IvParameterSpec(initIv(fullAlg)); cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(Base64.decodeBase64(key.getBytes()), "AES"), iv); byte[] encryptBytes = cipher.doFinal(content.getBytes(charset)); return new String(Base64.encodeBase64(encryptBytes)); } /** * 初始向量的方法, 全部为0. 这里的写法适合于其它算法,针对AES算法的话,IV值一定是128位的(16字节). * * @param fullAlg * @return * @throws GeneralSecurityException */ private static byte[] initIv(String fullAlg) throws GeneralSecurityException { Cipher cipher = Cipher.getInstance(fullAlg); int blockSize = cipher.getBlockSize(); byte[] iv = new byte[blockSize]; for (int i = 0; i < blockSize; ++i) { iv[i] = 0; } return iv; }
如开发者对请求参数做了AES加密,针对支付宝回复报文,开发者需要先验签,再解密。若支付宝对回复报文进行了加密,您得到的支付宝回复报文会和之前有细微差别。判断报文是否加密以及密文的获取和报文格式是xml还是json有关系,具体如下(以下报文为方便展示均做了格式化):
以下是AES解密java示例代码:
/** * * @param content 密文 * @param key aes密钥 * @param charset 字符集 * @return 原文 * @throws EncryptException */ public String decrypt(String content, String key, String charset) throws Exception { //反序列化AES密钥 SecretKeySpec keySpec = new SecretKeySpec(Base64.decodeBase64(key.getBytes()), "AES"); //128bit全零的IV向量 byte[] iv = new byte[16]; for (int i = 0; i < iv.length; i++) { iv[i] = 0; } IvParameterSpec ivParameterSpec = new IvParameterSpec(iv); //初始化加密器并加密 Cipher deCipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); deCipher.init(Cipher.DECRYPT_MODE, keySpec, ivParameterSpec); byte[] encryptedBytes = Base64.decodeBase64(content.getBytes()); byte[] bytes = deCipher.doFinal(encryptedBytes); return new String(bytes); }
如果需要更新AES密钥,可以打开配置AES密钥浮层,并点击“重新生成AES密钥”按钮。
注意:
AES密钥一旦变更,新密钥立即启用,同时原密钥将立即失效。请确保在切换密钥过程中,涉及到的相关业务能够做容错处理。
开发者要用AES加密方法,可参考示例自行编写。
开发者如果用SDK调用接口,只需要做两件事:
1、调用这个AlipayClient构造方法:com.alipay.api.DefaultAlipayClient#DefaultAlipayClient(String, String, String, String, String, String, String, String, String),最后两个参数分别传递openhome的aes密钥,和加密算法“AES”;
2、对于每一个接口对应的请求类,调用它的setNeedEncrypt方法,设置为true就可以了。