`

在java中获取X.509证书微缩图的方法

阅读更多

  在IE中查看证书信息,在证书详细信息标签页中的最下面有证书的“微缩图算法”和“微缩图”2个值。

  微缩图的概念是微软自己定义的,其原理就是对证书的编码信息再做一次sha1的摘要。注:sha1就是微缩图算法,该值也可能为MD5.

  在java的Certificate类中,不能直接得到微缩图,需要根据微缩图的算法和其原理得到微缩图。

具体代码如下:

package com.wiflish.framework.util;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateEncodingException;
import java.security.cert.X509Certificate;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * 获取证书微缩图的工具类。
 * 
 * @author wiflish
 * 
 */
public class TummbPrintUtils {
    private static final Log logger = LogFactory.getLog(TummbPrintUtils.class);

    /**
     * 获取微缩图。
     * 
     * @param cert 证书。
     * @param thumAlg 微缩图算法。
     * @param delimiter 分隔符,如:":"
     * @return 返回微缩图。
     */
    public static String getThumbprint(X509Certificate cert, String thumAlg, String delimiter) {
        if (cert == null) {
            return null;
        }

        if (thumAlg == null || thumAlg.length() == 0) {
            return null;
        }

        String thumbPrint = "";
        try {
            MessageDigest md = MessageDigest.getInstance(thumAlg);
            byte rawDigest[] = md.digest(cert.getEncoded());
            thumbPrint = getHex(rawDigest, delimiter);
        } catch (NoSuchAlgorithmException e) {
            thumbPrint = "";
            logger.error("不支持[" + thumAlg + "]算法!", e);
        } catch (CertificateEncodingException e) {
            thumbPrint = "";
            logger.error("证书编码异常!", e);
        }

        return thumbPrint;
    }

    /**
     * 获取证书微缩图,默认使用sha1算法,默认微缩图字符串不进行分隔。
     * 
     * @param cert 证书
     * @return
     */
    public static String getThumbprint(X509Certificate cert) {
        return getThumbprint(cert, "sha1", null);
    }

    /**
     * 获取证书微缩图。默认使用sha1算法,使用指定的分隔符进行分隔。
     * 
     * @param cert 证书。
     * @param delimiter 指定的分隔符,如:":"。
     * @return
     */
    public static String getThumbprint(X509Certificate cert, String delimiter) {
        return getThumbprint(cert, "sha1", delimiter);
    }

    /**
     * 将将证书摘要转换为16进制字符串,即得到证书微缩图。
     * 
     * @param buf
     * @param delimiter
     * @return
     */
    private static String getHex(byte buf[], String delimiter) {
        String result = "";

        if (buf == null) {
            return "";
        }

        String defaultDelimiter = "";
        if (delimiter != null && delimiter.length() > 0) {
            defaultDelimiter = delimiter;
        }

        for (int i = 0; i < buf.length; i++) {
            if (i > 0) {
                result += defaultDelimiter;
            }

            short sValue = buf[i];
            int iValue = 0;
            iValue += sValue;
            String converted = Integer.toHexString(iValue);

            if (converted.length() > 2) {
                converted = converted.substring(converted.length() - 2);
            }
            // 只有1位数时,前面补0。
            else if (converted.length() < 2) {
                converted = ("0" + converted);
            }

            // 将微缩图都转换为大写字母。
            result += converted.toUpperCase();
        }
        return result;
    }
}
 

 

 

 

 

 

 

分享到:
评论

相关推荐

    生成微缩图并保存

    在IT行业中,生成微缩图是一项常见的图像处理任务,它主要应用于网站、应用程序或数据库中,以节省存储空间,加快页面加载速度,并提供快速预览功能。本篇将详细讲解生成微缩图的过程以及自动保存的实现方法。 一、...

    最新java知识点概要.pdf

    在Java的知识体系中,我们可以看到以下几个核心要点: 1. **Java 版本**:Java 2 分为三个主要版本,包括J2SE(标准版)、J2EE(企业版)和J2ME(微缩版)。J2SE是用于桌面应用和基础商务应用的基础平台,J2EE则...

    java知识点概要.doc

    - **编写**:在Java开发环境中编写源代码,保存为`.java`文件。 - **编译**:使用`javac`编译器将`.java`文件编译成`.class`字节码文件。 - **运行**:使用`java`命令解释执行`.class`文件。 #### 四、Java的字节码...

    2023年java知识点概要.doc

    20. **方法**:方法是类中定义的行为,包含一系列语句。 21. **异常处理**:Java支持try-catch-finally语句块进行异常处理,可以指定方法可能抛出的异常类型。 以上内容涵盖了Java的基础知识,包括语言结构、运行...

    JAVA_API_CN.rar

    Java API,全称为Java应用程序接口,是Java编程语言的核心组成部分,包含了Java平台标准版(Java SE)、企业版(Java EE)以及微缩版(Java ME)等不同版本的类库和接口。这些API为开发者提供了丰富的功能,涵盖了从...

    Functional Interfaces in Java.pdf

    它们是Java 8及后续版本中引入的一个重要的新特性,允许将函数作为参数传递给方法,或者将方法作为值存储在变量中。函数式接口是Lambda表达式的基础,通过Lambda表达式可以为接口的抽象方法提供实现,使得代码更加...

    java正式课程.md

    - **语言排名**:Java在编程语言排行榜中常年稳居前列,显示出其强大的影响力和广泛的适用性。 - **核心特点**:Java最显著的特点之一就是跨平台性,即“一次编译,到处运行”。这一特性得益于Java虚拟机(JVM)的...

    jpeg微缩图制作示例

    在创建微缩图的过程中,关键步骤包括: 1. **解码原始JPEG图像**:调用`jpeg_read_header`来读取JPEG文件的元数据,包括图像的宽度、高度、颜色空间等信息,然后使用`jpeg_start_decompress`开始解码过程。 2. **...

    图片智能微缩模块.rar

    图片智能微缩模块是计算机视觉领域中的一个重要技术,主要用于处理大量图像数据,特别是在大数据和云计算环境中。这个模块的目的是在不显著降低图像质量的前提下,减少图像的存储空间和传输带宽,提高系统效率。...

    电信设备-微缩二维码信息安全线及其制作方法与用途.zip

    3. 维护追溯:在维修或售后服务中,通过读取微缩二维码,快速获取设备的维修记录和保修信息。 五、微缩二维码信息安全线的未来发展趋势 随着科技的进步,微缩二维码信息安全线的应用前景广阔。未来可能在物联网...

    Java理论与实践再研究.pdf

    文件概述了设计模式的基本概念和如何在Java程序设计中应用基本的设计模式,如单例模式、工厂方法、值对象、DAO模式、责任链模式和迭代器模式。 最后,文件探讨了学习Java的方法和思考方式,强调了认识事物的一般...

    php生成微缩图的函数

    在PHP中,生成微缩图是一项常见的任务,特别是在网站开发中,用于优化图像显示和减少服务器负载。本文将深入探讨如何使用PHP函数来创建微缩图,并解释相关的知识点。 首先,PHP中最常用的图像处理库是GD库,它包含...

    Java语录.ppt

    2. JME(Java Micro Edition):微缩版,用于移动设备和嵌入式系统的开发。 3. JEE(Java Enterprise Edition):企业版,针对大型企业级应用,如Web服务、分布式系统等。 在使用Java进行开发时,安装Java ...

    Learn Java with Math.pdf

    5. 在书籍中使用的商标名称、标志和图片可能未加商标符号,但出于对商标所有者的尊重,作者声明无意侵犯任何商标权。 6. 出版社和作者声明所提供的建议和信息在出版日期时是真实准确的,但由于编写到出版过程中可能...

    广阔天地,VC游戏制作中的一个模块实例代码.rar

    4. 在场景中加入其它活动对象(加入了动物,现在我还没有叫它们跑。) 游戏操作方法: A、在场景内点任意点,指挥主角移动。 B、将鼠标移到场景外,可以移动地图。 C、在微缩地图上点一下,可以快速定位。 D、ESC...

    SQL2 Java SQL access to a Java based Database System by Chris Lambert B.Sc.

    标题《SQL2 Java:SQL访问基于Java的数据库系统》所描述的是一种数据库管理系统(DBMS)的开发,重点是实现SQL语言与基于Java的数据库系统的交互。这项工作由Chris Lambert完成,并作为获取计算机科学硕士学位的一部分...

    Java语言程序设计第三版-习题答案.pdf

    Java技术体系主要由三部分组成:Java平台标准版(Java SE)、Java平台企业版(Java EE)、Java平台微缩版(Java ME)。Java SE为Java桌面和工作组级应用的开发与运行提供了环境。它的实现主要包括Java SE ...

    JAVA入门_精品21天学通JAVA

    在学习Java的过程中,搭建开发环境是第一步,这包括下载、安装和配置JDK(Java Development Kit)。JDK是Java开发工具包,是运行Java程序所必需的。配置JDK环境变量使得系统可以识别Java命令,从而可以编译和运行...

Global site tag (gtag.js) - Google Analytics