网络安全&密码学—python中的各种加密算法

一、简介

数据加密是一种保护数据安全的技术,通过将数据(明文)转换为不易被未经授权的人理解的形式(密文),以防止数据泄露、篡改或滥用。加密后的数据(密文)可以通过解密过程恢复成原始数据(明文)。数据加密的核心是密码学,它是研究密码系统或通信安全的一门学科,包括密码编码学和密码分析学。

二、常见的加密方式

1. 对称加密

  • 定义:加密和解密使用同一个密钥。
  • 特点:加密和解密速度快,适合加密大量数据。但密钥需要安全地传输和存储,否则容易被窃取,破坏数据的保密性。
  • 常见算法:DES(尽管已被认为不够安全)、3DES、AES(目前使用最广泛的对称加密算法之一,具有高安全性和加密效率)。

2. 非对称加密

  • 定义:加密和解密使用一对密钥,分别为公钥和私钥。公钥可以公开,私钥必须保密。
  • 特点:公钥可以公开,私钥只有持有者知道,即使公钥被泄露,数据也不会失去保密性。但加密和解密速度较慢,适合加密少量数据和数字签名等场景。
  • 常见算法:RSA(目前应用最广泛的非对称加密算法,安全性高,但速度较慢)、ECC(椭圆曲线加密算法,密钥长度较短,安全性高,加密解密速度快,适用于移动设备等资源有限的场景)、DSA(基于离散对数问题,适用于数字签名等场景)。

3. 单向加密(不可逆加密)

  • 定义:通过散列算法将明文生成散列值,散列值是长度固定的数据,与明文长度无关,且无法从散列值还原出原文。
  • 特点:常用于数字签名、消息认证、密码存储等场景,不需要密钥。
  • 常见算法:MD5(尽管已被破解,不再安全)、SHA-1(比MD5更安全,但速度较慢)、SHA-2(包括SHA-224、SHA-256等多个变种,安全性更高)、HMAC(带密钥的散列消息认证码,结合了散列算法和密钥的优势)。

三、python中的应用

通过采用合适的加密技术和加强密钥管理,可以有效地保护数据的机密性、完整性和可用性,防止数据泄露、非法访问和篡改等安全事件的发生。本文主要介绍python中的常见加密算法的实现,以及某云的案例进行分析。

1、encode()编码

encode():将字符串str转为二进制数据,即进行编码。

str_="xiaoyu安全"
byte=str_.encode('utf-8')
print('原字符:',str_)
print('字符转换成二进制:',byte)
原字符: xiaoyu安全
字符转换成二进制 b'xiaoyu\xe5\xae\x89\xe5\x85\xa8'

2、decode()解码

str_="xiaoyu安全"
byte=str_.encode('utf-8')
print('原字符:',str_)
print('字符转换成二进制:',byte)
print('二进制转化为原字符:',byte.decode('utf-8'))
原字符: xiaoyu安全
字符转换成二进制: b'xiaoyu\xe5\xae\x89\xe5\x85\xa8'
二进制转化为原字符: xiaoyu安全

3、base64

Base64编码是密码学的基础,它使用64个字符来表示任意二进制数据。

编码过程如下:首先将所有字符转换为ASCII码,然后将这些ASCII码转换为8位二进制数。接着,将每3个二进制数归为一组(不足3个的在后面补0),形成24位,再拆分成4组,每组6位。之后,在每组的6位二进制数前补两个0,凑成8位。最后,将这些补0后的二进制数转换为十进制数,并从Base64编码表中获取对应的Base64编码。整个过程确保所有数据都能被编码,并且编码后的文本只使用65个字符(A~Z, a~z, 0~9, +, /, =)表示。

python中的base64模块的使用

import base64

str_="xiaoyu安全"

# 加密实现
def enbase64(str_):
return base64.b64encode(str_.encode('utf-8')).decode("utf-8") # 解密实现
def debase64(str_):
# 注意:这里不需要再次将str_转换为utf-8,因为它已经是一个utf-8编码的字符串了
# 我们只需要将base64编码的部分解码回原始的bytes,然后再解码为utf-8字符串
return base64.b64decode(str_).decode('utf-8') if __name__ == '__main__':
str_='xiaoyu安全'
en=enbase64(str_)
print('base64加密后的结果:',en)
print('base64解密后:',debase64(en))
base64加密后的结果: eGlhb3l15a6J5YWo
base64解密后: xiaoyu安全

4、md5(单向加密)

MD5加密,即信息-摘要算法5(message-digest algorithm 5),能够将字符串、文件或压缩包等转换为固定长度为128bit的串。其主要用途包括:

  1. 加密注册用户的密码,保障用户信息安全;
  2. 网站用户上传图片或文件后,利用MD5值的唯一性作为文件名,便于管理和检索;
  3. 在key-value数据库中,使用MD5值作为key,提高数据存取效率;
  4. 比较两个文件是否相同,如下载资源时,网站提供的MD5值可用于检测文件完整性,确保文件未被篡改。

MD5模块在python3中被移除,在python3中使用hashlib模块进行md5加密操作。

import hashlib

def md5(str_):
str_=str_.encode('utf-8')# 将字符串进行字符编码
result = hashlib.md5(str_)# 将进行字符编码的str_再进行md5加密
# result.hexdigest()默认返回小写的加密结果:0d0a96fa021ccd3fac05df1a584e3185
# result.hexdigest().upper():返回大写的加密结果:0d0a96fa021ccd3fac05df1a584e3185
return result.hexdigest().upper() if __name__ == '__main__':
str_ = 'hellow_world'
print(md5(str_)) # 0d0a96fa021ccd3fac05df1a584e3185

使用flask和md5实现登录接口

1、mysql

-- 创建表
create table t_user(id int auto_increment primary key,username varchar(50),password varchar(200)); -- 尝试添加数据,测试
insert into t_user values(default,'admin','123kkkk')

2、python后端代码

from flask import Flask
import hashlib
import pymysql
flask_app = Flask(__name__) def cur_sql(sql,username,password):
# 创建连接
conn = pymysql.connect(database='demo', user='root', passwd='123456', port=3306, host='localhost')
# 获取游标,执行sql语句
cur = conn.cursor()
# 将sql语句预编译,防止sql注入
cur.execute(sql, (username, password))
data=cur.fetchall()
# 关闭连接,释放内存
cur.close()
conn.close()
return data @flask_app.route('/add/<username>/<password>/')
def user_add(username,password):
try:
# 将密码使用md5进行加密
password=hashlib.md5(password.encode()).hexdigest()
# 要执行的sql语句
sql='insert into t_user values (default,%s,%s)'
if not cur_sql(sql, username, password):
return '用户添加失败'
return '用户添加成功'
except pymysql.MySQLError as e:
return f'用户添加失败:{str(e)}' @flask_app.route('/login/<username>/<password>/')
def user_login(username,password):
try:
password=hashlib.md5(password.encode()).hexdigest()
sql='select * from t_user where username=%s and password=%s' # 添加数据
print(cur_sql(sql, username, password))
if not cur_sql(sql, username, password):
return '登录失败'
return '登录成功'
except pymysql.MySQLError as e:
return f'登录失败:{str(e)}'

使用命令: flask --app main run 运行后端服务

测试结果如下:

添加一个admin用户,密码为admin123

使用错误密码123456登录

使用正确密码

尝试sql注入,注入失败

这种单向加密只保证了数据库不显示明文,保证数据库数据的安全(md5不可逆),但是还是能够使用社工和密码字典进行密码爆破,建议使用的密码10位数字以上

5、sha1加密

SHA1,全称Secure Hash Algorithm(安全哈希算法),相较于MD5,其加密后的数据长度更长。对于长度小于2^64的任意输入,SHA1都能产生一个长度为160bit的散列值,这比MD5多出了32位。因此,SHA1在安全性上相较于MD5有所提升,但其运算速度则相对较慢。

from flask import Flask
import hashlib
import pymysql
flask_app = Flask(__name__) @flask_app.route('/add/<username>/<password>/')
def user_add(username,password):
try:
# 将密码使用sha1进行加密
password=hashlib.sha1(password.encode()).hexdigest()
# 要执行的sql语句
sql='insert into t_user values (default,%s,%s)'
cur_sql(sql,username,password)
return '用户添加成功'
except pymysql.MySQLError as e:
return f'用户添加失败:{str(e)}'

添加成功的数据库

5、secrets加密

secrets模块是Python 3.6引入的一个新内置模块,它专门用于生成密码强随机数,非常适合管理密码、账户验证信息、安全令牌以及相关的秘密信息。总的来说,secrets模块主要可以实现两大功能:

  1. 生成安全的随机数;
  2. 生成一个固定长度的随机字符串,这种字符串可以用作令牌或安全URL
import secrets
import string # 将所有的英文字母的大小写和数字进行组合
parm = string.ascii_letters + string.digits # abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
password = ''.join(secrets.choice(parm) for i in range(10)) # 进行加密
print(password) # NdgdCDt13O

生成包含安全令牌的URL

import secrets
# 这里拿我自己的博客举例
url='https://xiaoyus.cc/update='+secrets.token_urlsafe()
print(url)# https://xiaoyus.cc/update=1Peuz6HGhkhKSSQnmQtndCJ9GcEsRGFyyG-DFJdvazs

这里就做个公益宣传吧,帮帮这些孩子们

6、DES

DES(Data Encryption Standard,数据加密标准)属于对称加密。对称加密,顾名思义,是指加密和解密的运算都是使用同样的密钥。DES算法是一种使用密钥加密的块算法,它将明文分成固定长度的块(通常为64位),并使用一个密钥(通常为56位有效密钥长度,因为最高位用作奇偶校验)对这些块进行加密。

安装:pip install pyDes
导入:from pyDes import des, CBC, PAD_PKCS5
from pyDes import des,CBC,PAD_PKCS5
import binascii # binascii 库在 Python 中主要用于二进制和 ASCII 码之间的转换。 key='xiaoyu13'# key必须为8个字节 def des_encrypt(s):
'''
将数据进行简单加密
:param s:原始字符串
:return: 加密后的字符串,16进制
'''
secret_key=key # 密码
iv=secret_key # 偏移量
# secret_key:加密密匙,CBC:加密模式,iv:偏移量,padmode:填充
des_obj=des(secret_key,CBC,iv,pad=None,padmode=PAD_PKCS5)
# 返回为字节
secret_bytes=des_obj.encrypt(s,padmode=PAD_PKCS5)# b"\x14\xe1\xa2'\x83\x1e\xf3!\x8d\x9aks\xa5M\xe3\x81"
return binascii.b2a_hex(secret_bytes) def des_decrypt(s):
"""
DES 解密
:param s: 加密后的字符串,16进制
:return: 解密后的字符串
"""
secret_key = key
iv = secret_key
des_obj = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5)
result=des_obj.decrypt(binascii.a2b_hex(s),padmode=PAD_PKCS5)
return result if __name__ == '__main__':
print('加密后的结果:',des_encrypt('XIAOYU'))# 加密后的结果: b'ab498fe821d50739'
print('解密后的结果:',des_decrypt(des_encrypt('XIAOYU'))) # 解密后的结果: b'XIAOYU'

Tips:这个错误表示密匙key的字符长度必须为8个字节

7、AES

AES加密,全称为高级加密标准(Advanced Encryption Standard),是一种广泛使用的对称加密算法。

AES算法由美国国家标准与技术研究院(NIST)于2001年发布,作为DES(数据加密标准)算法的替代方案。AES算法以其高强度、高速度和易于实现等优点,迅速成为对称密钥加密中最流行的算法之一。它被广泛用于保护各种敏感数据,如金融交易、在线通信、数据库加密等场景。

他的特点

  1. 对称加密:AES是一种对称加密算法,意味着加密和解密过程使用相同的密钥。这种特性使得AES加密速度相对较快,尤其适用于大量数据的加密。
  2. 密钥长度:AES支持三种长度的密钥:128位、192位和256位。密钥长度越长,加密强度越高,但加密和解密过程也会相应变慢。
  3. 分组加密:AES采用分组加密的方式,每个明文块被独立加密成密文块。AES的标准分组长度为128位(即16字节)。
  4. 复杂操作:AES加密算法涉及四种基本操作:字节替代(SubBytes)、行移位(ShiftRows)、列混淆(MixColumns)和轮密钥加(AddRoundKey)。这些操作共同构成了AES加密的高强度特性。

案例

from Cryptodome.Cipher import AES
from Cryptodome import Random data = 'XiaoYu安全'
#密钥必须为16(AES-128),24,32
key = b'this is a 16 key' #生成长度等于AES块大小的不可重复的密钥向量
iv =Random.new().read(AES.block_size)
print(iv) #使用key和Iv初始化AES对象
mycipher = AES.new(key,AES.MODE_CFB,iv)
print(mycipher)
cip = mycipher.encrypt(data.encode()) #将iv加到加密的密钥开头
ciptext =iv + cip
print(ciptext) #解密需要 key和iv 生成AES对象,取前16位是iv
mydecrypt = AES.new(key,AES.MODE_CFB,ciptext[:16]) #取后16位是密钥
decrytext = mydecrypt.decrypt(ciptext[16:])
print(decrytext.decode())
b'\x87\x10\xe2w\xb3oD\xd9\xbe\xe5\x02\xd4\xdcjk\xe7'
<Cryptodome.Cipher._mode_cfb.CfbMode object at 0x0000000000FF7A90>
b'\x87\x10\xe2w\xb3oD\xd9\xbe\xe5\x02\xd4\xdcjk\xe7\xdd\xf4\xe8\xba\xa0\xa3\xe4n\x0e\xb5Z\x90'
XiaoYu安全

8、RSA加密

RSA是一种公钥密码算法,全称为RSA加密算法,它属于非对称加密算法的一种。

基本概念

  • 定义:RSA加密算法是由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)在1977年共同提出的。该算法的名称来源于这三位发明者姓氏的首字母组合。
  • 特点:RSA算法使用一对密钥进行加密和解密操作,其中一个密钥是公钥(public key),用于加密数据;另一个是私钥(private key),用于解密数据。公钥可以公开,而私钥必须保密。
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
import binascii # 生成密钥对
key = RSA.generate(2048)
private_key = key.export_key()
public_key = key.publickey().export_key() # 要加密的消息
message = '你好, RSA!'
message = message.encode() # 创建加密器并使用公钥加密
encryptor = PKCS1_OAEP.new(RSA.import_key(public_key))
encrypted = encryptor.encrypt(message)
print("加密后:", binascii.hexlify(encrypted)) # 创建解密器并使用私钥解密
decryptor = PKCS1_OAEP.new(RSA.import_key(private_key))
decrypted = decryptor.decrypt(encrypted)
print("解密后:", decrypted.decode())
加密后: b'2103801e707e5011c9555bb8ad23eb317fabeead30fdf0c84a4c2abfdedb02b2c4a40a1d04aeaa344e30ede1580ae3d1154110215a5aa9c56a7e3315028ce35b4144b1691125573b978867d21b7d7068f3f0d683535b3c958119a95cdd320cc7daf82d2690c7f2d14765b6c9d2036d188a8d50121c7e8b8c64eb2660a5262836ea2b65e42010f601e57f605264ebe1130ab64a6d9a50e766f6d6a40b705980c7c046e8f0a8236bf5dea18fecb1b2a9eac6613d9f666d74c0de0683955ca097001a7ac5e27513d2341706e3fb71d5befc57ee71d2b41880ae23c44c2a57559c38371001b1a6e1874c0793cee990c41701aa9256650de79250236e89d61b484'
解密后: 你好, RSA!

总结

在网络安全和密码学领域,数据加密是保护数据机密性、完整性和可用性的关键技术。Python作为一种功能强大的编程语言,提供了多种实现数据加密和解密的方法。本文介绍了常见的加密方式,包括对称加密、非对称加密和单向加密,并详细展示了在Python中如何使用这些加密技术。

一、加密方式

  1. 对称加密

    • 使用同一个密钥进行加密和解密,速度快,适合加密大量数据。
    • 常见算法包括DES(已认为不安全)、3DES、AES(广泛使用的对称加密算法)。
  2. 非对称加密
    • 使用一对密钥(公钥和私钥)进行加密和解密,公钥可公开,私钥保密。
    • 常见算法包括RSA(应用广泛)、ECC(适用于资源有限的场景)、DSA(适用于数字签名)。
  3. 单向加密(不可逆加密)
    • 通过散列算法将明文生成固定长度的散列值,无法从散列值还原原文。
    • 常见算法包括MD5(已不安全)、SHA-1(较安全但速度较慢)、SHA-2(安全性更高)、HMAC(带密钥的散列消息认证码)。

二、Python中的应用

  1. Base64编码

    • 将二进制数据转换为ASCII字符串,常用于文本数据的编码和解码。
  2. MD5和SHA-1加密
    • 用于生成数据的散列值,常用于密码存储、文件完整性验证等场景。
    • 在Python中,通过hashlib模块实现。
  3. Secrets模块
    • 用于生成安全的随机数和随机字符串,适合生成密码、令牌等敏感信息。
  4. DES加密
    • 对称加密算法,使用固定长度的密钥加密数据块。
    • 在Python中,可通过第三方库pyDes实现。
  5. AES加密
    • 对称加密算法,支持多种密钥长度(128位、192位、256位),广泛应用于敏感数据的加密。
    • 在Python中,通过Cryptodome库实现。
  6. RSA加密
    • 非对称加密算法,使用公钥加密数据,私钥解密数据。
    • 在Python中,通过pycryptodome库中的Crypto.PublicKey.RSACrypto.Cipher.PKCS1_OAEP模块实现。

三、实际应用案例

  • 用户注册和登录系统

    • 使用MD5或SHA-1对用户密码进行单向加密存储,防止数据库泄露导致明文密码泄露。
    • 通过Flask框架实现用户注册和登录接口,验证用户名和密码。
  • 文件完整性验证
    • 使用MD5或SHA-2生成文件的散列值,与网站提供的散列值进行比较,确保文件未被篡改。
  • 安全令牌生成
    • 使用secrets模块生成随机字符串,作为令牌或安全URL的一部分,提高系统的安全性。

通过本文的介绍,我们了解了不同加密方式的特点及其在Python中的实现方法。在实际应用中,应根据具体需求选择合适的加密方式,并加强密钥管理,以确保数据的安全性。

原文链接:https://mp.weixin.qq.com/s/E708jTXIn_veWlmNNy8W4Q

网络安全&密码学—python中的各种加密算法的更多相关文章

  1. python 中md5 和 sha1 加密, md5 + os.urandom 生成全局唯一ID

    首先先来介绍一下md5 和 sha1 的概念 MD5 MD5的全称是Message-Digest Algorithm 5(信息-摘要算法).128位长度.目前MD5是一种不可逆算法. 具有很高的安全性 ...

  2. Python中的Base64编码的加密与解密

    Base64 可以干些啥? Base64编码的作用: 由于某些系统中只能使用ASCII字符.Base64就是用来将非ASCII字符的数据转换成ASCII字符的一种方法. 图片(and种子)base64 ...

  3. python中hashlib模块用法示例

    python中hashlib模块用法示例 我们以前介绍过一篇Python加密的文章:Python 加密的实例详解.今天我们看看python中hashlib模块用法示例,具体如下. hashlib ha ...

  4. Python中hash加密

    目录 简介 概念 特点 hash有哪些 算法碰撞 加盐防碰撞 加密 hashlib 主要方法 特有方法 使用方法 加盐 crypt 主要方法 使用说明 应用 密码加密 应用一致性校验 简介 概念 散列 ...

  5. MD5在Python中的简单使用

    MD5不是加密 https://draveness.me/whys-the-design-password-with-md5/ 参考为什么这么设计 Message-Digest Algorithm 5 ...

  6. 用Python中的hashlib实现md5和sha加密

    文章目录 一.用 pandas 读取 Excel 数据 二.加密库 hashlib 三. pandas中的 map() 方法 四.数据加密工具 本文分享知识: pandas读取Excel数据 read ...

  7. [转]Python中的str与unicode处理方法

    早上被python的编码搞得抓耳挠腮,在搜资料的时候感觉这篇博文很不错,所以收藏在此. python2.x中处理中文,是一件头疼的事情.网上写这方面的文章,测次不齐,而且都会有点错误,所以在这里打算自 ...

  8. python中的Ellipsis

    ...在python中居然是个常量 print(...) # Ellipsis 看别人怎么装逼 https://www.keakon.net/2014/12/05/Python%E8%A3%85%E9 ...

  9. python中的默认参数

    https://eastlakeside.gitbooks.io/interpy-zh/content/Mutation/ 看下面的代码 def add_to(num, target=[]): tar ...

  10. Python中的类、对象、继承

    类 Python中,类的命名使用帕斯卡命名方式,即首字母大写. Python中定义类的方式如下: class 类名([父类名[,父类名[,...]]]): pass 省略父类名表示该类直接继承自obj ...

随机推荐

  1. tp5命名规范

    tp5中对类,文件名,函数和方法的命名规范如下: 类名和类文件名保持一致,并统一采用驼峰法命名(首字母大写) 类的命名采用驼峰法,并且首字母大写,例如 User.UserType,不需要添加contr ...

  2. 高程读后感(三)— JS对象实现继承的6种模式及其优缺点

    目录 1.原型链 1.1.默认的原型 1.2.原型和实例的关系 1.3.原型链的问题 2.借用构造函数 2.1.传递参数 2.2.借用构造函数的问题 3.组合继承 4.原型式继承 5.寄生式继承 6. ...

  3. 【VMware VCF】VMware Cloud Foundation Part 02:部署 Cloud Builder。

    VMware Cloud Builder 是用于构建 VMware Cloud Foundation 第一个管理域的自动化部署工具,通过将一个预定义信息的 Excel 参数表导入到 Cloud Bui ...

  4. 毕业设计&毕业项目:基于springboot+jsp实现的健身房管理系统

    一.前言 在当今数字化时代,音乐已经成为人们生活中不可或缺的一部分.随着技术的飞速发展,构建一个用户友好.功能丰富的在线音乐平台成为了许多开发者和创业者的目标.本文将介绍如何使用SpringBoot作 ...

  5. c++ 关于返回值、将亡值的调用研究

    c++11引入右值引用,而出现右值引用的有这几种:返回值(将亡值),常量. class Obj { public: Obj() { cout << "构造函数" < ...

  6. OpenAI深夜丢炸弹硬杠谷歌搜索

    这几年科技变革太快,AI更是飞速发展,作为一名IT老兵,使用过的搜索引擎也是一换再换.这不,刚消停了一段时间的OpenAI又丢出一个炸弹SearchGPT,直接跟谷歌掀桌子了. 1.谷歌搜索的无奈 早 ...

  7. 假期小结2hadoop环境配置

     记录一下hadoop配置 安装Java Development Kit(JDK):Hadoop是用Java编写的,所以首先需要安装JDK.可以从Oracle下载JDK,并按照安装说明进行安装. 下载 ...

  8. 【H5】03 文本内容处理

    摘自: https://developer.mozilla.org/zh-CN/docs/Learn/HTML/Introduction_to_HTML/HTML_text_fundamentals ...

  9. 深度学习框架theano下的batch_norm实现代码——强化学习框架rllab

    深度学习框架theano下的batch_norm实现代码--强化学习框架rllab # encoding: utf-8 import lasagne.layers as L import lasagn ...

  10. Python报错:pkg-config could not find libraries ['avformat', 'avcodec', 'avdevice', 'avutil', 'avfilter', 'swscale', 'swresample']

    参考: https://github.com/PyAV-Org/PyAV/issues/238 https://pyav.org/docs/6.1.2/installation.html#mac-os ...