加密与安全
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.
网友评论