我正在尝试在android中运行一些海绵宝宝代码:
try {
Security.addProvider(new org.spongycastle.jce.provider.BouncyCastleProvider());
ECGenParameterSpec spec = new ECGenParameterSpec("P-256");
KeyPairGenerator generator = KeyPairGenerator.getInstance("ECDSA", "SC");
generator.initialize(spec, new SecureRandom());
KeyPair keyPair = generator.generateKeyPair();
ECPublicKey publicKey = (ECPublicKey) keyPair.getPublic();
ECPrivateKey privateKey = (ECPrivateKey) keyPair.getPrivate();
String publicKeyStr = publicKey.getW().getAffineX().toString() + ":" + publicKey.getW().getAffineY().toString();
Log.d(TAG, publicKeyStr);
Calendar c = Calendar.getInstance();
Date d0 = c.getTime();
c.add(Calendar.DATE, 1);
Date expiry = c.getTime();
String token = Jwts.builder()
.setIssuedAt(d0)
.setSubject("00000000-0000-0000-0000-000000000001")
.setExpiration(expiry)
.signWith(privateKey, SignatureAlgorithm.ES256).compact();
Log.d(TAG, token);
} catch (Exception e) {
Log.d(TAG, e.toString());
}
在API版本21+中,它可以按预期工作。
在API版本18中,它可以在调试中工作。在发布时,其功能generator.generateKeyPair()
与java.lang.IllegalArgumentException: Invalid point
一起失败。
在API版本16中,它在带有Jwts.builder().signWith()
的函数io.jsonwebtoken.security.SignatureException: Invalid Elliptic Curve PrivateKey. can't recognise key type in ECDSA based signer
中失败。
知道我在做什么错吗?
编辑:我显然已经通过从海绵堡切换到充气城堡解决了这个问题。
在我的build.gradle
中,我对此进行了更改:
implementation 'com.madgag.spongycastle:core:1.58.0.0'
implementation 'com.madgag.spongycastle:prov:1.58.0.0'
对此:
implementation 'org.bouncycastle:bcpkix-jdk15on:1.60'
在我的代码中,我摆脱了这一行:
Security.addProvider(new org.spongycastle.jce.provider.BouncyCastleProvider());
并添加了以下几行:
import org.bouncycastle.jce.provider.BouncyCastleProvider;
Security.removeProvider(BouncyCastleProvider.PROVIDER_NAME);
Security.insertProviderAt(new BouncyCastleProvider(), 1);
我将提供者从"SC"
更改为"BC"
。
现在,我的代码可以针对所有版本的android API正常工作。
我现在关心的是此链接上的评论...
Spongy Castle: is it obsolete?
...海绵宝宝的作者:
为什么海绵城堡不过时?
...
即使在Android 3.0之后的设备上,设备制造商也不在 粗心地捆绑图书馆,Bouncy Castle可能会 仍然捆绑在一些不起眼的设备上。
这到底是什么意思?会导致我上面的代码在某些设备上发生故障吗?
答案 0 :(得分:0)
使用充气城堡:
dependencies {
// https://mvnrepository.com/artifact/org.bouncycastle
implementation "org.bouncycastle:bcprov-jdk15on:1.60"
implementation "org.bouncycastle:bcpkix-jdk15on:1.60"
}