a C*_*CVn 11 java cryptography opensaml
好吧,这是另一个"我真的不知道从哪里开始"的问题,所以希望答案很简单.但是,我真的不知道要搜索什么,到目前为止我的尝试还没有被大量使用.
我想从(当前磁盘上)文件中读取私钥.最终,密钥将驻留在数据库中,但这对于当下来说已经足够好了,并且差异对解析密钥材料没有任何实际意义.我已经能够创建一个Credential保存密钥的公共部分的实例(由调试器确认),但我似乎无法弄清楚如何读取私有部分.密钥对生成为:
openssl genrsa 512 > d:\host.key
openssl req -new -x509 -nodes -sha1 -days 365 -key d:\host.key > d:\host.cert
Run Code Online (Sandbox Code Playgroud)
(是的,我知道很久以前就已经破坏了512位RSA密钥.但是,为了让API工作起来,我认为没有理由不必要地耗尽系统熵供应.)
到目前为止的代码是:
import org.opensaml.xml.security.credential.Credential;
import org.opensaml.xml.security.x509.BasicX509Credential;
private Credential getSigningCredential()
throws java.security.cert.CertificateException, IOException {
BasicX509Credential credential = new BasicX509Credential();
credential.setUsageType(UsageType.SIGNING);
// read public key
InputStream inStream = new FileInputStream("d:\\host.cert");
CertificateFactory cf = CertificateFactory.getInstance("X.509");
X509Certificate cert = (X509Certificate)cf.generateCertificate(inStream);
inStream.close();
credential.setEntityCertificate(cert);
// TODO: read private key
// done.
return credential;
}
Run Code Online (Sandbox Code Playgroud)
但是如何将文件读host.key入私钥部分credential,以便我可以使用生成的Credential实例来签署数据?
Tho*_*nin 19
BasicX509Credential不是标准Java的一部分; 我想你是在谈论org.opensaml.xml.security.x509.BasicX509CredentialOpenSAML.
你想要一个PrivateKey你将要设置的credential.setPrivateKey().要获得a PrivateKey,必须首先将私钥转换为Java可以读取的格式,即PKCS#8:
openssl pkcs8 -topk8 -nocrypt -outform DER < D:\host.key > D:\host.pk8
Run Code Online (Sandbox Code Playgroud)
然后,来自Java:
RandomAccessFile raf = new RandomAccessFile("d:\\host.pk8", "r");
byte[] buf = new byte[(int)raf.length()];
raf.readFully(buf);
raf.close();
PKCS8EncodedKeySpec kspec = new PKCS8EncodedKeySpec(buf);
KeyFactory kf = KeyFactory.getInstance("RSA");
PrivateKey privKey = kf.generatePrivate(kspec);
Run Code Online (Sandbox Code Playgroud)
瞧!你有你的PrivateKey.
默认情况下,openssl以自己的格式写入密钥(对于RSA密钥,PKCS#8恰好是该格式的包装),并在PEM中对它们进行编码,其中Base64具有页眉和页脚.普通Java不支持这两个特性,因此转换为PKCS#8.该-nocrypt选项是因为PKCS#8支持可选的基于密码的私钥加密.
警告:你真的真的想用一个较长的RSA密钥.512位弱; 1999年,一台512位RSA密钥被破坏,有几百台计算机.2011年,凭借12年的技术进步,人们应该假设几乎任何人都可以破解512位RSA密钥.因此,至少使用1024位RSA密钥(最好是2048位;使用密钥时的计算开销并不是那么糟糕,您仍然可以每秒执行数百个签名).
| 归档时间: |
|
| 查看次数: |
20392 次 |
| 最近记录: |