数字签名
服务器首先使用RSA算法生成私钥-公钥对,并只公开公钥。
客户端拿到公钥就可以安全地与服务器通信了。
举个例子,服务器发送的内容是abc,则有:
content=abc
hash值=hash(content)
数字签名=私钥加密hash值
客户端验证签名过程:
1. 公钥解密数字签名得到hash值
2. 实际hash值=hash(content)
结果:
公钥解密出错,有两种情况:一是解密用的公钥是错的;二是数字签名是错的;
比较签名中的hash值与实际hash值,如果相等说明内容没有被修改过,验签成功;如果不相等说明内容被修改过。
数字证书
在客户端验证签名过程中使用的公钥不能保证一定是真的,比如文件损坏,或者其他人替换掉了,都会造成公钥不正确,加以利用后甚至被欺骗。所以服务器的公钥需要一个权威机构认证,就是certificate authority(简称CA),客户端只认CA发布的证书,这样就能保证公钥的正确性。
数字证书=CA私钥加密(服务器的公钥+相关信息)
客户端用CA的公钥(一般都会安装)解密数字证书,得到服务器公钥+相关信息,客户端以本地的证书为基础,判断这个公钥是否通过认证。
例如,客户端如果是浏览器,在浏览器的"证书管理器"有"受信任的根证书颁发机构"列表,浏览器会根据这张列表,查看公钥是否在列表之内,或者判断是否在“证书信任链”中。