加密与安全入门笔记(施工中)

基本的加密和编码算法学习

编码算法

URL编码

参考自https://zhuanlan.zhihu.com/p/22169525

Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符。

Url编码的原则就是使用安全的字符(没有特殊用途或者特殊意义的可打印字符)去表示那些不安全的字符。

& = 非Ascii 需要用url编码 %x 表示编码的序号

对于utf-8的编码,我们用% + utf-8 码来表示这个数字

下面参考StackOverFlow来进行 URL 编码。

import urllib
f = {'name': '老司机天下第一', 'pwd': 'LYH number one!'}
aft_encoding = urllib.parse.urlencode(f)
print(aft_encoding)
# name=%E8%80%81%E5%8F%B8%E6%9C%BA%E5%A4%A9%E4%B8%8B%E7%AC%AC%E4%B8%80&pwd=LYH+number+one%21

可以参考下 Python 的urllib模块,提供了很多基础的东西。

也可以戳这里,利用了urllib.parse.quote有比较详细的 url 编码的解释和使用.

Base64 编码

本来想看着wiki抄一抄的,不过看到阮一峰前辈博客的帖子质量很棒,这里先挂着

Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据。包括MIME的email、在XML中存储复杂数据。

就是说选出64个字符—-小写字母a-z、大写字母A-Z、数字0-9、符号”+”、”/“(再加上作为垫字的”=”,实际上是65个字符)—-作为一个基本字符集。

这里按byte为单位进行加密。3个byte分为一组,每组再分为四部分加密,不足的按组补0.

Base64编码解码都比较方便。

这里选取 Python 官方文档就有Base64,此外页面上也能提供这些功能,请看MDN

这里 Python 标准库直接提供了

import base64
encoded1 = base64.b64encode(b'asdhqkjew1')
print(encoded1)
# encode need file like object
# encoded2 = base64.encode()
decode1 = base64.b64decode(encoded1)
print(decode1)

摘要(Digest)算法

Digest — 摘要)

实际上采用散列函数的方法,简书这有个介绍

防止数据被篡改 防止被看到明文 做数字签名

MD5

Python可以利用 hashlib.md5() obj.hexdigest()完成加密解密

import hashlib
md5_var = hashlib.md5("老司机天下第一".encode('utf-8'))
print(md5_var)
print(md5_var.hexdigest())

SHA-1

和md5区别:https://crypto.stackexchange.com/questions/18612/how-is-sha1-different-from-md5

sha对运算要求更高

HMac(Hash-based message authentication code)

为保证安全 HMac需要散列函数的同时需要secret-key

可以看下知乎的回答

Python有HMac包 可以用其加密。

加密(Encryption)算法

HTTPS等都需要用到加密

非对称加密(公开密钥加密(asymmetric cryptography))

公开密钥加密 私有密钥解密

加密使用的密钥和解密使用的密钥是不相同的,分别称为:公钥、私钥,公钥和算法都是公开的,私钥是保密的。非对称加密算法性能较低,但是安全性超强,由于其加密特性,非对称加密算法能加密的数据长度也是有限的。

例如:RSA、DSA、ECDSA、 DH、ECDHE

对称加密

有流式、分组两种,加密和解密都是使用的同一个密钥。

例如:DES、AES-GCM、ChaCha20-Poly1305等

签名算法

关于数字签名是什么,可以戳阮一峰

数字签名算法有RSA DSA这些。