【开发经验】几种常见的加密方式

文章目录

  • 一、加密类型
    • 1、对称加密
      • 1.1序列密码
      • 1.2 分组密码
    • 2、非对称加密
    • 3、散列函数
      • 3.1、使用场景
    • 4、数字签名


一、加密类型

1、对称加密

       对称加密又可以成为私钥加密,即通讯双方各个持有一个秘钥,发送方通过私钥加密,接收方通过私钥解密。
【开发经验】几种常见的加密方式_第1张图片
       一个优秀的加密算法需要产出随机的密文,这个攻击者就没办法分析出明文的信息。替换密码就不是一种好的加密算法,因为攻击者可以通过一些字符的出现频率尝试所有可能的解码秘钥来恢复明文,这种方式称为穷举秘钥搜索。
对称加密可以分为两类,序列密码分组密码

1.1序列密码

       从概念上讲,序列密码(stream cipher)的操作过程与我们想象中加密的过程一致。将1字节的明文输入加密算法,就得到1字节的密文输出。在对端则进行相反的过程。整个过程持续重复,直到所有数据处理完成。因为这种思路比较简单,序列密码绝不能第二次使用相同的密钥。这是因为在实际使用中,攻击者知道或者可以预测特定区域的明文(请思考加密HTTP请求的情景;许多请求的请求方法、协议版本、请求头名称都是一样的)当你知道明文,又观察到密文时,就可以解析一部分密钥序列。如果使用了相同的密钥,那么就可以解密后续的部分密文。为了解这个问题,序列密码都与从长期密钥中提取出来的一次性密钥一同使用。
【开发经验】几种常见的加密方式_第2张图片

       RC4是最为人熟知的序列密码。因为它很快很简单,所以一度非常流行。但是它已经不再安全,因为发现大量的密钥都存在一个弱点,就是密钥中的一小部分可以决定初始化输出的大部分内容。这意味着如果密钥的一部分被使用了一段时间,攻击者就可以破解密钥流的一部分(例如利用某些位置上的已知明文)。因此,在不了解序列密码特性的情况下,尽量避免使用这种加密方式。
       尽管序列密码有这种弊端,但是还是有适合他的场景。直到现在,还可以在TLS加密方式中发现这种加密方式的身影。因为每个连接都会使用新的密钥(详解可以了解下https的原理)。

1.2 分组密码

       分组密码(block cipher)每次加密一整块数据,并且现代的分组密码倾向于使用128位(16字节)大小的块。一种分组密码就是一个变换函数:接受输入并生成看似杂乱无章的输出。只要使用相同的密钥,每一个可能的输入组合都有唯一的输出。
       我们可以理解为更高级的对称加密算法。这种加密算法也是非常常见,例如AES加密,有128位、192位和256位的加密强度。在现在的系统对接时,AES加密非常常见。

2、非对称加密

       对称加密适用于两个系统或者少数系统之间的信息通讯。但是在不适合多系统之间的通讯。如果使用对称加密,一旦有系统被攻陷,或者秘钥处理不当,导致秘钥泄露,那么所有系统间的信息将不再安全。
       因此,通过非对称加密对此问题进行解决。非对称加密也称公钥加密,即生成一对秘钥,公钥私钥。私钥为私有秘钥,自己保存,公钥是公开的。这种加密方式有个特点:通过私钥加密的信息可以通过公钥解密,通过公钥加密的信息可以通过私钥解密。这种加密的方式很常见,git拉取代码的时候就有这种场景。常见的非对称加密算法有RSA算法。
       知道了对称加密和非对称加密的作用之后,这样https加密的最初的思想也就有了。

  • 服务器生成一对公私钥。私钥据为己有,公钥下发给各个浏览器。
  • 在公钥能安全到达的时候(保证公钥安全的到达浏览器设计到证书的概念,暂且认为可以安全到达),这个时候浏览器提交给服务器的数据,只有服务器可以解析。
  • 浏览器生成对称加密是私钥通过非对称加密的公钥进行加密提交给服务器。浏览器通过公钥进行加密,所以,只有服务器的私钥能够解析。
  • 服务器收到浏览器的私钥,之后通过对称加密进行通讯。
    https相当复杂,这个只是http最简单的思想,有兴趣的可以自己查阅,肯定有所收获的。
    【开发经验】几种常见的加密方式_第3张图片

3、散列函数

散列函数在密码学中也是不可缺少的一部分。散列函数(hash function)是将任意长度的输入转化为定长输出的算法。谈到散列函数,肯定会想到MD5加密,这种就是一种最为常见的散列函数。散列函数的特点:

  • . 抗原像性单向性)给定一个散列,计算上无法找到或者构造出生成它的消息。即不能还原,MD5即是一种单项加密,因此,经常用于密码加密,实现即使管理员也无法知道用户的密码的功能。
  • 抗第二原像性弱抗碰撞性)给定一条消息和它的散列,计算上无法找到一条不同的消息具有相同的散列。
  • 强抗碰撞性 计算上无法找到两条散列相同的消息。

3.1、使用场景

  • 系统文件秒传功能的实现。可通过散列函数来快速的比较两个文件是否相等。
  • 密码加密,往往系统只需要知道用户登录的密码和系统保存的密码相等即可,无需知道用户的密码到底是什么。
  • 数据完整性验证,网上下载一些文件,可能会因为种种原因导致文件下载不完整,所以,经常会遇到较大的文件下载的时候,下载按钮一边会有一长串字符。下载成功,通过对应的方式计算出散列函数即可验证数据是否与服务器一致。如下:
    • 【开发经验】几种常见的加密方式_第4张图片

4、数字签名

数字签名?好熟悉的感觉,在微信支付就有签名这一个概念。在通过散列函数来验证消息完整性的时候,仅仅在信息和数据的散列分开传输的时候才可以,否则中间人可以修改数据的同时修改散列,从而避开检测。
【开发经验】几种常见的加密方式_第5张图片
数字签名主要是验证数据的真伪。微信通过对称加密生成的签名,支付宝通过非对称加密生成签名。效果差别不大。只要足够证明自己的身份即可。

读到这里了,如果对你有帮助就留个赞吧。

另外关注公众号java内功心法回复我要当架构即可领取java方向必备进阶资料。
【开发经验】几种常见的加密方式_第6张图片

你可能感兴趣的:(java开发,加密,对称加密,非对称加密)