【问题标题】:Creating a random signature创建随机签名
【发布时间】:2015-05-02 17:30:48
【问题描述】:

我正在尝试使用initSign(PrivateKey privateKey, SecureRandom random) 方法计算文档的签名。 在调用方法之前,我实例化了一个对象:

SecureRandom random = new SecureRandom();  

但是当我用同一个密钥多次调用该方法时,它总是给我相同的签名而不是随机化它,即使随机数一次又一次地改变。 为什么?

【问题讨论】:

  • 对于离题投票:为什么需要代码来回答这个问题?我不明白如果没有代码就无法回答这个问题,描述很清楚(无论如何对我来说)。也就是说,目前我不确定签名格式,所以代码肯定会受到欢迎。

标签: java security random digital-signature


【解决方案1】:

您可能正在使用 PKCS#1 v1.5 填充方案之一。这些是使用 MD2withRSA、MD5withRSA、SHA1withRSA、SHA256withRSA、SHA384withRSA、SHA512withRSA 之一创建的。然而,这些方案都没有将随机数作为参数。 RSA / PSS 可以,但它不包含在标准 API 中(尽管您可以使用 Bouncy Castle 提供程序)。 ECDSA 还使用随机生成签名。

Java 密码体系结构定义了类似Signature 类的类以供一般使用。这意味着会有一些方法和参数不适用于某些算法。在您的情况下,RSA PKCS v1.5 签名生成只是忽略随机,因为它不需要它。

Security.addProvider(new BouncyCastleProvider());
for (int i = 0; i < 2; i++) {
    Signature pss = Signature.getInstance("SHA256withRSA/PSS");
    SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
    // not random: random.setSeed(new byte[16]);
    pss.initSign(generatedKeyPair.getPrivate(), random);
    pss.update("owlstead".getBytes(StandardCharsets.UTF_8));
    byte[] sig = pss.sign();
    System.out.println(Hex.toHexString(sig));
}

【讨论】:

  • 这在什么方面不能回答您的问题?有什么遗漏或者你不明白答案的意思吗?
猜你喜欢
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-30
  • 1970-01-01
  • 2012-11-16
  • 1970-01-01
相关资源
最近更新 更多