17

我正在实施 Bing Cashback。为了验证来自 Bing 的传入请求是否有效,它们提供了签名。签名是使用 RSA 加密的 url 的 160 位 SHA-1 哈希。

Microsoft 提供了 RSA“公钥”、模数和指数,我应该用它来解密散列。

正如微软所说,有没有办法创建解密散列所需的 Java 密钥对象?

我能找到的所有东西都会自动创建 RSA 密钥对,因为 RSA 应该是这样工作的。如果可能的话,我真的很想使用 Java 对象,因为这显然比手动编码的解决方案更可靠。

他们提供的示例代码位于 .NET 中,并使用 .NET 库函数来验证哈希。特别是 RSACryptoServiceProvider.VerifyHash()

4

3 回答 3

37
RSAPublicKeySpec spec = new RSAPublicKeySpec(modulus, exponent);
KeyFactory factory = KeyFactory.getInstance("RSA");
PublicKey pub = factory.generatePublic(spec);
Signature verifier = Signature.getInstance("SHA1withRSA");
verifier.initVerify(pub);
verifier.update(url.getBytes("UTF-8")); // Or whatever interface specifies.
boolean okay = verifier.verify(signature);
于 2010-01-07T21:00:21.937 回答
3

使用 java.security.spec.RSAPublicKeySpec。它可以从指数和模数构造一个键。然后使用带有密钥规范的 java.security.KeyFactory.generatePublic() 作为参数。

于 2010-01-07T20:57:53.420 回答
0

这样的事情应该可以解决问题:

  private PublicKey convertPublicKey(String publicKey) throws Exception{
    PublicKey pub = null;

    byte[] pubKey = Hex.decodeHex(publicKey.toCharArray());
    X509EncodedKeySpec pubSpec = new X509EncodedKeySpec(pubKey);
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    pub = (RSAPublicKey) keyFactory.generatePublic(pubSpec);

    return pub;
  }

这假设公钥以十六进制字符串的形式给出,并且您需要Apache Commons Codec 库

如果您有不同格式的密钥,请尝试使用KeyFactory以获取更多信息。

于 2010-01-07T20:56:15.580 回答