一、密码(clpher)
- 是一种用于加密或者解密的算法
密码学中的密码(cipher)和我们日常生活中所说的密码不太一样,计算机术语『密码 cipher』是一种用于加密或者解密的算法,而我们日常所使用的『密码 password』是一种口令,它是用于认证用途的一组文本字符串,这里我们要讨论的是前者:cipher。
二、密钥(key)
- 密钥是一种参数,它是在使用密码(cipher)算法过程中输入的参数。
- 密文 = 密码(密钥,明文) 或者 密文 = 加密函数(密钥,明文)
- 密钥是决定密文是否安全的重要参数,通常密钥越长,破解的难度越大,越安全。
- 密钥分为对称密钥与非对称密钥。
密钥是一种参数,它是在使用密码(cipher)算法过程中输入的参数。同一个明文在相同的密码算法和不同的密钥计算下会产生不同的密文。很多知名的密码算法都是公开的,密钥才是决定密文是否安全的重要参数,通常密钥越长,破解的难度越大,比如一个8位的密钥最多有256种情况,使用穷举法,能非常轻易的破解,知名的DES算法使用56位的密钥,目前已经不是一种安全的加密算法了,主要还是因为56位的密钥太短,在数小时内就可以被破解。密钥分为对称密钥与非对称密钥。
三、明文/密文
- 明文(plaintext):加密之前的原始数据。
- 密文(ciphertext):是通过密码运算后得到的结果。
四、对称密钥(Symmetric-key algorithm)
- 又称为共享密钥加密。(通讯的两端共享)
- 对称是指:加密和解密的过程中使用的密钥相同。
- 需要在通讯的两端共享,让彼此知道密钥是什么对方才能正确解密。
- 计算速度快,但是不安全。 密文 = 密码(密钥,明文) ,知道了密文,密钥和密码,就可推出明文数据
- 如果每个客户端与服务端单独维护一个密钥,那么服务端需要管理的密钥将是成千上万,这会给服务端带来噩梦
- 常见的对称加密算法:DES、3DES、AES、RC5、RC6
- 采用更复杂的密钥管理和交换协议,如公钥基础设施(PKI)和密钥分发中心(KDC),来提高系统的安全性。
五、非对称密钥(public-key cryptography)
- 又称为公开密钥加密
- 服务端生成一对密钥,私钥与公钥
- 私钥保存在服务端,公钥发布出去,供任何人使用
- 加密:密文 = 密码(明文,公钥)==解密==> 明文 = 密码(密文,私钥)
- 公钥加密,私钥解密
- 客户端:公钥加密明文得到密文传输给服务端
- 服务端:私钥解密密文得到明文
六、数字签名
- 验证传输的数据是不是真实数据
- 防止传输的数据被篡改或者被调包
- 是非对称加密的一种应用场景,不过是反过来的,用私钥来加密,通过与之配对的公钥来解密。
过程梳理:
第一阶段:创建并发送签名
-
生成摘要:服务器先使用SHA-256哈希算法对原始报文进行处理,产生一个唯一的摘要信息(Digest)。这一步确保了任何对报文的微小改动都会导致摘要不同。
-
签名生成:接着,服务器利用自己的私钥对生成的摘要信息(Digest)进行加密,形成数字签名。这一操作基于非对称加密技术,确保了只有对应的公钥能够验证签名,从而证明报文来源的可靠性和完整性。
-
发送信息:服务器将原始报文和这个数字签名一起发送给客户端。注意,这里原始报文并未加密,而是明文发送,因为真正的安全在于签名的验证过程。
-
摘要=hash(报文)
数字签名 = 密码(摘要,私钥)
数字签名 = 密码(hash(报文),私钥)
-
第二阶段:验证签名与身份
-
接收数据:客户端收到服务器发送的原始报文及签名。
-
签名验证:客户端使用服务器提供的公钥尝试解密接收到的数字签名。如果解密成功,说明签名确实是用对应的私钥生成的,从而验证了发送者的身份。同时,解密结果得到摘要信息(Digest1)。
-
摘要 = 密码(数字签名,公钥)
-
第三阶段:验证报文完整性
-
计算本地摘要:客户端对收到的原始报文同样应用SHA-256哈希算法,计算出一个新的摘要信息(Digest2)。
-
比对摘要:最后,客户端比较从签名解密得到的摘要(Digest1)与自己计算出的摘要(Digest2)。如果两者完全相同,这表明报文在传输过程中未被篡改,内容完整可信。反之,如果摘要不匹配,则报文可能已被修改。
-
摘要 = hash(报文)
-
七、数字证书(Certificate Authority)
权威机构给某网站颁发的认可凭证,确定服务器是真实的。
问题
举例子:
A厂家给你们家安装锁,同时把钥匙也交给你,只要钥匙能打开锁,你就可以确定钥匙和锁是配对的,如果有人把钥匙换了或者把锁换了,你是打不开门的,你就知道肯定被窃取了,但是如果有人把锁和钥匙替换成另一套表面看起来差不多的,但质量差很多的,虽然钥匙和锁配套,但是你却不能确定这是否真的是A厂家给你的,那么这时候,你可以找质检部门来检验一下,这套锁是不是真的来自于A厂家,质检部门是权威机构,他说的话是可以被公众认可的。
同样的, 因为如果有人(张三)用自己的公钥把真实服务器发送给浏览器的公钥替换了,于是张三用自己的私钥执行相同的步骤对文本Hash、数字签名,最后得到的结果都没什么问题,但事实上浏览器看到的东西却不是真实服务器给的,而是被张三从里到外(公钥到私钥)换了一通
解决
如何保证你现在使用的公钥就是真实服务器发给你的呢?
我们就用数字证书来解决这个问题。数字证书一般由数字证书认证机构(Certificate Authority)颁发,证书里面包含了真实服务器的公钥和网站的一些其他信息,数字证书机构用自己的私钥加密后发给浏览器,浏览器使用数字证书机构的公钥解密后得到真实服务器的公钥。这个过程是建立在被大家所认可的证书机构之上得到的公钥,所以这是一种安全的方式。
机构私钥:GS 机构公钥:GG
服务器公钥:FG
实际上就是,在服务器分发公钥FG给浏览器的时候,经过了一层机构的包装,由机构用它自己的私钥GS加密这个服务器给的公钥FG信息,并会将对应的公钥GG给到浏览器,浏览器通过这个公钥GG解密得到公钥FG。
八、数字签名为什么要用私钥加密公钥解密?
数字签名使用私钥加密而公钥解密的机制,其核心目的在于确保信息的完整性和来源的不可抵赖性
-
验证发送方身份:私钥只有签名者本人持有,且应保持秘密。使用私钥进行签名意味着任何人都可以使用与之对应的公钥来验证签名,但不能伪造签名。这证明了信息确实出自持有对应私钥的发送方,从而确认了发送者的身份。
-
保证数据完整性:数字签名通常包括对原始消息的哈希值进行加密,而不是直接加密消息本身。这样,接收方在用公钥验证签名时,会重新计算消息的哈希并与解密后的签名比较。如果两者一致,说明消息在传输过程中未被篡改。
-
不可抵赖性:由于私钥的私密性,一旦消息被私钥签名,发送方就不能否认他们曾经发送过该消息,因为除了他们自己,没有人能生成有效的签名。这提供了法律上的可接受证据,即发送方认可了消息内容。