什么是RSA“密钥ID”?

时间:2011-04-25 05:03:58

标签: cryptography rsa

我已经看过几个地方使用的密钥ID,并希望在我的程序中使用它们,但我无法找到它们的描述。它们是如何产生的?

5 个答案:

答案 0 :(得分:7)

刚刚为了我自己的目的而做了这件事,我会把它写下来,而这一切都在我的头脑中......

“官方”密钥ID(即X509证书中“X509v3主题密钥标识符”扩展名的内容)是DER编码的ASN.1序列的SHA1哈希值,由一个模数和指数组成。 RSA公钥。它需要拼凑三个不同的RFC和一些实验来提出它,但这就是它的工作原理。

一些用于编码的Ruby代码如下所示 - 在stdin上提供RSA公钥或私钥:

require 'openssl'

pkey = OpenSSL::PKey::RSA.new($stdin.read).public_key

seq = OpenSSL::ASN1::Sequence([OpenSSL::ASN1::Integer.new(pkey.n),
                               OpenSSL::ASN1::Integer.new(pkey.e)])
puts Digest::SHA1.hexdigest(seq.to_der).upcase.scan(/../).join(':')

答案 1 :(得分:3)

以不同的格式(PGP,SSH,X.509证书),密钥ID具有不同的含义。 SSH和X.509都没有密钥ID的“专用”概念,但有些人使用这个术语(包括他们的软件) - 在这种情况下,它通常是公钥或整个证书的哈希。

更新:评论提醒我,X.509证书中存在“密钥标识符”扩展名,有时它们被称为密钥ID。然而,这并不常见 - 通常哈希(有时也称为指纹)被称为密钥ID。

答案 2 :(得分:2)

Strongswan的情况下,可以使用其命令行实用程序显示它所指的keyidkeyid的要点是它可用于标识证书中包含的实际公钥,以便证书可能会更改,但通过检查keyid,可以检查密钥是否已更改。

pki命令将列出X.509证书的keyids,如下所示(subjectPublicKeyInfo hashkeyid):

pki --keyid --in cert.pem --type x509

或者对于RSA私钥:

pki --keyid --in key.pem

第二个命令是ipsec,可用于列出/etc/ipsec.d子目录中安装的所有证书(和配置)(此命令将列出证书及其对应的keyidsubjectPublicKeyInfo hash命令列出的pki相同:

ipsec listall

也可以使用openssl生成Strongswan的keyid概念,它基本上是实际RSA公钥的SHA1(sed脚本只是删除'--- --BEGIN公共密钥-----'和END横幅)[修正Micah的评论后]:

openssl x509 -in cert.pem -noout -pubkey | sed 's/--.*$//g' | base64 --decode | sha1sum

答案 3 :(得分:1)

GPG / PGP中用于RSA密钥的“密钥ID”是密钥模数的最后8个十六进制数字。

答案 4 :(得分:1)

当您使用 gpg 解密时,它会提供一个“长”keyID 哈希值。要验证使用了哪个密钥,请使用以下长格式列出密钥:

gpg --list-keys --keyid-format long

要在不更新默认密钥环的情况下列出不同密钥环中的密钥,请使用:

gpg --keyring <path-to-pubring.kbx> --no-default-keyring --list-keys