如何在Salesforce Apex中实现AES 128 ECB模式加解密?求替代方案
实现AES-128 ECB加解密的替代方案
由于Salesforce官方的Crypto类不支持ECB模式,你可以通过以下两种可行方案实现需求:
方案一:基于内置Crypto类模拟ECB模式
ECB模式的核心是将明文分割为16字节(AES-128块大小)的独立块,对每个块单独加密,无链式依赖。利用Crypto类支持的AES-CBC模式,通过对每个块使用全零IV加密,即可模拟ECB的效果(CBC模式下用全零IV且不链式处理每个块,等价于ECB)。
加密步骤:
- 对明文进行PKCS#7填充,确保长度为16字节的整数倍。
- 将填充后的明文分割为16字节的块。
- 对每个块使用
Crypto.encrypt('AES128', key, Blob.valueOf('\0'.repeat(16)), block)加密(全零IV)。 - 拼接所有加密后的块得到最终密文。
解密步骤:
- 将密文分割为16字节的块。
- 对每个块使用
Crypto.decrypt('AES128', key, Blob.valueOf('\0'.repeat(16)), block)解密。 - 拼接所有解密后的块,再去除PKCS#7填充得到明文。
示例代码:
public class AES_ECB { private static final Integer BLOCK_SIZE = 16; // PKCS#7填充 private static Blob pad(Blob input) { Integer padLength = BLOCK_SIZE - (input.size() % BLOCK_SIZE); String padString = String.fromCharArray(new List<Integer>(new Integer[padLength]).clone().fill(padLength)); return Blob.valueOf(Blob.toString(input) + padString); } // 去除PKCS#7填充 private static Blob unpad(Blob input) { String inputStr = Blob.toString(input); Integer padLength = (Integer)inputStr.charAt(inputStr.length() - 1); return Blob.valueOf(inputStr.substring(0, inputStr.length() - padLength)); } // AES-128 ECB加密 public static Blob encrypt(Blob key, Blob plaintext) { Blob paddedPlaintext = pad(plaintext); List<Blob> cipherBlocks = new List<Blob>(); Blob zeroIV = Blob.valueOf('\0'.repeat(BLOCK_SIZE)); for (Integer i = 0; i < paddedPlaintext.size(); i += BLOCK_SIZE) { Blob block = paddedPlaintext.substring(i, Math.min(i + BLOCK_SIZE, paddedPlaintext.size())); Blob encryptedBlock = Crypto.encrypt('AES128', key, zeroIV, block); cipherBlocks.add(encryptedBlock); } // 拼接所有块 String cipherStr = ''; for (Blob b : cipherBlocks) { cipherStr += Blob.toString(b); } return Blob.valueOf(cipherStr); } // AES-128 ECB解密 public static Blob decrypt(Blob key, Blob ciphertext) { List<Blob> plainBlocks = new List<Blob>(); Blob zeroIV = Blob.valueOf('\0'.repeat(BLOCK_SIZE)); for (Integer i = 0; i < ciphertext.size(); i += BLOCK_SIZE) { Blob block = ciphertext.substring(i, Math.min(i + BLOCK_SIZE, ciphertext.size())); Blob decryptedBlock = Crypto.decrypt('AES128', key, zeroIV, block); plainBlocks.add(decryptedBlock); } // 拼接所有块并去填充 String plainStr = ''; for (Blob b : plainBlocks) { plainStr += Blob.toString(b); } return unpad(Blob.valueOf(plainStr)); } }
方案二:手动实现AES算法
如果方案一无法满足边缘场景需求,可以手动在Apex中实现完整的AES-128算法(包括ECB模式)。不过这种方式代码量较大,需严格遵循AES规范,容易引入安全漏洞,仅推荐在必要时使用。
注意事项:
- ECB模式存在严重安全隐患(相同明文块会生成相同密文块,易被破解),若有可能,建议与外部API方协商改用更安全的模式(如CBC、GCM)。
- 确保密钥长度为16字节(AES-128要求),且密钥管理符合Salesforce安全规范(避免硬编码,使用自定义设置或命名凭据存储)。
内容的提问来源于stack exchange,提问作者Leandro Petri
相关产品推荐
相关产品推荐

