android - 从 Base64 编码的 ASN1 结构中解码 PKCS8 key 是否容错?

标签 android bouncycastle asn.1 spongycastle

我正在使用 Spongy CaSTLe 库将我的用户私钥 (PKCS8) 编码为 ASN1 实体,然后将 Base64 编码字符串编码为 QR 码。

我的一位同事发现可以在不损坏私钥的情况下更改 Base64 字符串中的某些字符。 ASN1 格式或 PKCS8/DER 格式是否实现了一些容错?

//final String encoded = "MIGcAgEBB........lGEOPD2o+H59Qyl"; // original
final String encoded = "MIGcAgEBB........lGEOPD2oXXXXXXX"; // changed!

// decode Base64
final byte[] buffer = Base64.decode(encoded);

// decode ASN1
final ASN1Primitive primitive = ASN1Primitive.fromByteArray(buffer);
final ASN1Sequence asn1Sequence = ASN1Sequence.getInstance(primitive);
// read from ASN1
final BigInteger version = ASN1Integer.getInstance(asn1Sequence.getObjectAt(0)).getValue();
final byte[] keyBytes = DEROctetString.getInstance(asn1Sequence.getObjectAt(1)).getOctets();

// get private key from bytes
final PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(keyBytes);
final PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec);

最佳答案

PKCS#8是一个相当通用的私钥容器。它可能包装的一些底层私钥结构可能包含冗余数据。特别是 PKCS#1 RSAPrivateKey有几个冗余字段,必要时可以重新计算。最后 3 个字段完全是多余的。现在,当消费软件收到包含不正确或修改数据的 PKCS#8 结构时会发生什么取决于该软件。

PKCS#8 确实有一个加密的私钥信息选项,可用于通过正确选择保护算法来提供防篡改加密。如果您的私钥信息曾经处于有意或无意修改是合法威胁的环境中,那么您必须采取措施减轻这种威胁。

关于android - 从 Base64 编码的 ASN1 结构中解码 PKCS8 key 是否容错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53885629/

相关文章:

android - 谷歌地图 api ANDROID 中标记的 GIF 类型动画

android - 如何设置选择器以显示多种类型的 Intent ?

android - 在Android Studio中安装Roboguice

java - 我怎样才能快速 ((A^z1 * y^z2) mod P) mod Q

java - 如何在 Java 中将 X509Certificate 转换为 PEM 字符串?

android - 在 Chrome 自定义选项卡的标题中插入参数

java - Bouncy castLe没有这样的方法错误(v1.61)和milo(v0.3.8)

java - Java 的公钥表示与 RFC 8410 之间的差异

java - DER 在 Java 中解码 ECDSA 签名

c - OpenSSL ASN1_TYPE 和 ASN1_ITEM 是如何关联的