【问题标题】:Converting a byte [] to PrivateKey in java for digital signature在java中将字节[]转换为PrivateKey以进行数字签名
【发布时间】:2012-01-16 08:29:39
【问题描述】:

我需要先使用 SHA-1 摘要算法对字符串进行数字签名,然后再应用 RSA 算法,使用 PrivateKey 对其进行签名。我已经将 PrivateKey 作为 base64 中的数据类型 char(250) 存储在我的数据库中。我的问题是我不知道如何将其转换为用于登录的 PrivateKey:

Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
byte[] cipherText = cipher.doFinal(digest);

Digest 是一个字节数组,我对其应用了 SHA-1 摘要算法:

MessageDigest md = MessageDigest.getInstance("SHA-1");
byte [] ba = cadena.getBytes();
byte [] digest  = md.digest(ba);

这是我想到的解决方案,但如果有人有更好的解决方案,我将不胜感激。

【问题讨论】:

    标签: java rsa digital-signature digest sha1


    【解决方案1】:

    我不知道您是如何将私钥保存到数据库中的。但是this page 提供了一些关于如何从文件系统加载KeyStore 并检索PrivatePublic 键的信息。

    相关代码sn-p(修改为适合您的要求)是,

       String password = ...;
       KeyStore ks = KeyStore.getInstance(KEY_STORE_TYPE);
    
       byte[] keyAsByteArray = ...; // The key persisted in the DB
       InputStream keyStream = new ByteArrayInputStream(keyAsByteArray);
       ks.load(keyStream, password);
    

    然后,

       KeyStore.PrivateKeyEntry pkEntry = (KeyStore.PrivateKeyEntry) ks.getEntry(PRIVATE_KEY_ALIAS, password);  
       PrivateKey privateKey = pkEntry.getPrivateKey();
    

    【讨论】:

    • 64 基编码的密钥库类型是什么?
    • @user1084509 我认为密钥库类型与编码无关。编码是将一种形式的数据转换为另一种形式的一种方法。您的密钥库类型可能是提到的类型之一 in this article (link)
    • 好的,谢谢,现在我明白了。我对这一行还有另一个问题: KeyStore.PrivateKeyEntry pkEntry = (KeyStore.PrivateKeyEntry) ks.getEntry(PRIVATE_KEY_ALIAS, password);... 密码应该是 KeyStore.ProtectionParameter 类型,我该如何进行这种转换?我的密码是一个字符数组或一个字符串。
    • @user1084509 您可以使用您的密码创建Keystore.PasswordProtection(link) 的实例并将其传入。
    • @user1084509 Ref (link)。私钥具有关联的证书 [链],用于验证公钥。查看Keystore.setCertificateEntry(..)。顺便说一句,您需要使用CertificateFactory Ref (link) 以类似的方式从byte[] 构造Certificate
    猜你喜欢
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多