MD5

MD5是一个非常常见的摘要(hash)逻辑。特点就是小巧. 速度快. 难被破解,不可逆。(相同的内容计算出来的摘要应该是一样的)

  • python实现
1
2
3
4
5
6
7
from hashlib import md5

obj = md5()
obj.update("zhangsan".encode("utf-8"))

bs = obj.hexdigest()
print(bs)

把密文丢到网页里,发现有些网站可以直接解密。这里并不是直接解密MD5. 而是”撞库”。网站数据库里存储了大量的MD5的值,需要进行查询的时候. 只需要一条select语句就可以查询到了。

如何避免撞库

md5在进行计算的时候可以加盐

1
2
3
4
5
6
7
8
from hashlib import md5

salt = "我是盐.把我加进去就没人能破解了"
obj = md5(salt.encode("utf-8")) # 加盐
obj.update("zhangsan".encode("utf-8"))

bs = obj.hexdigest()
print(bs)
  • 扩展

除了md5,还有sha1, sha256,都属于摘要算法。 都是在计算hash值。只是散列的程度不同而已。 这种算法有一个特性. 他们是散列. 不是加密. 而且, 由于hash算法是不可逆的, 所以不存在解密的逻辑.

1
2
3
4
from hashlib import sha1, sha256
sha = sha256(b'salt')
sha.update(b'zhangsan')
print(sha.hexdigest())

base64编码

base64 编码的优点

  • 算法是编码,不是压缩,编码后只会增加字节数,算法可逆,解码很=方便,加密后的字符串只有【0-9a-zA-Z+/=】,便于在网络中传输。

原理

Base64编码,是由64个字符组成编码集:26个大写字母AZ,26个小写字母az,10个数字0~9,符号“+”与符号“/”。Base64编码的基本思路是将原始数据的三个字节拆分转化为四个字节,然后根据Base64的对应表。当原始数据凑不够三个字节时,编码结果中会使用额外的符号“=”来表示这种情况。

一个Base64字符实际上代表着6个二进制位(bit),4个Base64字符对应3字节字符串/二进制数据。

  • 3个字符为一组的的base64编码方式如:
  • 小于3个字符为一组的编码方式如:
  • 示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import base64

bs = "you".encode("utf-8")
# 把字节转化成b64
print(base64.b64encode(bs).decode())

bs = "yo".encode("utf-8")
# 把字节转化成b64
print(base64.b64encode(bs).decode())

# 猜测结果
bs = "y".encode("utf-8")
# 把字节转化成b64
print(base64.b64encode(bs).decode())

base64长度要求. 字符串长度必须是4的倍数

1
2
3
4
5
6
7
8
s = "qwe2a"
# ret = base64.b64decode(s)
# print(ret)

s += ("=" * (4 - len(s) % 4))
print("填充后", s)
ret = base64.b64decode(s).decode()
print(ret)