Android中EC(椭圆曲线)密钥的使用涉及密钥生成、存储、签名验证和密钥交换等操作,以下是详细技术要点和扩展知识:
1. 密钥生成
密钥对创建
使用`KeyPairGenerator`类指定`EC`算法生成密钥对,推荐曲线为`secp256r1`(NIST P-256)或`secp384r1`。示例代码:
java
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("EC");
keyGen.initialize(new ECGenParameterSpec("secp256r1"));
KeyPair keyPair = keyGen.generateKeyPair();
Android默认支持:
- `secp256r1`(NIST P-256)
- `secp384r1`(NIST P-384)
- `secp521r1`(NIST P-521)
部分设备可能支持`Brainpool`曲线或`Ed25519`(需API 33+)。
自定义参数
通过`ECParameterSpec`指定域参数(如素数域或二进制域),但需兼容设备支持。
2. 密钥存储
Android Keystore系统
使用`AndroidKeyStore`保护私钥,防止导出:
java
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("EC", "AndroidKeyStore");
keyGen.initialize(new KeyGenParameterSpec.Builder("alias", KeyProperties.PURPOSE_SIGN)
.setAlgorithmParameterSpec(new ECGenParameterSpec("secp256r1"))
.setDigests(KeyProperties.DIGEST_SHA256)
.build());
keyGen.generateKeyPair();
注意:
- 密钥别名需唯一,`PURPOSE_SIGN`或`PURPOSE_AGREE_KEY`控制用途。
- 设置`setUserAuthenticationRequired(true)`可绑定生物认证。
3. 签名与验证
签名生成
使用`PrivateKey`和`Signature`类:
java
Signature signer = Signature.getInstance("SHA256withECDSA");
signer.initSign(privateKey);
signer.update(data);
byte[] signature = signer.sign();
哈希算法选择:
- `SHA256withECDSA`(常用)
- `SHA384withECDSA`
- `SHA512withECDSA`
避免弱哈希如`SHA1`。
验证签名
java
Signature verifier = Signature.getInstance("SHA256withECDSA");
verifier.initVerify(publicKey);
verifier.update(data);
boolean valid = verifier.verify(signature);
4. 密钥交换(ECDH)
生成共享密钥
使用`KeyAgreement`实现ECDH:
java
KeyAgreement keyAgreement = KeyAgreement.getInstance("ECDH");
keyAgreement.init(privateKey);
keyAgreement.doPhase(peerPublicKey, true);
byte[] sharedSecret = keyAgreement.generateSecret();
注意:共享密钥需经KDF(如HKDF)处理后方可使用,避免直接作为加密密钥。
5. 密钥序列化与传输
公钥导出
转换为`X.509`格式或压缩坐标:
java
byte[] encoded = publicKey.getEncoded(); // X.509格式
ECUtil.encodePoint(((ECPublicKey)publicKey).getW(), curve.getCurve()); // 压缩坐标
压缩格式:首字节`0x02`(y偶)或`0x03`(y奇),减少传输开销。
私钥保护
仅允许通过`AndroidKeyStore`硬件保护,禁止明文存储。
6. 安全实践
密钥用途隔离
签名与加密使用不同密钥对,遵循最小权限原则。
密钥轮换
定期更新密钥对,通过`KeyStore.deleteEntry()`废弃旧密钥。
设备兼容性
测试不同厂商设备对EC曲线的支持情况(如华为旧设备可能不支持`secp521r1`)。
7. 扩展知识
后量子密码兼容性
EC密钥未来可能被量子计算攻击(如Shor算法),建议混合部署基于格的算法(如NTRU)。
性能优化
EC比RSA更高效(256位EC≈3072位RSA安全性),适合移动端资源限制场景。
标准遵从
遵循NIST FIPS 186-4、RFC 5480(公钥格式)及RFC 5915(私钥语法)。
如需处理更复杂的场景(如SM2国密算法),需集成BouncyCastle等第三方库。