程序员社区

密码算法 & Https


title: 密码算法 & Https
date: 2021/03/03 14:12


密码算法

本质:对原来为明⽂文的⽂文件或数据按某种算法进⾏行行处理理,使其成为不不可读的⼀一段代码

对称加密

对称加密指加密和解密使⽤用相同密钥的加密算法,也称为单密钥加密。他的特点是算法公开、计算量量少、 加密速度快,对于同样⼤小的传输对象,对称加密效率通常为非对称加密的千倍左右,因此通常被⼴泛应用于很多加密协议的核⼼工作(如https在真正数据通信时就使⽤用的对称加密算法)。对称加密算法的缺点是加解密使⽤用同⼀把密钥,一旦⼀方密钥泄露,传输的数据就存在安全风险。此外,与多方的通信需要使用不同的密钥,通信双方需要管理大量的密钥

常⻅的对称加密算法有:DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK等

非对称加密

非对称加密使用一对公钥和私钥来加密通信数据,也称为双密钥加密。公钥和私钥是成对出现的,通信数据使用公钥加密后,只能通过对应私钥来解密,同样使用私钥加密后也只能通过公钥来解密查看。公钥是对外公开的,外界通信方可以很容易获取到,而私钥是不公开的,只存在于己方。服务器使用私钥加密数据往外传输时,可以被持有公钥的客户端(可能也包括黑客)解密查看,但客户端使用公钥加密数据传输给服务端时,数据是严格安全的,只有服务器使用私钥才能解密查看。因此非对称密钥数据通信是单向安全的**,客户端使用服务端的公钥加密数据传向服务端是严格加密安全的。

非对称加密的用途:

  • a) 单向传输加密数据,防止中间人攻击。使用公钥加密数据并传输给接受者,可以确保只有接受者才能获得明文信息,一般用于交换对称密钥
  • b) 身份验证和数据校验。发送方使用私钥加密明文数据的 hash 值,并将明文、加密后的数据和公钥一起发送给接收方,接收方只需要通过公钥解密密文,然后与相同hash算法获取明文的hash值进行比较,一致则说明明文数据没有被篡改,一般用于数字签名。

常见的非对称加密算法有:RSA、DSA、Diffie-Hellman、ECC等。

摘要算法(单向 Hash 算法)

摘要算法也称为哈希算法、散列算法,可以将任意长度的数据转换成一个定长的、不可逆的数字。只要原文本不同,计算的结果必然不同(几乎不用考虑重复的情况)。 摘要算法用于对比信息源是否一致,因为只要数据源发生变化,得到的摘要信息必然不同,通常用于签名校验

消息摘要算法的特点:

  • a) 无论输入的消息有多长,计算出来的消息摘要的长度总是固定的
  • b) 消息摘要不是真正的随机,因为用相同的算法对相同的消息求两次摘要,其结果必然相同
  • c) 消息摘要函数是无陷门的单向函数,即只能进行正向的信息摘要,而无法从摘要中恢复出任何的消息,甚至根本就找不到任何与原信息相关的信息

常见的摘要算法有:MD5(Message-Digest Algorithm 信息摘要算法)、SHA-1(Secure Hash Algorithm 1 安全散列列算法1)、MAC、CRC、MurmurHash、*bcrypt等;广泛应用于校验数据的完整性敏感信息的传输和保存

摘要算法(hash)不能用于存储密码,因为哈希函数并不是专门用来设计存储用户密码的,所以它的计算可能相对来说还是比较快,攻击者今天可以通过 GPU 每秒执行上亿次的计算来破解用户的密码,所以不能使用这种方式存储用户的密码。

密码算法 & Https插图

md5 可以加盐还会碰撞吗?

盐和碰不碰撞没有关系,碰撞还是取决于算法本身,加盐只是增加了破解的难度,加盐 MD5 的在 GPU 比较牛逼的情况下,通过哈希碰撞容易破解。

JDK 中 hash 算法

hash 函数有很多实现方式,md5、sha-1、MurmurHash 等都是他的实现,而在 jdk 中

TODO

加密 hash 与非加密 hash

根据维基百科对加密哈希函数(Cryptographic hash function)的定义,需要满足这几个特性:

  1. it is easy to compute the hash value for any given message(对任意的消息很容易计算出哈希值)
  2. it is infeasible to generate a message that has a given hash(根据给定的哈希不可能反推出消息内容)
  3. it is infeasible to modify a message without changing the hash(消息发生了变化,哈希也一定要改变)
  4. it is infeasible to find two different messages with the same hash.(不同的两个消息不可能产生相同的哈希)

前两条是所有哈希函数都满足的,后两条不是都满足,满足后两条才能用来用作加密函数非加密哈希函数是用来生成摘要值的,理论上有一定可能性两个消息产生相同的哈希值,因为消息是非定长的,所以消息的可能性是无穷的,而哈希是固定长度的所以哈希的可能性是有限的,一共就那么多种。

其中 MD5、SHA-1、SHA-256 属于加密 hash,MurmurHash 属于非加密 hash。

MurmurHash 算法最初由 Austin Appleby 于 2008 年发明, 这种算法的优点在于, 即使输入的键是有规律的, 算法仍能给出一个很好的随机分布性, 并且算法的计算速度也非常快。该算法被 redis 用于计算字典类型的 hash 值。

应用

数字签名

数字签名是非对称加密算法和摘要算法的一种应用,能够保证信息在传输过程中不被篡改,也能保证数据不能被伪造。使用时,发送方使用摘要算法获得发布内容的摘要,然后使用私钥对摘要进行加密(加密后的数据就是数字签名),然后将发布内容、数字签名和公钥一起发送给接收方即可。接收方接收到内容后,首选取出公钥解密数字签名,获得正文的摘要数据,然后使用相同的摘要算法计算摘要数据,将计算的摘要与解密的摘要进行比较,若一致,则说明发布内容没有被篡改。

实际上,单一的数字签名应用,可能会存在安全风险。假设发送方为A,接收方为B,出现的一个不安全分子为M,原本A将发布内容、数字签名和A的公钥发送给B,结果半道被M截获了,M修改了发布内容,用自己的私钥生成了数字签名,然后将修改的发布内容、M的数字签名、M的公钥发送给了B,B接收时验证一样可通过,但实际上接收的已经是被篡改的数据。这就是所谓的中间人攻击,此时就需要数字证书来确定发送方的身份,在实际使用中,数字签名常常同数字证书一同出现。

密码算法 & Https插图1

写完信件签名是为了让收信人知道是谁发给我的,那么数字签名的意义也是这样,确定发送方是谁(因为私钥只有一个人有)。

但是如果出现了中间人攻击,他仿冒成了发件人,此时没有办法确定发件人的身份,所以此时就需要一个权威机构(CA)来颁发给发件人一个证书,当请求的时候,返回的是数字证书,我们再采用 CA 的公钥来解开数字签名,如果相同则可以确定发件人的身份。因为攻击者没有 CA 机构的私钥,所以他没法仿冒数字证书中的签名。

有人可能会问,为啥不直接将公钥通过 CA 机构私钥加密,然后发送给收件人呢,其实我也有这个问题,我想原因可能有二:

  1. 加密出来长度过大
  2. 我们不怕公钥被别人看到,只需要确定他是正确的(真的是发件人发来的)。

数字证书

数字证书是由权威的CA机构颁发的无法被伪造的证书,用于校验发送方实体身份的认证。解决如上问题,只需要发送方A找一家权威的CA机构申请颁发数字证书,证书内包含A的相关资料信息以及A的公钥,然后将正文A、数字证书以及A生成的数字签名发送给B,此时中间人M是无法篡改正文内容而转发给B的,因为M不可能拥有这家CA的私钥,无法随机制作数字证书。当然,如果M也申请了同一家CA的数字证书并替换发送修改后的正文、M的数字证书和M的数字签名,此时B接收到数据时,会校验数字证书M中的信息与当前通信方是否一致,发现数字证书中的个人信息为M并非A,说明证书存在替换风险,可以选择中断通信。

为什么CA制作的证书是无法被伪造的?

其实CA制作的数字证书内还包含CA对证书的数字签名,接收方可以使用CA公开的公钥解密数字签名,并使用相同的摘要算法验证当前数字证书是否合法。制作证书需要使用对应CA机构的私钥,因此CA颁发的证书是无法被非法伪造的(CA的私钥泄露不在考虑讨论与考虑范围内)。

数字证书签名的基础就是非对称加密算法和数字签名,其无法伪造的特性使得其应用面较广,HTTPS中就使用了数字证书来保证握手阶段服务端传输的公钥的可靠性。

密码算法 & Https插图2
密码算法 & Https插图3
密码算法 & Https插图4

HTTPS

HTTP 为啥不安全

密码算法 & Https插图5
密码算法 & Https插图6
密码算法 & Https插图7

同一个网站多个用户拿到的公钥是相同的。

下面两篇文章看懂 https

https://segmentfault.com/a/1190000024523772

https://zhuanlan.zhihu.com/p/43789231

  1. 为什么要用对称加密+非对称加密?

浏览器端使用公钥(证书中)加密【自己生成的密钥】,传输给服务器端,之后数据传输都使用【自己生成的密钥】加密。

这样既保证了数据的安全,速度又最快

  1. 为什么不能只用非对称加密?

非对称加密只保证单向的安全,如果用两个非对称那就太慢了

  1. 为什么需要数字证书?

需要有一种手段来确定公钥确实是服务器端发送来的。

  1. 为什么需要数字签名?

确定公钥是正确的。

SSL/TLS

其实上面两篇文章就是讲的 SSL。

传输层安全性协议(英语:Transport Layer Security,缩写:TLS)及其前身安全套接层(英语:Secure Sockets Layer,缩写:SSL)是一种安全协议,目的是为互联网通信提供安全及数据完整性保障。

https://www.ruanyifeng.com/blog/2014/02/ssl_tls.html


现在的 https 用的是什么算法,之前用的 md5,可能是 sha-256

密码算法 & Https插图8
赞(0) 打赏
未经允许不得转载:IDEA激活码 » 密码算法 & Https

一个分享Java & Python知识的社区