2011-12-08 23 views
1

我需要首先使用SHA-1摘要算法对字符串进行数字签名,然后应用RSA算法,使用PrivateKey对其进行签名。我已经在我的数据库中存储了PrivateKey作为base64中的数据类型char(250)。我的问题是,我不知道如何将它转换成一个专用密钥将其用于签署:对我应用了SHA-1散列算法将字节[]转换为java中的PrivateKey以进行数字签名

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

文摘是一个字节数组:

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

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

回答

4

我不知道你是如何将私钥保存到数据库中的。但是this page提供了有关如何从文件系统加载KeyStore以及检索PrivatePublic密钥的信息。

相关代码段(修改,以满足您的要求)是,

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(); 
+0

什么是关键存储类型64底层编码的? – user1084509

+1

@ user1084509我不认为密钥库类型与编码有任何关系。编码是将一种形式的数据转换为另一种形式的手段。您的密钥库类型可能是[本文(链接)]中提到的其中一种类型(http://docs.oracle.com/javase/1.4.2/docs/guide/security/CryptoSpec.html#AppA) – srkavin

+0

好的,谢谢你,现在我明白了。我有关于这一行的另一个问题:KeyStore.PrivateKeyEntry pkEntry =(KeyStore.PrivateKeyEntry)ks.getEntry(PRIVATE_KEY_ALIAS,password); ...密码预计是类型KeyStore.ProtectionParameter,我该如何做这种转换?我的密码是一组字符或一个字符串。 – user1084509

相关问题