目录
可逆加密算法(对称加密)
不可逆加密算法(哈希)
非对称加密
区块链与非对称加密
首页 后端开发 Python教程 Python中的耙梳加密算法:类型及应用场景

Python中的耙梳加密算法:类型及应用场景

May 07, 2023 pm 09:43 PM
python encryption

可逆加密算法(对称加密)

加密算法是一种将原始数据转换为加密数据的方法。根据加密算法的不同特征,可以将其分为可逆加密算法和不可逆加密算法。

可逆加密算法也称为对称加密算法,其加密和解密过程使用相同的密钥。在这种算法中,加密数据可以通过解密算法还原为原始数据。这种算法通常用于保护数据的机密性,例如保护存储在计算机硬盘上的文件或网络传输的数据。

说白了,就是在数据的传输过程中加密,真正在业务中使用的时候,还是用明文。

比如,使用AES加密算法对文件进行加密:

from Crypto.Cipher import AES  
import os  
# 生成一个16字节的密钥  
key = os.urandom(16)  
# 初始化加密算法  
cipher = AES.new(key, AES.MODE_EAX)  
# 读取要加密的文件  
with open('plaintext.txt', 'rb') as f:  
    plaintext = f.read()  
# 对文件进行加密  
ciphertext, tag = cipher.encrypt_and_digest(plaintext)  
# 将加密后的文件保存到磁盘上  
with open('ciphertext.txt', 'wb') as f:  
    f.write(cipher.nonce)  
    f.write(tag)  
    f.write(ciphertext)
登录后复制

或者使用DES算法:

from Crypto.Cipher import DES  
# 生成一个8字节的密钥  
key = b'secretke'  
# 初始化加密算法  
cipher = DES.new(key, DES.MODE_ECB)  
# 要加密的字符串  
plaintext = b'Hello, World!'  
# 对字符串进行加密  
ciphertext = cipher.encrypt(plaintext)  
# 将加密后的字符串转换为十六进制格式并输出  
print(ciphertext.hex())
登录后复制

在网络传输领域,对称加密一般都是在JWT的Token令牌加密环节使用:

class MyJwt:  
    def __init__(self):  
        # 密钥  
        self.secret = "1234"  
    # 加密方法(加入生命周期)  
    def encode_time(self,userinfo,lifetime=300):  
        # 单独声明载荷playload  
        playload = {  
            'exp':(datetime.datetime.now()+datetime.timedelta(seconds=lifetime)).timestamp(),  
            'data':userinfo  
        }  
        res = jwt.encode(playload,self.secret,algorithm='HS256')  
        return res  
    # 加密方法  
    async def encode(self,userinfo):  
        res = jwt.encode(userinfo,self.secret,algorithm='HS256')  
        return res  
    # 解密算法  
    async def decode(self,jwt_str):  
        res = jwt.decode(jwt_str,self.secret,algorithms=['HS256'])  
        return res
登录后复制

在实际应用中,需要选择适合具体场景的加密算法和密钥长度,并采取适当的安全措施来保护密钥,因为对于可逆加密算法来说,秘钥一旦泄露,带来的后果将会是灾难性的。

不可逆加密算法(哈希)

不可逆加密(也称哈希算法)通常用于对密码或者数据进行加密或验证,保证密码或数据的安全性。相比对称加密或非对称加密,哈希算法不需要密钥进行加密或解密,因此更加方便和高效,但它不支持解密,一旦加密后的结果生成,就无法恢复原始数据,不可逆加密算法的最常见应用场景就是把用户的明文密码加密成为密文。

比如使用SHA-256哈希算法对数据进行加密:

import hashlib  
# 加密数据  
message = b'hello world'  
hash_object = hashlib.sha256(message)  
encrypted_data = hash_object.hexdigest()  
print(encrypted_data)
登录后复制

或者使用bcrypt算法对密码进行加密:

import bcrypt  
# 加密密码  
password = b'mysecretpassword'  
salt = bcrypt.gensalt()  
hashed_password = bcrypt.hashpw(password, salt)  
# 验证密码  
password_to_check = b'mysecretpassword'  
if bcrypt.checkpw(password_to_check, hashed_password):  
    print("Password is valid!")  
else:  
    print("Invalid password.")
登录后复制

又或是使用scrypt算法对密码进行加密:

import scrypt  
# 加密密码  
password = b'mysecretpassword'  
salt = b'saltsaltsalt'  
encrypted_password = scrypt.hash(password, salt, N=16384, r=8, p=1)  
# 验证密码  
password_to_check = b'mysecretpassword'  
if scrypt.hash(password_to_check, salt, N=16384, r=8, p=1) == encrypted_password:  
    print("Password is valid!")  
else:  
    print("Invalid password.")
登录后复制

原理上大同小异,都是基于散列(hash)算法将原始数据映射到一个固定长度的密文上,由于不可逆加密(哈希算法)是一种单向的加密方式,无法通过解密来恢复原始数据,因此暴力 破解的哈希算法通常是通过对大量的可能性进行穷举来尝试匹配原始数据:

import hashlib  
# 加载包含密码列表的文件  
with open('passwords.txt', 'r') as f:  
    passwords = f.read().splitlines()  
# 加载哈希值  
hash_value = '5d41402abc4b2a76b9719d911017c592'  
# 尝试匹配密码  
for password in passwords:  
    if hashlib.md5(password.encode()).hexdigest() == hash_value:  
        print(f"Password found: {password}")  
        break  
else:  
    print("Password not found.")
登录后复制

网络上所谓的数据库被“脱库”,实际上泄露的是密文,随后黑客使用MD5哈希算法来尝试匹配密码。如果密码匹配成功,则输出匹配的密码,否则输出密码未找到。当然了,像CSDN这种奇行种用明文存密码的奇葩行为艺术,不能当作普遍现象来考虑。

但其实,所谓的“穷举”也不是真正意义上的穷举,因为人类设置密码就那些规律,出生日期手机号之类,如果是熟人,不可逆加密很容易被试出来,所以为了避免被黑客“试出来”密码,密码首先就是要长,要包含数字,大小写,和符号,这样可以最大化密码的可能性。数字10种可能,小写字母26种可能,大写字母26种可能,符号34种可能,如果长度是16位,随机一点,那可能的密码可能就是96的16次方,有6万万亿种可能,这要是试出来的话,那得是猴年马月了:

Python耙梳加密算法Encryption种类及开发场景是什么

最后,不可逆加密算法还可以通过增加盐值、增加迭代次数等措施来提高密文的安全性。

非对称加密

非对称加密也是一种加密算法,然而与上文所述的对称加密算法不同,它使用一对公私钥(公钥和私钥)来加密和解密数据。在非对称加密中,公钥是公开的,任何人都可以使用它来加密数据,但只有持有私钥的人才能够解密数据。

非对称加密算法在以下场景中得到广泛应用:

安全通信:非对称加密可以保护数据在网络传输过程中的安全性,如 HTTPS 协议中使用非对称加密算法保护网站和用户之间的数据传输。

数字签名:非对称加密可以使用私钥对文件或者数据进行签名,以验证文件或数据的完整性和真实性,如数字证书中使用非对称加密算法保护数字签名的安全性。

身份验证:非对称加密可以使用私钥进行身份验证,例如SSH登录或者远程桌面等,使用公钥进行身份认证和加密通讯。

在Python3.10中,可以使用标准库中的 cryptography 模块来实现非对称加密,以下是使用 cryptography 模块生成一对公私钥的示例:

from cryptography.hazmat.primitives.asymmetric import rsa, padding  
from cryptography.hazmat.primitives import serialization  
# 生成公私钥  
private_key = rsa.generate_private_key(public_exponent=65537, key_size=2048)  
public_key = private_key.public_key()  
# 将公钥和私钥保存到文件  
with open('private_key.pem', 'wb') as f:  
    f.write(private_key.private_bytes(  
        encoding=serialization.Encoding.PEM,  
        format=serialization.PrivateFormat.PKCS8,  
        encryption_algorithm=serialization.NoEncryption()))  
with open('public_key.pem', 'wb') as f:  
    f.write(public_key.public_bytes(  
        encoding=serialization.Encoding.PEM,  
        format=serialization.PublicFormat.SubjectPublicKeyInfo))
登录后复制

这里使用 rsa 模块生成了一对公私钥,并使用 serialization 模块将公私钥保存到文件中。在实际使用中,公钥可以公开使用,而私钥应该保存在安全的地方以确保数据的安全性。

在支付系统中,非对称加密的应用非常广泛,主要用这套加密算法来生成签名和验签操作,用来保证支付过程中的安全性,以支付宝支付为例子:

 def sign(self, unsigned_string):  
        # 开始计算签名  
        key = self.app_private_key  
        signer = PKCS1_v1_5.new(key)  
        signature = signer.sign(SHA256.new(unsigned_string))  
        # base64 编码,转换为unicode表示并移除回车  
        sign = encodebytes(signature).decode("utf8").replace("\n", "")  
        return sign  
    def _verify(self, raw_content, signature):  
        # 开始计算签名  
        key = self.alipay_public_key  
        signer = PKCS1_v1_5.new(key)  
        digest = SHA256.new()  
        digest.update(raw_content.encode("utf8"))  
        if signer.verify(digest, decodebytes(signature.encode("utf8"))):  
            return True  
        return False
登录后复制

公钥用来生成签名,私钥用来验证签名。

区块链与非对称加密

非对称加密在区块链领域中的应用非常广泛。区块链是一个去中心化的分布式账本系统,由于其去中心化的特点,任何人都可以加入网络并参与交易,因此需要使用非对称加密来保护数据的隐私和安全性。

以下是一些非对称加密在区块链领域中的应用:

数字签名:在区块链中,数字签名用于验证交易的真实性和完整性。数字签名的过程是使用私钥对交易数据进行签名,然后在交易中包含签名和公钥,其他人可以使用公钥验证交易的真实性和完整性。
共识算法:区块链中的共识算法用于确定哪些交易应该被添加到区块中。共识算法通常需要参与者提供一定数量的加密学证据,如哈希值或数字签名,以证明他们有权参与共识。
区块链钱包:区块链钱包是用于存储和管理数字货币的介质。钱包通常使用非对称加密来保护用户的私钥,确保用户的数字货币不被盗窃或篡改。

加密货币交易所:加密货币交易所是用于买卖数字货币的平台。交易所通常使用非对称加密来保护用户的身份信息和交易数据的安全性。

可以使用Python3.10来完成区块链中的数字签名,同样使用Python的加密库 cryptography 来生成公私钥对、签名和验证签名。下面是一个简单的示例代码:

from cryptography.hazmat.primitives.asymmetric import ec  
from cryptography.hazmat.primitives import serialization, hashes  
from cryptography.hazmat.primitives.asymmetric.utils import encode_dss_signature, decode_dss_signature  
# 生成椭圆曲线公私钥对  
private_key = ec.generate_private_key(ec.SECP256K1())  
public_key = private_key.public_key()  
# 对数据进行签名  
data = b"hello, world"  
signature = private_key.sign(data, ec.ECDSA(hashes.SHA256()))  
# 将签名和数据一起传输  
signature_bytes = encode_dss_signature(*signature)  
data_with_signature = (data, signature_bytes)  
# 验证签名  
data, signature_bytes = data_with_signature  
signature = decode_dss_signature(signature_bytes)  
public_key.verify(signature, data, ec.ECDSA(hashes.SHA256()))
登录后复制

首先,我们使用 ec.generate_private_key(ec.SECP256K1()) 方法生成一个椭圆曲线私钥。然后,我们可以通过 private_key.public_key() 方法获取对应的公钥。

接着,我们使用私钥对数据进行签名。这里使用 SHA256 哈希算法来计算数据的哈希值,并使用 ECDSA 签名算法对哈希值进行签名。
随后,我们将签名和数据一起传输。在实际应用中,签名和数据通常都是以二进制数据的形式进行传输。
最后,我们可以使用公钥来验证签名。首先,我们需要将签名从字节数据解码为两个整数。然后,我们可以使用 public_key.verify() 方法来验证签名是否正确。如果签名正确,这个方法将不会抛出异常;否则,将会抛出 InvalidSignature 异常。

以上是Python中的耙梳加密算法:类型及应用场景的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

mysql 是否要付费 mysql 是否要付费 Apr 08, 2025 pm 05:36 PM

MySQL 有免费的社区版和收费的企业版。社区版可免费使用和修改,但支持有限,适合稳定性要求不高、技术能力强的应用。企业版提供全面商业支持,适合需要稳定可靠、高性能数据库且愿意为支持买单的应用。选择版本时考虑的因素包括应用关键性、预算和技术技能。没有完美的选项,只有最合适的方案,需根据具体情况谨慎选择。

HadiDB:Python 中的轻量级、可水平扩展的数据库 HadiDB:Python 中的轻量级、可水平扩展的数据库 Apr 08, 2025 pm 06:12 PM

HadiDB:轻量级、高水平可扩展的Python数据库HadiDB(hadidb)是一个用Python编写的轻量级数据库,具备高度水平的可扩展性。安装HadiDB使用pip安装:pipinstallhadidb用户管理创建用户:createuser()方法创建一个新用户。authentication()方法验证用户身份。fromhadidb.operationimportuseruser_obj=user("admin","admin")user_obj.

Navicat查看MongoDB数据库密码的方法 Navicat查看MongoDB数据库密码的方法 Apr 08, 2025 pm 09:39 PM

直接通过 Navicat 查看 MongoDB 密码是不可能的,因为它以哈希值形式存储。取回丢失密码的方法:1. 重置密码;2. 检查配置文件(可能包含哈希值);3. 检查代码(可能硬编码密码)。

mysql 需要互联网吗 mysql 需要互联网吗 Apr 08, 2025 pm 02:18 PM

MySQL 可在无需网络连接的情况下运行,进行基本的数据存储和管理。但是,对于与其他系统交互、远程访问或使用高级功能(如复制和集群)的情况,则需要网络连接。此外,安全措施(如防火墙)、性能优化(选择合适的网络连接)和数据备份对于连接到互联网的 MySQL 数据库至关重要。

mysql workbench 可以连接到 mariadb 吗 mysql workbench 可以连接到 mariadb 吗 Apr 08, 2025 pm 02:33 PM

MySQL Workbench 可以连接 MariaDB,前提是配置正确。首先选择 "MariaDB" 作为连接器类型。在连接配置中,正确设置 HOST、PORT、USER、PASSWORD 和 DATABASE。测试连接时,检查 MariaDB 服务是否启动,用户名和密码是否正确,端口号是否正确,防火墙是否允许连接,以及数据库是否存在。高级用法中,使用连接池技术优化性能。常见错误包括权限不足、网络连接问题等,调试错误时仔细分析错误信息和使用调试工具。优化网络配置可以提升性能

如何针对高负载应用程序优化 MySQL 性能? 如何针对高负载应用程序优化 MySQL 性能? Apr 08, 2025 pm 06:03 PM

MySQL数据库性能优化指南在资源密集型应用中,MySQL数据库扮演着至关重要的角色,负责管理海量事务。然而,随着应用规模的扩大,数据库性能瓶颈往往成为制约因素。本文将探讨一系列行之有效的MySQL性能优化策略,确保您的应用在高负载下依然保持高效响应。我们将结合实际案例,深入讲解索引、查询优化、数据库设计以及缓存等关键技术。1.数据库架构设计优化合理的数据库架构是MySQL性能优化的基石。以下是一些核心原则:选择合适的数据类型选择最小的、符合需求的数据类型,既能节省存储空间,又能提升数据处理速度

mysql 无法连接到本地主机怎么解决 mysql 无法连接到本地主机怎么解决 Apr 08, 2025 pm 02:24 PM

无法连接 MySQL 可能是由于以下原因:MySQL 服务未启动、防火墙拦截连接、端口号错误、用户名或密码错误、my.cnf 中的监听地址配置不当等。排查步骤包括:1. 检查 MySQL 服务是否正在运行;2. 调整防火墙设置以允许 MySQL 监听 3306 端口;3. 确认端口号与实际端口号一致;4. 检查用户名和密码是否正确;5. 确保 my.cnf 中的 bind-address 设置正确。

如何将 AWS Glue 爬网程序与 Amazon Athena 结合使用 如何将 AWS Glue 爬网程序与 Amazon Athena 结合使用 Apr 09, 2025 pm 03:09 PM

作为数据专业人员,您需要处理来自各种来源的大量数据。这可能会给数据管理和分析带来挑战。幸运的是,两项 AWS 服务可以提供帮助:AWS Glue 和 Amazon Athena。

See all articles