签名
当你在一个纸质文件上写上你的名字,按上你的指纹,就意味着这张纸上的内容经过了你的认可,你的笔迹和指纹就是你身份的证明。这是因为,笔迹很难伪造,而每个人的指纹更是独一无二的。在签名前,我们会检查文件内容有没有歧义、有没有涂改、有没有多余不必要的空白等,确认无误后再写下我们的名字,而收到签名后文件的人,再次对文件内容及签名进行检查,以确保文件内容的有效性和完整性。
因此,签名可以用来认证签名者的身份及确保被签名文件内容的真实性。
数字签名
在互联网时代,文件以电子形式存在电脑里,我们从网上下载的文件、程序等也很有可能被人植入木马病毒,这些电子文件不能像纸质文件一样,通过物理手段(笔迹和指纹)来签名,因此需要一种手段来对电子文件进行签名,即数字签名,来确保文件的真实性、有效性。
在学习数字签名之前,需要先了解以下几个概念:
1、HASH算法
Hash,一般翻译做散列或音译为哈希,简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。常用的HASH算法有:MD5,SHA1,SHA256等。
比如,“我是小新,我喜欢吃青椒,大姐姐你呢?”这句话的MD5值为:
F282C0E90871AC370C57C1539D3CFDB6
如果把这句话最后一个问号改为句号,则MD5值为:
1515C89B2F8734049846E542B2CFAAB8
哪怕只修改一个字符,哈希值也会不一样,因此,MD5这类哈希算法通常用来验证内容有没有被篡改。
另外,总有人认为MD5是用来加密的,这是不对的,有加密就有解密,而MD5是不可逆向的,我们通常把用户输入的密码用MD5计算后保存到数据库,这确实起到了一定的“加密”的作用,因为数据库里保存的确实不是用户明文密码了,但是,没有人可以通过这个密文反推用户真实的密码,也就是说,不存在所谓的MD5“解密”。网上所谓的一些MD5破解,不过是用字典来匹配罢了,同一个字符串的MD5值是不会变的,因此只要有一个明文密码和其MD5值的字典,就可以用MD5值找其对应的明文密码,不过也不用担心,在保存用户名密码的时候加随机盐就能解决这个匹配的问题。2004年王小云教授证明了MD5可以碰撞,即两个完全不同的字符串可能计算出完全一样的HASH值,但跟破解没半毛钱关系。
2、对称加密
对称的意思是,加密和解密使用同一个密钥,常用算法有AES、RC4、3DES等。
在谍战剧里,通常会有一个密码本(明文和密文对应关系列出来),在前些年很火的电视剧《潜伏》里,余则成就有一个密码本,每次收到密码后在纸上写下来,然后翻开密码本找对应的明文,只要这个密码本不泄露,军统的那些人就破解不了他的密码。当然,在现实里,即使密码本没有泄露,为了保证安全,地下工作者也可能会不定期更换密码本。
还有一个真实的事件:在抗日战争时期,有一段时间,重庆每天遭受日机多架次的狂轰滥炸,高射炮每次都打不下来,日军的飞机总在高射炮的射程之外,后来密码学专家破译了一个叫独臂大盗的间谍发送给日军的电报,他是一名高射炮团的营长,他用电报机发送密文将高射炮的射程告诉了日军,他的密码本是诺贝尔文学奖获得者赛珍珠的长篇小说《大地》,书的页码是密文,每一页的第一个单词是明文,他用电报机传送页码给日军,日军情报部门用页码找对应的英文单词,这样,就完成了情报的加密和解密。
3、非对称加密
非对称加密即加密和解密使用的不是同一个密钥,而是一个密钥对,密钥对包含一个公钥和一个私钥,它的原理是找几个很大的质数进行一些数学运算,这些质数满足一定的数学关系。常用非对称加密算法有RSA,DSA/DSS等。
- 公钥加密的数据只有其对应的私钥才可以解密,私钥加密的数据只有其对应的公钥才可以解密。公钥可以告诉任何人,但是私钥绝对不能泄露。
- 私钥加密的信息,拥有公钥的人都可以解密,而公钥加密的信息,只有有私钥的人才可以解密。
- 非对称加密要比对称加密更安全,计算也更复杂,但是要知道,世界上没有什么密码是破解不了的,只是时间问题。
- 私钥还可以用于签名,验证对方是否为私钥拥有者,公钥不能用于签名,因为公钥谁都可以有。
下面举例说明什么是数字签名和数字证书:
小张考上了北京大学,小李进了中等技术学校,小红在百货公司当售货员:他们都有光明的前途。这些都不重要,重要的是小张和小李都喜欢小红。
1、小红有两把钥匙,一把是公钥,另一把是私钥。小红把公钥送给小张和小李各一把。
2、小张给小红写信,然后用公钥加密,小红收到信以后用私钥解密,得到信的内容:“我们在一起吧!”。
3、小红给小张回信,她决定进行数字签名,她先用HASH函数(如MD5)计算信的摘要,然后再用私钥把摘要也加密,生成一个数字签名,再把信也加密,最后把签名放到信的后面一起发给小张。
4、小张收到信以后用公钥解密,得到信的内容:“好!”,然后用公钥解开信后面的数字签名,可以得到信息摘要,证明信确实是小红写的,然后自己再用MD5计算一下信的信息摘要,跟前面得到的摘要相等,证明信没有被修改过。
5、这跟小李有什么关系呢?这就有了,小李自学黑客知识,黑进了小张电脑,由于小李也有一把公钥,所以他也可以解密,看到了回信内容。
6、恼羞成怒的小李决定破坏他们的感情,于是小李自己生成了一对公钥和私钥,然后用自己的公钥替换了小张的公钥,然后冒充小红写信给小张,并用自己的私钥加密。
7、小张收到信后,用公钥(已经被替换为小李的公钥)解密,得到信的内容:“我们分手吧!”。小张懵了,而小李一脸奸笑。
8、小张坐火车去找小红,结果两人发现那封信是被人冒充了,小张的公钥被替换了,不是小红的,那怎么保证小张拥有的公钥确实是小红的呢?小红跑到证书机构(CA)给自己的公钥做认证,证书机构也有一对公钥和私钥,证书机构用自己的私钥对小红的公钥及小红的个人信息等进行加密,得到一个数字证书。
9、小红再次给小张写信,签名、加密,并把签名和数字证书一起发给小张。
10、小张拿到数字证书,用CA的公钥解开证书,得到正确的小红的公钥,然后就可以解密信的内容和验证签名。
再看一个HTTPS的例子,过程大致如下:
1、客户端请求服务端,告诉服务端自己支持的加密方法
2、服务端发送证书链给客户端
3、客户端验证证书链的有效性,比如证书是否过期,证书的域名是否是当前请求的域名等
4、证书验证有效后开始协商对称密钥,客户端用非对称加密方法如RSA加密协商好的对称密钥,然后发送给服务端
5、之后开始用对称密钥通信
注意,因为非对称算法相对复杂,计算耗时,所以非对称加密只用来加密协商好的对称密钥,保证这个对称密钥在传输过程中不被泄露。
数字证书
数字证书的作用,是保证你可以获取到正确的公钥。有了正确的公钥,才能保证信息的正确性、安全性、完整性。
数字证书需要去证书机构(CA)申请,证书机构也有一对公钥和私钥,证书机构用自己的私钥对你的信息(比如SSL证书中包含了证书版本、序列号、使用的算法、颁发机构、域名、证书过期时间、域名所有者等等)加密,得到一个属于你的数字证书。
CA下面还可以有二级甚至三级、四级等CA机构,每一级CA自己的证书从上一级申请,这样一级一级相互保证,形成一个证书链,最顶级的证书叫根证书,根证书由根证书颁发机构自己给自己颁发,叫自签证书。根CA有最高的权威性,这些CA的公钥可以在网上查到,因此无法伪造。操作系统以及一些浏览器通常内置了一些根证书颁发机构颁发的证书。
SSL证书的验证
浏览器在收到服务器发送过来的证书链后,调用证书验证函数去验证,只要根证书是有效的,则整个证书链都没有问题,否则浏览器会给出证书有问题之类的警告。
这是谷歌浏览器的证书:
点浏览器地址栏域名左边的锁图标,可以查看当前网站的证书,比如CSDN的证书:
数字证书格式
证书文件的结构也是有标准的,比如文件里包含什么信息,用什么编码,第一行记录什么,第二行记录什么等等,详情看这里。
x.509
基本的证书格式,只包含公钥。
x509证书由用户公共密钥和用户标识符组成。此外还包括版本号、证书序列号、CA标识符、签名算法标识、签发者名称、证书有效期等信息。
PKCS#7
Public Key Cryptography Standards #7。
PKCS#7一般把证书分成两个文件,一个公钥、一个私钥,有PEM和DER两种编码方式。PEM比较多见,是纯文本的,一般用于分发公钥,看到的是一串可见的字符串,通常以.crt,.cer,.key为文件后缀。DER是二进制编码。
PKCS#7一般主要用来做数字信封。