java - 将byte []转换为java中的PrivateKey以进行数字签名

标签 java rsa digital-signature digest sha1

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

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

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

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

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

最佳答案

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

相关代码片段(根据您的要求进行了修改)是,

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

关于java - 将byte []转换为java中的PrivateKey以进行数字签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8438857/

相关文章:

java - 如何将SSL证书集成到/jre/security文件夹中的cacerts文件中?

java - 是否可以在 Java 中用冒号格式化 UTC 时区?

c# - 您如何验证数字证书 SSL?

ssl - TLS 什么是生成的证书签名

java - BouncyCaSTLe,桌面/安卓签名的不同行为

java程序要求用户输入第二大和最大的数字

java - Uploadcare:使用 Java 库将文件从 Uploadcare 存储复制到 AWS S3 存储桶时遇到问题

javascript - 用于派生 RSA 私钥的数字何时应以 `00` 开头?

ios - SecKeyDecrypt 在不同设备上的行为不同。

ssl - 尝试通过 SSH 连接到 Google Cloud Shell 时出现权限被拒绝(公钥)错误