数字签名和数字证书

数字签名

数字签名是一种用于信息真实性完整性校验的手段,一套数字签名包含签名和验证两种运算。下面是一套简单的数字签名示意图。

数字签名

原理

数字签名使用非对称加密技术。每个人都有一对钥匙,私钥只有本人知道,公钥公开,私钥签名,公钥验签。

在进行信息传递时,信息发送者用私钥生成签名并将公钥一起发送给信息接收者,接收者使用公钥验签。上述过程中信息完整性得到校验,但发送者的身份是否合法无法得知(因为任何人都可以声称自己是合法的),因此引入了身份认证机构

身份认证机构是信息接收者能信任的机构,所有的公钥必须向该机构进行注册。注册后身份认证机构给发送者颁发一数字证书。对文件签名后,发送者把此数字证书连同文件及签名一起发给信息接收者,接收者向身份认证机构求证是否真地是用发送者密钥签发的文件。

数字证书

数字证书是一种电子档案,用来证明公钥拥有者的身份。此档案包含了公钥信息、拥有者身份信息(主体)、以及数字证书认证机构(发行者)对该文件的数字签名。

证书的本质就是对公钥加数字签名,认证机构用自己的私钥对需要认证的人(或组织机构)的公钥进行数字签名并生成证书。

证书种类

我们需要了解以下几种类型的证书

  • 自签证书
  • 根证书
  • 中介证书
  • TLS 服务器证书
  • TLS 客户端证书

自签证书

用户可以自己生成数字证书,不过没有任何可信赖的人签名,它主要用于小范围测试,这种自签名证书通常不会被广泛信任,使用时可能会遇到电脑软件的安全警告。

根证书

根证书获得广泛认可,通常已预先安装在各种软体(包括操作系统、浏览器、电邮软件等),作为信任链的起点,来自于公认可靠的政府机关、证书颁发机构公司、非营利组织等,与各大软件商透过严谨的核认程序才在不同的软件广泛部署。由于部署程序复杂费时,需要行政人员的授权及机构法人身份的核认,一张根证书有效期可能长达二十年以上。在某些企业,也可能会在内部电脑自行安装企业自签的根证书,以支援内部网的企业级软件;但是这些证书可能未被广泛认可,只在企业内部适用。

中介证书

认证机构的一个重要任务就是为客户签发证书,虽然广泛认可的认证机构都已拥有根证书,相对应的私钥可用以签署其他证书,但因为密钥管理和行政考虑,一般会先行签发中介证书,才为客户作数位签署。中介证书的有效期会较根证书为短,并可能对不同类别的客户有不同的中介证书作分工。

TLS服务器证书

网站在互联网上提供服务时,域名就是服务器证书上主体,相关机构名称则写在组织或单位一栏上。证书和私钥会安装在服务器。客户端的软件(如浏览器)会执行认证路径验证算(Certification path validation algorithm)以确保安全,如果未能肯定加密通道是否安全(例如证书上的主体名称不对应网站域名、伺服器使用了自签证书、或加密算法不够强),可能会警告用户。

TLS客户端证书

客户端证书包含电子邮件地址或个人姓名,而不是主机名。客户端证书比较不常见,因为考虑到技术门槛及成本因素,通常都是由服务提供者验证客户身份,而不是依赖第三方认证机构。通常,需要使用到客户端证书的服务都是内部网的企业级软件,他们会设立自己的内部根证书,由企业的技术人员在企业内部的电脑安装相关客户端证书以便使用。在公开的互联网,大多数网站都是使用登入密码和Cookie来验证用户,而不是客户端证书。

根证书(自签证书)、中介证书和终端实体(TLS服务器/客户端)证书的形成如下信任链

信任链

证书格式

证书一般遵从X.509格式规范

  • 版本:现行通用版本是V3

  • 序号:用以辨识每一张凭证,特别在撤消凭证的时候有用

  • 主体:拥有此凭证的法人或自然人身份或机器,包括:

    • 国家(C,Country)
    • 州/省(S,State)
    • 地域/城市(L,Location)
    • 组织/单位(O,Organization)
    • 通用名称(CN,Common Name):在TLS应用上,此栏位一般是域名
  • 发行者:以数字签名形式签署此凭证的数字证书认证机构

  • 有效期开始时间:此凭证的有效开始时间,在此前该凭证并未生效

  • 有效期结束时间:此凭证的有效结束时间,在此后该凭证作废

  • 公钥用途:指定凭证上公钥的用途,例如数字签名、服务器验证、客户端验证等

  • 公钥

  • 公开密钥指纹

  • 数字签名

  • 主体别名

证书可以二进制或 Base64 形式储存,常见的文件扩展名有.cer、.crt、.der和.pem。如果把证书和私钥一起储存,则可以使用PKCS#12(.p12)格式。

  • DER用于二进制DER编码的证书。
  • PEM用于不同类型的X.509v3文件,是以“ - BEGIN ...”前缀的ASCII(Base64)数据。
  • CER和CRT几乎同义,证书可以被编码为二进制DER或ASCII PEM。
  • PKCS7 文件,也被称为P7B,通常用于Java Keystores 和 Microsoft IIS(Windows)。它们是ASCII 文件,可以包含证书和CA 证书。
  • PKCS12 文件,也被称为PFX 文件,通常用于在Micrsoft IIS(Windows)中导入和导出证书链。

应用

我们在写对外 API 时,针对信息传递的安全考虑,做如下设计

  • 敏感信息脱敏,进行信息加密
  • 防止信息被篡改,进行数字签名

我们使用 SHA256withRSA 进行签名,下面是一个Java简单例子


    public static String sign(byte[] privateKey, String content) {
        try {
            java.security.Signature signature = java.security.Signature
              .getInstance("SHA256withRSA");

            PrivateKey priKey = KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(privateKey));

            signature.initSign(priKey);
            signature.update(content.getBytes(StandardCharsets.UTF_8));

            byte[] signed = signature.sign();
            return URLEncoder.encode(Base64.getEncoder().encodeToString(signed), "UTF-8");
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static boolean verify(byte[] publicKey, String content, String signatureToBeVerified) {

        if (StringUtils.isBlank(signatureToBeVerified)) {
            return false;
        }

        try {
            java.security.Signature signature = java.security.Signature.getInstance("SHA256withRSA");

            PublicKey pubKey = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(publicKey));

            signature.initVerify(pubKey);
            signature.update(content.getBytes(StandardCharsets.UTF_8));

            return signature.verify(Base64.getDecoder().decode(URLDecoder.decode(signatureToBeVerified, "UTF-8").getBytes(StandardCharsets.UTF_8)));
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容