比较java中的PublicKey对象

我有两个PublicKey对象。我想比较两者的相等性或使用java安全API或弹性城堡API检查哪个是最新的对象。我怎么能实现这个目的?

你可以使用equals

 if (!key.equals(copyKey)){ System.out.println("not equals!"); } 

或检查密钥的哈希码

 if (key.hashCode() != copyKey.hashCode()) { System.out.println("public key hashCode check failed"); } 

或者比较两个公钥的hex字符串

 String encodedKey1 = new String(Hex.encode(key1.getEncoded())); String encodedKey2 = new String(Hex.encode(key2.getEncoded())); if (!encodedKey1.equals(encodedKey2)){ System.out.println("not equals!"); } 

您在Bouncy Castle Tests上有很多关键的比较和检查样本,请查看org.bouncycastle.jce.provider.test包以获取一些代码。 BC不是严格必要的,你可以与默认的java安全类进行比较。

通常使用某种ID来比较公钥。 这取决于协议如何计算密钥ID。 最好的方法可能是遵守PKCS#11规范,该规范定义了计算密钥ID的方法。

创建日期不是密钥本身的组成部分。 您必须在别处定义它,或者您应该使用公钥容器,例如X509证书。 请注意,您可以使用(键的hex表示)键ID在地图中查找创建日期。

最好使用SHA-1哈希而不是模数作为ID。 公钥和私钥的模数是相同的,并且对于每个密钥对应该是不同的。 以下代码计算RSA公钥的ID。

显然你也可以直接比较两个键的模数。 密钥ID虽然更容易存储。

 public class CreateRSAPublicKeyID { /** * Creates a key ID for a given key. * * @param key the key * @return the key ID for the given key */ public static byte[] createKeyID(Key key) { if (key instanceof RSAKey) { RSAKey rsaKey = (RSAKey) key; BigInteger modulus = rsaKey.getModulus(); if (modulus.bitLength() % Byte.SIZE != 0) { throw new IllegalArgumentException("This method currently only works with RSA key sizes that are a multiple of 8 in bits"); } final byte[] modulusData = i2os(modulus, modulus.bitLength() / Byte.SIZE); MessageDigest sha1; try { sha1 = MessageDigest.getInstance("SHA-1"); } catch (NoSuchAlgorithmException e) { throw new IllegalStateException("SHA-1 message digest should be available in any Java SE runtime", e); } return sha1.digest(modulusData); } throw new UnsupportedOperationException("Key type not supported"); } /** * Integer to octet string (I2OS) creates a fixed size, left padded, big-endian octet string representation for * a given integer. * * @param i the integer * @param octets the number of octets (bytes) * @return the octet string representation of i */ public static byte[] i2os(BigInteger i, int octets) { if (i.bitLength() > octets * Byte.SIZE) { throw new IllegalArgumentException("i does not fit in " + octets + " octets"); } final byte[] is = i.toByteArray(); if (is.length == octets) { return is; } final byte[] ius = new byte[octets]; if (is.length == octets + 1) { System.arraycopy(is, 1, ius, 0, octets); } else { System.arraycopy(is, 0, ius, octets - is.length, is.length); } return ius; } public static String toHex(byte[] data) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < data.length; i++) { sb.append(String.format("%02X", data[i])); } return sb.toString(); } public static void main(String[] args) throws Exception { KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); kpg.initialize(2048); KeyPair pair = kpg.generateKeyPair(); byte[] keyID = createKeyID(pair.getPublic()); System.out.println(toHex(keyID)); } } 

请注意, getModulus()命令可能与某些密钥库(例如代表HSM令牌或智能卡的密钥库getModulus()不兼容。

看看Oracle的文档 ,我想你可以使用它的3个getter比较PublicKeygetAlgorithmgetEncodedgetFormat这样做:

oldKey.getAlgorithm().equals(newKey.getAlgorithm())等等。