【问题标题】:Compare two Public Key values in java [duplicate]比较java中的两个公钥值[重复]
【发布时间】:2016-05-25 22:24:53
【问题描述】:

比较从服务器提取的公钥和 java 中本地存储的密钥的最佳方法是什么?

这是获取公钥的代码

公共静态PublicKey getPublicKey(){

    String hostname = "www.google.com";
    SSLSocketFactory factory = HttpsURLConnection.getDefaultSSLSocketFactory();        
    SSLSocket socket = null;
    Certificate[] certs = null;
    try {
        socket = (SSLSocket) factory.createSocket(hostname, 443);
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    try {
        socket.startHandshake();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    try {
        certs = socket.getSession().getPeerCertificates();
    } catch (SSLPeerUnverifiedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    Certificate cert = certs[0];
    PublicKey key = cert.getPublicKey();
    System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
    System.out.println("Public key \n" + key);
    System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");

    return key;
}

我想将响应中的公钥与本地存储的密钥(例如在文本文件中)进行比较。

谢谢

【问题讨论】:

  • 这是对象到对象的比较,我打算将公共文件作为文件读取,将字符串与服务器的响应进行比较似乎不是正确的方法。跨度>

标签: java security


【解决方案1】:

使用 equals() 方法,如果它是您正在使用的对象的类,则在 RSAPublicKeyImpl 中实现。

【讨论】:

    【解决方案2】:

    您需要使用证书的唯一标识符“指纹”来比较公钥。这个指纹基本上就是证书的 SHA-1。

        public class X509 {
    
        public static void main(String[] args) {
            FileInputStream is;
            try {
                is = new FileInputStream("/tmp/certificate_x509.pem");
                CertificateFactory x509CertFact = CertificateFactory.getInstance("X.509");
                X509Certificate cert = (X509Certificate)x509CertFact.generateCertificate(is);
                String thumbprint = getThumbPrint(cert);
                System.out.println(thumbprint);
    
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (CertificateException e) {
                e.printStackTrace();
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }
    
        }
    
        public static String getThumbPrint(X509Certificate cert) 
            throws NoSuchAlgorithmException, CertificateEncodingException {
            MessageDigest md = MessageDigest.getInstance("SHA-1");
            byte[] der = cert.getEncoded();
            md.update(der);
            byte[] digest = md.digest();
            return hexify(digest);
    
        }
    
        public static String hexify (byte bytes[]) {
    
            char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', 
                    '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
    
            StringBuffer buf = new StringBuffer(bytes.length * 2);
    
            for (int i = 0; i < bytes.length; ++i) {
                buf.append(hexDigits[(bytes[i] & 0xf0) >> 4]);
                buf.append(hexDigits[bytes[i] & 0x0f]);
            }
    
            return buf.toString();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-19
      • 1970-01-01
      • 2014-01-09
      • 1970-01-01
      • 1970-01-01
      • 2012-06-19
      • 2019-12-30
      • 1970-01-01
      相关资源
      最近更新 更多