根据我的理解,数字签名利用了非对称加密。 所有者通过加密[私钥]来签名内容,所有其他用户使用公钥解密,然后与纯文本进行比较。是吗?
此外,在SSL / TLS握手协议的其中一个步骤中,用户向服务器发送一条消息:Signature_user(PreMasterKey,...)。 根据我的理解,第三方可以使用公钥解密并获得应该保密的PreMasterKey。
我在这里缺少什么?
答案 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)会更有意义,你可以根据需要进入杂草。