了解数字签名

时间:2017-01-20 23:46:38

标签: ssl encryption digital-signature tls1.2

根据我的理解,数字签名利用了非对称加密。 所有者通过加密[私钥]来签名内容,所有其他用户使用公钥解密,然后与纯文本进行比较。是吗?

此外,在SSL / TLS握手协议的其中一个步骤中,用户向服务器发送一条消息:Signature_user(PreMasterKey,...)。 根据我的理解,第三方可以使用公钥解密并获得应该保密的PreMasterKey。

我在这里缺少什么?

1 个答案:

答案 0 :(得分:3)

您对数字签名的理解接近正确。由于非对称加密在实际加密和解密的数据量有限(例如,RSA-4096最多可加密446B),因此数字签名通常为Encrypt(Hash(message), privateKey),其中Hash()是加密散列函数比如SHA-256。任何人都可以使用签名者的公钥解密该值,并且本地应用于可疑消息的相同散列算法以验证签名。您可以自己演示,例如使用gpg

hw12203:/Users/alopresto/Workspace/scratch (master) alopresto
 14s @ 15:49:46 $ echo "This is a test" > sign.txt
hw12203:/Users/alopresto/Workspace/scratch (master) alopresto
 11s @ 15:52:30 $ gpg --sign sign.txt
hw12203:/Users/alopresto/Workspace/scratch (master) alopresto
 60s @ 15:53:22 $ xxd sign.txt.gpg
0000000: a301 014d 02b2 fd90 0d03 000a 013c 6ef6  ...M.........<n.
0000010: 5b2f 7def 6901 ac1d 6208 7369 676e 2e74  [/}.i...b.sign.t
0000020: 7874 5882 a322 5468 6973 2069 7320 6120  xtX.."This is a
0000030: 7465 7374 0a89 021c 0400 010a 0006 0502  test............
...
0000250: 1999 83c9                                ....
hw12203:/Users/alopresto/Workspace/scratch (master) alopresto
 100s @ 15:54:11 $ gpg --verify -vvv sign.txt.gpg
gpg: using character set `utf-8'
:compressed packet: algo=1
:onepass_sig packet: keyid 3C6EF65B2F7DEF69
    version 3, sigclass 0x00, digest 10, pubkey 1, last=1
:literal data packet:
    mode b (62), created 1484956450, name="sign.txt",
    raw data: 15 bytes
gpg: original file name='sign.txt'
:signature packet: algo 1, keyid 3C6EF65B2F7DEF69
    version 4, created 1484956450, md5len 0, sigclass 0x00
    digest algo 10, begin of digest 98 8e
    hashed subpkt 2 len 4 (sig created 2017-01-20)
    subpkt 16 len 8 (issuer key ID 3C6EF65B2F7DEF69)
    data: [4092 bits]
gpg: Signature made Fri Jan 20 15:54:10 2017 PST using RSA key ID 2F7DEF69
gpg: using PGP trust model
gpg: key 00D026C4: accepted as trusted key
gpg: key 51BF2B79: accepted as trusted key
gpg: key 2F7DEF69: accepted as trusted key
gpg: Good signature from "Andy LoPresto <alopresto@apache.org>" [ultimate]
gpg:                 aka "Andy LoPresto <alopresto.apache@gmail.com>" [ultimate]
gpg: binary signature, digest algorithm SHA512
hw12203:/Users/alopresto/Workspace/scratch (master) alopresto
 10s @ 15:54:22 $

请注意,签名操作不会加密消息(您可以在签名文件中看到消息的明文),并且签名使用基础散列函数SHA-512(如果您使用-vvv验证,则可见。

关于你的第二个问题,预主密钥永远不会通过开放渠道共享。它使用共享密钥材料(即,随机数等)独立地在信道的两侧导出。这可以通过(短暂的)Diffie-Hellman Key Exchange(又名“油漆混合”)或其他过程来完成。如果原始RSA用于密钥交换,则客户端使用服务器的公钥发送随机数加密以提供预主密钥。

要完全理解TLS握手过程,请阅读this explanation by Thomas Pornin(我见过的最好的)。一旦你读完了它,IETF RFC 5246(TLS 1.2)会更有意义,你可以根据需要进入杂草。