加密与安全

加密与安全

Bob给Alice发送一封邮件,在这过程中黑客可能会窃取信件内容、篡改信件、甚至黑客可能会伪造一封来自Bob的邮件。

因此,在信息交互的过程中,需要防止以上三种情况出现,即:

  • 防窃听
  • 防篡改
  • 防伪造

计算机加密技术主要就是为了实现这几个目标,现代计算机密码学是建立在严格的数学理论基础上的。
而好的加密算法也是不断迭代修补i漏洞才逐渐完善的,因此自己设计一个安全加密算法是不可靠的,而验证一个加密算法是安全需要用不断证伪的过程,目前认为安全的加密算法仅仅是目前尚未攻破而以。

与加密(广义)相关的常见算法有以下几种:

1. 编码

1.1 ASCII

如计算机最基本的编码:ASCII就是一种编码(可以看成一个字节的utf-8,最高为0)

字符 ASCII编码
A ox41
B ox42

标准ASCII因为是单字节(1byte=8bit)编码,同时,最高位b7作为奇偶校验位,因此最多只能编码2^7=128个字符(包括部分功能字符,如换行、回车)。

1.2 utf-8

为了编码中字符及更多的字符集(比如Unicode),则需要使用更多的位数来编码,如utf-8,作为一种unicode实现,因为其兼容ASCII码,因此成为广泛使用的实际标准,它是一种可变编码使用1-4个字节编码。

这种变长编码方式的优点是节省空间,坏处是不能根据字符个数直接计算出字节数。

1.3 url编码

需要url编码的主要原因是出于兼容性考虑。很多底层中间服务只识别ASCII字符,因此url中包含的非ASCII编码就需要被url编码.
url编码的主要规则是

  • 如果字符是a-z,A-Z,0-9-,_,.,*则保持不变.
  • 如果是其他字符则先转成utf-8编码,然后在每个字节前加上%,例如一的utf-8编码是0xe4b880,因此它的Url编码是%E4%B8%80.Url编码总是大写.
1.4 base64

url编码是用来对字符编码,而base64则是对二进制编码,使之可以用文本表示。

base64可以把任意长度二进制编码成纯文本,且只包含a-z,A-Z,0-9,+,/,=这些字符.

base64的编码规则是:

  • 把3字节的二进制数据按照6bit一组,用4个int整数表示,然后查表,把int整数用索引对应到字符,然后得到编码后的字符串.
  • 如果byte[]输入的长度不是3的整数倍则在输入末尾补一个或两个0x00,编码结束后,在结尾加一个或者两个=表示补充了一个0x00或者补充了两个0x00.

实际上,因为编码后的长度加上=总是4个倍数,所以不加也能计算出原始输入的byte[].所以在java中可以使用.withoutpadding来去掉=.

标准的base64中含有+,/,=这几个字符,不利于在url中传播,因此有一种针对url的base64编码(java中Base64.getUrlEncoder().encodeToString(s)).
它仅仅是把+变成-/变成_.

Base64编码的缺点是传输效率会降低,因为它把原始数据的长度增加了1/3.

你可能感兴趣的:(加密与安全)