数据不经过处理在网络上传输是特别不安全的,所以在传递前需要加密后再进行传递,再在接收的时候进行解密得到数据,这样就可以保证数据在传输中的安全了
1.MD5
算法原理:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
单向性:MD5加密后的数据无法还原(有一些网站自建数据库保存了MD5原数据和加密后的数据,有些还是可以被解密出来的(彩虹表))
MD5不可逆的原因是其是一种散列函数,使用的是hash算法,在计算过程中原文的部分信息是丢失了的。
输入任意长度的信息,经过处理,输出为128位的信息(数字指纹);
不同的输入得到不同的输出结果(唯一性)
应用场景:
1.防止被篡改
2.安全访问认证
3.数字证书(生成摘要信息生成记录)
2.base64
Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码具有不可读性,需要解码后才能阅读。
简单来说:就是讲ASCII码的8位二进制转换为base64的6位二进制,然后在每个6位二进制数据高位补两个0,再编码成字符串
3个ASCII码字符转成4个base64码字符,如果不够,用0补齐
例子:如果我们需要在网络上传递一个字符串,首先将字符串转换成二进制数据,对二进制数据整除8,不能整除在后面补零,让后再以分好的8位二进制数据整除3.不能整除的用00000000补全
在将补全号之后的8位二进制值数据整除6,在高位补两个0,在进行编码成base64码的数据
在网络上传输的时候,还可以在编码后的base64位数据进行加盐操作(如迅雷链接在前后加了AA和ZZ)
3.sha1
安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准 (Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。在传输的过程中,数据很可能会发生变化,那么这时候就会产生不同的消息摘要。 SHA1有如下特性:不可以从消息摘要中复原信息;两个不同的消息不会产生同样的消息摘要,(但会有1x10 ^ 48分之一的机率出现相同的消息摘要,一般使用时忽略)。
算法原理:
在SHA1算法中,我们必须把原始消息(字符串,文件等)转换成位字符串。SHA1算法只接受位作为输入。
1.补位
消息必须进行补位,以使其长度在对512取模以后的余数是448。也就是说,(补位后的消息长度)%512 = 448。即使长度已经
满足对512取模后余数是448,补位也必须要进行,补位是这样进行的:先补一个1,然后再补0,直到长度满足对512取模后余数
是448。总而言之,补位是至少补一位,最多补512位。
2.补长度
所谓的补长度是将原始数据的长度补到已经进行了补位操作的消息后面。通常用一个64位的数据来表示原始消息的长度。如果消
息长度不大于2^64,那么第一个字就是0。
3.引入使用的常量和函数
使用的常量
一系列的常量字K(0), K(1), ... , K(79),如果以16进制给出。它们如下:
Kt = 0x5A827999 (0 <= t <= 19)
Kt = 0x6ED9EBA1 (20 <= t <= 39)
Kt = 0x8F1BBCDC (40 <= t <= 59)
Kt = 0xCA62C1D6 (60 <= t <= 79).
在SHA1中我们需要一系列的函数。每个函数ft (0 <= t <= 79)都操作32位字B,C,D并且产生32位字作为输出。ft(B,C,D)可以如下定义
ft(B,C,D) = (B AND C) or ((NOT B) AND D) ( 0 <= t <= 19)
ft(B,C,D) = B XOR C XOR D (20 <= t <= 39)
ft(B,C,D) = (B AND C) or (B AND D) or (C AND D) (40 <= t <= 59)
ft(B,C,D) = B XOR C XOR D (60 <= t <= 79).
4.计算信息摘要
1>设置缓冲区
必须使用进行了补位和补长度后的消息来计算消息摘要。计算需要两个缓冲区,每个都由5个32位的字组成,还需要一个80个32位字的缓冲区。第一个5个字的缓冲区被标识为A,B,C,D,E。第二个5个字的缓冲区被标识为H0, H1, H2, H3, H4。80个字的缓冲区被标识为W0, W1,..., W79,另外还需要一个一个字的TEMP缓冲区。
2>产生消息摘要
之前补位补长度完成的512位(16字)的数据块依次进行处理,处理每个数据块要80个步骤
3>初始化缓冲区
在处理所有数据块之前,缓冲区{Hi} 被初始化为下面的值(16进制)
H0 = 0x67452301
H1 = 0xEFCDAB89
H2 = 0x98BADCFE
H3 = 0x10325476
H4 = 0xC3D2E1F0.
4>开始处理数据块
(1). 将 Mi 分成 16 个字 W0, W1, ... , W15, W0 是最左边的字
(2). 对于 t = 16 到 79 令
W[t] = S1(W[t-3] XOR W[t-8] XOR W[t-14] XOR W[t-16]).
(3). 令 A = H0, B = H1, C = H2, D = H3, E = H4.
(4) 对于 t = 0 到 79,执行下面的循环
TEMP = S5(A) + ft(B,C,D) + E + Wt + Kt;
E = D; D = C; C = S30(B); B = A; A = TEMP;
(5). 令 H0 = H0 + A, H1 = H1 + B, H2 = H2 + C, H3 = H3 + D, H4 = H4 + E.
在处理完所有的 Mn, 后,消息摘要是一个160位的字符串,以下面的顺序标识H0 H1 H2 H3 H4.
4.sha256
哈希值用作表示大量数据的固定大小的唯一值。数据的少量更改会在哈希值中产生不可预知的大量更改。
SHA256 算法的哈希值大小为 256 位。(有点纳闷为什么sha1不叫sha512,哈哈哈)
5.JWT(Django)
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
JWT的构成:
header (头部)+ playload(载荷) + signature(签证)
header:类型加算法
{
'typ': 'JWT',
'alg': 'HS256'
}
对头部进行base64加密,该加密是可以对称解密的
playload:载荷
一大堆有的没的声明(标准中注册,公有的,私有的)
载荷是可拓展的,用户可以加中间增加需要返回的数据,但是这是不安全的,不建议存放敏感信息
{
"sub": "1234567890",
"name": "Spencer",
"admin": true
}
signature:签证
signature = header + payload + secret(加盐操作)
优点:
- 因为json的通用性,所以JWT是可以进行跨语言支持的,像JAVA,JavaScript,NodeJS,PHP等很多语言都可以使用。
- 因为有了payload部分,所以JWT可以在自身存储一些其他业务逻辑所必要的非敏感信息。
- 便于传输,jwt的构成非常简单,字节占用很小,所以它是非常便于传输的。
- 它不需要在服务端保存会话信息, 所以它易于应用的扩展
安全相关:
- 不应该在jwt的payload部分存放敏感信息,因为该部分是客户端可解密的部分。
- 保护好secret私钥,该私钥非常重要。
- 如果可以,请使用https协议
6.itsdangerous(Django自带)
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer,BadData
token = serializer.dumps({'user_id': self.id, 'email': self.email})
带入Django中自带的模块序列器,用dumps方法将需要传输的数据传参进去就能生成加密后的token值
解密用loads方法