我正在使用海绵状城堡库将我的用户私有密钥(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具有几个冗余字段,如有必要,可以重新计算。最后三个字段是完全多余的。现在,当消费软件收到带有不正确或修改的数据的PKCS#8结构时会发生什么。
PKCS#8确实具有一个加密的私钥信息选项,可用于提供防护算法的反篡改加密术。如果您的私钥信息曾经在有意或意外修改是合法威胁的环境中,那么您必须采取措施来减轻威胁。