我正在测试以下代码以在我的机器上查找证书哈希码,然后在不同的vm上使用java 7运行相同的代码。
我很困惑地看到哈希码的区别。
这是我的代码:
import javax.net.ssl.HttpsURLConnection;
import java.net.URL;
import java.security.cert.Certificate;
public class Main {
public static void main(String[] args) throws Exception {
HttpsURLConnection urlc = (HttpsURLConnection) new URL("https://www.google.com").openConnection();
print_https_cert(urlc);
}
private static void print_https_cert(HttpsURLConnection con) {
if (con != null) {
try {
System.out.println("Response Code : " + con.getResponseCode());
System.out.println("Cipher Suite : " + con.getCipherSuite());
System.out.println("\n");
Certificate[] certs = con.getServerCertificates();
for (Certificate cert : certs) {
System.out.println("Cert Type : " + cert.getType());
System.out.println("Cert Hash Code : " + cert.hashCode());
System.out.println("Cert Public Key Algorithm : "
+ cert.getPublicKey().getAlgorithm());
System.out.println("Cert Public Key Format : "
+ cert.getPublicKey().getFormat());
System.out.println("\n");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
以下是我使用java 1.7.0_79
获得的内容回复代码:200
密码套件:TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
证书类型:X.509证书哈希码:10920939证书公钥算法 :RSA证书公钥格式:X.509
证书类型:X.509证书哈希码:6561088证书公钥算法: RSA证书公钥格式:X.509
证书类型:X.509证书哈希码:8774863证书公钥算法: RSA证书公钥格式:X.509
以及java 1.8.0_77的输出
响应代码:200密码套件: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
证书类型:X.509证书哈希码:-106561125证书公钥 算法:RSA证书公钥格式:X.509
证书类型:X.509证书哈希码:771393018证书公钥算法 :RSA证书公钥格式:X.509
证书类型:X.509证书哈希码:349192256证书公钥算法 :RSA证书公钥格式:X.509
哈希码是否相同或我在这里遗漏了什么?
答案 0 :(得分:1)
同一程序的不同执行之间的hashCode()
并不相同,更不用说不同的Java版本了。你正在调用错误的方法。你应该打电话给X509Certificate.getSerialNumber()
。
答案 1 :(得分:0)
java.security.cert.Certificate
的hascode()方法已更改。至少对于openjdk:
允许哈希码在jdk版本之间进行更改。主要用途是将Object
存储在HashMap
中。完全忽略了将对象的哈希码传递给“外部”或持久化它。
如果您需要证书的哈希,我建议您实现自己的哈希函数,这样您就不会依赖于允许更改的内部行为。
如何计算Java对象的哈希码没有严格的算法。实现者只需要与hashcode()和equals()契约对齐。
http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#hashCode--