当前位置: 首页 > 知识库问答 >
问题:

PKCS12-弹跳城堡FIPS模式

闾丘文昌
2023-03-14

在FIPS模式下,PKCS#12格式在加密文件时必须使用兼容的加密和哈希算法。

当我阅读BC-FIPS文档时,它说在批准模式下,它们不支持PKCS#12,因此这意味着我们无法在BC-FIPS批准模式下读取PKCS12密钥库;我们使用BC-FIPS作为加密提供者,还使用PKCS12和JKS格式存储密钥和证书。

BC-FIPS声称-“PKCS12密钥存储支持以下变体: PKCS12-3DES-3DES:默认情况下,对任何加密任务使用三重DES。”那么,我们可以使用任何这种机制读取PKCS12并声称我们符合FIPS标准吗?

迁移到BCFKS是一个很大的练习,它可能会带来兼容性问题。

-钱德拉

共有1个答案

毋举
2023-03-14

您的问题“如果我们可以在BC-FIPS批准模式下阅读PKCS12密钥存储”的简短答案是否定的。

四个月前,您在这里提出了(几乎)相同的问题:PKCS#12密钥库格式的Bouncy Castle FIPS模式,您从@Peter Dettmann那里得到了答案:

Quoting from the BC-FJA user guide, section "7. Key Stores":
The PKCS12 key store is **not available** in approved-mode of operation due to the algorithms required for PBE key generation in the PKCS#12 standard.
It is available only to threads that are not running in approved-mode.

下面是BC FIPS示例(“KeyStr.java”)的精简版本,该示例首先在禁用的approved模式下运行,然后我将启用该模式-您将收到一条错误消息:

Testing a PKCS12 keystore with BC FIPS in approved mode

running in approved mode: false
PKCS12 (certificate): true
running in approved mode: true
Exception in thread "main" org.bouncycastle.jcajce.provider.ProvIOException: exception decrypting data - java.security.NoSuchAlgorithmException: No such algorithm: 1.2.840.113549.1.12.1.3
...

以下代码仅用于教育目的,可能不安全。

import org.bouncycastle.asn1.x500.X500Name;
import org.bouncycastle.cert.X509v1CertificateBuilder;
import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter;
import org.bouncycastle.cert.jcajce.JcaX509v1CertificateBuilder;
import org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider;
import org.bouncycastle.operator.OperatorCreationException;
import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder;
import org.bouncycastle.pkcs.PKCSException;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.math.BigInteger;
import java.security.*;
import java.security.cert.X509Certificate;
import java.util.Date;

public class Pkcs12KeystoreFipsApprovedMode
{
     public static byte[] storeCertificatePkcs12(char[] storePassword, X509Certificate trustedCert)
        throws GeneralSecurityException, IOException {
        KeyStore keyStore = KeyStore.getInstance("PKCS12", "BCFIPS");
        keyStore.load(null, null);
        keyStore.setCertificateEntry("trustedca", trustedCert);
        ByteArrayOutputStream bOut = new ByteArrayOutputStream();
        keyStore.store(bOut, storePassword);
        return bOut.toByteArray();
    }

    private static KeyStore rebuildStore(String storeType, char[] storePassword, byte[] encoding)
        throws GeneralSecurityException, IOException {
        KeyStore keyStore = KeyStore.getInstance(storeType, "BCFIPS");
        keyStore.load(new ByteArrayInputStream(encoding), storePassword);
        return keyStore;
    }

    public static void main(String[] args)
        throws GeneralSecurityException, OperatorCreationException, PKCSException, IOException
    {
        Security.addProvider(new BouncyCastleFipsProvider());
        System.out.println("Testing a PKCS12 keystore with BC FIPS in approved mode\n");
        System.out.println("running in approved mode: " + org.bouncycastle.crypto.CryptoServicesRegistrar.isInApprovedOnlyMode());
        KeyPair caKeyPair = generateKeyPair();
        X509Certificate caCert = makeV1Certificate(caKeyPair.getPrivate(), caKeyPair.getPublic());

        char[] storePass = "storePassword".toCharArray();
        System.out.println("PKCS12 (certificate): " + rebuildStore("PKCS12", storePass, storeCertificatePkcs12(storePass, caCert)).isCertificateEntry("trustedca"));

        // running now in approved mode
        org.bouncycastle.crypto.CryptoServicesRegistrar.setApprovedOnlyMode(true);
        System.out.println("running in approved mode: " + org.bouncycastle.crypto.CryptoServicesRegistrar.isInApprovedOnlyMode());
        System.out.println("PKCS12 (certificate): " + rebuildStore("PKCS12", storePass, storeCertificatePkcs12(storePass, caCert)).isCertificateEntry("trustedca2"));
    }
    public static KeyPair generateKeyPair() throws GeneralSecurityException {
        KeyPairGenerator keyPair = KeyPairGenerator.getInstance("EC", "BCFIPS");
        keyPair.initialize(384);
        return keyPair.generateKeyPair();
    }

    public static X509Certificate makeV1Certificate(PrivateKey caSignerKey, PublicKey caPublicKey)
            throws GeneralSecurityException, OperatorCreationException {
        long THIRTY_DAYS = 1000L * 60 * 60 * 24 * 30;
        X509v1CertificateBuilder v1CertBldr = new JcaX509v1CertificateBuilder(
                new X500Name("CN=Issuer CA"),
                BigInteger.valueOf(System.currentTimeMillis()),
                new Date(System.currentTimeMillis() - 1000L * 5),
                new Date(System.currentTimeMillis() + THIRTY_DAYS),
                new X500Name("CN=Issuer CA"),
                caPublicKey);
        JcaContentSignerBuilder signerBuilder = new JcaContentSignerBuilder("SHA384withECDSA").setProvider("BCFIPS");
        return new JcaX509CertificateConverter().setProvider("BCFIPS").getCertificate(v1CertBldr.build(signerBuilder.build(caSignerKey)));
    }
}
 类似资料:
  • 根据Bouncy Castle FIPS Java API指南,版本:0.1 在第4.2节中,一些填充机制被指定与公钥算法(ElGamal/RSA)一起使用: 不添加 OAEPWITHA-1和MGF1PADDING-别名:OAEPWITHSHA1和MGF1PADDING,OAEPADDING。 oaepwithsha-224andmgf1padding-别名:oaepwithsha224andmg

  • 我一直在尝试通过Bouncy Castle使用OpenPGP构建内存中的公钥加密基础设施。我们的一家供应商使用OpenPGP公钥加密来加密他们的所有提要,并要求我们也这样做,所以我被技术和实现卡住了。所以现在我正在编写一个OpenPGP加密/解密工具包来自动化这些提要。 bouncycastle.org的例子莫名其妙地默认将加密数据写入文件系统并从其中收集密钥;这不是我想做的,所以我一直试图让一切

  • 使用PEM证书,如 我的问题是,AFAIK,pemparser中没有密码的位置。 有人能给我一个如何将代码迁移到PEMParser版本的例子吗?

  • Ladar Levison编写了ecies_encrypt和ecies_decrypt C函数。这些功能与ECIES弹力城堡兼容吗?如果不是,有没有人知道要修复什么或者ecies的另一个C实现?

  • 我的程序生成AES密钥,用rsa算法加密并发送到服务器。但是,当我从服务器获取它并解密时,一些字节被破坏并替换为序列,根据这个问题UTF-8编码和解码问题,我意识到问题是服务器(也解密密钥)将其存储为UTF-8字符串。有没有办法创建“UTF-8友好”键?现在如何生成密钥:

  • 我知道曲线名称()以及EC公钥的和坐标。 如何用它们创建? 我读过https://stackoverflow.com/a/29355749/5453873,但是那里的代码使用而不是,ECPublicKey是中的接口,而不是一个可实例化的类。