0

我正在尝试使用 Jose ( https://bitbucket.org/b_c/jose4j/wiki/Home ) 来生成签名的 JsonWebToken。我在创建需要在令牌签名中使用的 RsaKeyPairs 时遇到问题。

这是我用来生成公钥/私钥的代码,我需要将其转换为字符串,以便将它们存储在数据库中然后检索它们。

    WebKeyManager wkm = null;
    Object obj;
    EncryptionKey encKey = null;
    RsaJsonWebKey rsaJsonWebKey = null;

    try
    {
         wkm = new WebKeyManager();
         int    keySize = 512;

         // Initialize KeyPairGenerator.

         SecureRandom random = SecureRandom.getInstanceStrong(); //cryptographically strong random number generator

        // Generate an RSA key pair, which will be used for signing and verification of the JWT, wrapped in a JWK               
        rsaJsonWebKey = RsaJwkGenerator.generateJwk(keySize, random.getProvider().getName(),random);

       // Give the JWK a Key ID (kid), which is just the polite thing to do
        rsaJsonWebKey.setKeyId(""+System.currentTimeMillis());

       String json = rsaJsonWebKey.toJson(OutputControlLevel.INCLUDE_PRIVATE);

}
catch (Exception e)
{
    e.printStackTrace();
}

我遇到的问题是当我做 rsaJsonWebKey.toJson(OutputControlLevel.INCLUDE_PRIVATE)

我收到此错误:

java.lang.ClassCastException: sun.security.mscapi.RSAPrivateKey cannot be cast to java.security.interfaces.RSAPrivateKey
    at org.jose4j.jwk.RsaJsonWebKey.getRsaPrivateKey(RsaJsonWebKey.java:123)
    at org.jose4j.jwk.RsaJsonWebKey.fillPrivateTypeSpecificParams(RsaJsonWebKey.java:135)
    at org.jose4j.jwk.PublicJsonWebKey.fillTypeSpecificParams(PublicJsonWebKey.java:122)
    at org.jose4j.jwk.JsonWebKey.toParams(JsonWebKey.java:166)
    at org.jose4j.jwk.JsonWebKey.toJson(JsonWebKey.java:178)

我尝试在 Jose 中调试代码,错误出现在 PublicJsonWebKey 类这一行中:

protected void fillPrivateTypeSpecificParams(Map<String,Object> params)
{
    RSAPrivateKey rsaPrivateKey = getRsaPrivateKey();

rsaPrivateKey 是 java.security.interfaces.RSAPrivateKey 而 getRsaPrivateKey() 返回 org.jose4j.jwk.RsaJsonWebKey

我究竟做错了什么?

我的要求是生成 KeyPairs,将它们存储在 varchar 类型字段或类似字段中的数据库中,然后在需要时,我可以从数据库中检索字符串,将其转换回私钥/公钥并使用它们来签署令牌?

4

1 回答 1

0

经过一番研究,我发现如果我使用这个构造函数创建密钥

 rsaJsonWebKey = RsaJwkGenerator.generateJwk(keySize); 

然后我没有得到错误。

于 2017-07-11T13:09:32.817 回答