【发布时间】:2012-07-26 08:21:04
【问题描述】:
我有一个外部服务,它在某些定义的事件后给我回电,并用它的私钥签署他的请求。
我已经存储了如下所示的公钥:
-----BEGIN PUBLIC KEY-----
........................................
-----END PUBLIC KEY-----
所以我的工作是通过验证签名来检查请求的内容是否没有被更改。
这是我的算法:
// 1 - reading public key :
Scanner scanner = new Scanner( new File( keyPath ) );
// encodedPublicKey.toString( );
StringBuilder sb = new StringBuilder( );
while ( scanner.hasNextLine( ) )
{
sb.append( scanner.nextLine( ) );
sb.append( '\n' );
}
byte[] encodedPublicKey = sb.toString( ).getBytes( "utf-8" );
// 2 - loading public key in a relevant object :
X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec( publicKeyBytes );
KeyFactory keyFactory = KeyFactory.getInstance( "DSA" );
PublicKey publicKey = keyFactory.generatePublic( publicKeySpec );
// 3 - verifying content with signature and content :
Signature sig = Signature.getInstance( "SHA1withDSA" );
sig.initVerify( publicKey );
sig.update( message.getBytes( ) );
ret = sig.verify( sign.getBytes( ) );
但是现在我的算法在“PublicKey publicKey = keyFactory.generatePublic(publicKeySpec)”处停止:
java.security.spec.InvalidKeySpecException: Inappropriate key specification: invalid key format
那么如何以 java api 接受的方式加载我的密钥?
【问题讨论】:
-
你知道对方用什么加密算法来创建他的私钥吗?错误消息似乎在说您使用了错误的加密算法,或者该算法不是 API 的一部分。如果是这种情况,您可能需要找到 SHA1withDSA 的实现。但我认为这应该已经存在了。
-
文档说 RSA,但据我所知,它并不真正可信,所以我尝试了 RSA 和 DSA,最终异常结果相同。
-
您好,这方面有进展吗?我试着编译你上面的例子,但它不会在评论项 2 上编译。找不到 var "publicKeyBytes"
标签: java public-key verify