加密,各种加密,耙梳加密算法(Encryption)种类以及开发场景中的运用(Python3.10)

news/2024/4/29 19:42:17/文章来源:https://blog.csdn.net/zcxey2911/article/details/129136266

不用说火爆一时,全网热议的Web3.0区块链技术,也不必说诸如微信支付、支付宝支付等人们几乎每天都要使用的线上支付业务,单是一个简简单单的注册/登录功能,也和加密技术脱不了干系,本次我们耙梳各种经典的加密算法,试图描摹加密算法在开发场景中的运用技巧。

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

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

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

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

比如,使用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万万亿种可能,这要是试出来的话,那得是猴年马月了:

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

非对称加密

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

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

安全通信:非对称加密可以保护数据在网络传输过程中的安全性,如 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 异常。

结语

加密技术隶属于应用密码学的范畴,旨在保护信息的机密性和完整性,以确保只有授权的人可以访问和使用该信息。加密技术主要涉及两种类型的算法就是本文提到的:对称加密和非对称加密。

密码学在现代社会中的应用非常广泛,包括互联网、电子商务、数字支付、电子邮件、社交网络等。它是保护个人隐私和商业机密的重要工具。同时,密码学也是许多高级安全协议和系统的基础,例如 SSL/TLS(https/wss)、SSH、PGP、IPSec、Kerberos 等等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_260717.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp 原生安卓开发插件(module),以及android环境本地调试(二)

uniapp 原生安卓开发插件(module),以及android环境本地调试(一) 1、前景 承接上一篇文章,由于uniapp每天只有限定的打包次数,所以每次插件调试都打包成为基座,这个不太方便&#x…

Java的Annotation接口

PS: 该博客将涉及Google Guice的一些知识,但不要惊慌,即使你从未了解过Guice,也能正常阅读该博客 1. 序言 学习Java注解时,曾提到:所有的注解都将继承java.lang.annotation.Annotation接口,无法…

Android自动化测试(UiAutomator)——UiObject

本文主要讲解使用UiAutomator的一些技巧,希望对于初学者有一定的帮助 UiObject 1、首先要声明对象 UiObject XXX new UiObject(new Selector) ; 2、其次对对象进行操作 操作类型包括: 执行类:文本输入与清除、点击/长按、拖动/滑动、 …

安装配置RabbitMQ(Win11)

一、安装依赖Erlang打开RabbitMQ官网:https://www.rabbitmq.com/点击Get Started点击Download Installation点击 Chocolatey or Installer点击? Erlang/OTP Version Tree点击win64下载完成后,右击“以管理员身份”安装配置Erlang环境变量 :…

Mybatis的介绍和基本使用

目录 数据库操作框架的历程 JDBC Hibernate JDBCTemplate 什么是Mybatis 快速搭建Mybatis项目 创建普通的maven项目 导入相关的依赖 创建对应的数据表 创建与表对应的实体类对象 创建对应的Mapper接口 编写配置文件 编写测试类 增删改查的基本操作 数据库操作框…

Java线程的6 种状态

Java 线程的状态 Java线程有六种状态: 初始(NEW)、运行(RUNNABLE)、阻塞(BLOCKED)、 等待(WAITING)、超时等待(TIMED_WAITING)、终止&#xff08…

vue-router 的基本用法

vue-router 的基本用法 1.什么是 vue-router vue-router 是 vue.js 官方给出的路由解决方案。它只能结合 vue 项目进行使用,能够轻松的管理 SPA 项目中组件的切换。 vue-router 的官方文档地址:https://router.vuejs.org/zh/ 2.vue-router 安装和配置的…

MacBook IDEA 顶部菜单栏不显示问题

文章目录背景:当前显示方式一1. 快捷键:双击shift 搜索 idea.vmoptions3. 在idea.vmoptions文件末尾添加 -Dapple.laf.useScreenMenuBarfalse方式二1. 访达 > 应用程序 > idea 右键 显示包内容2. 进入到bin包位置的命令终端3. 编辑文件 vi idea.pr…

EasyExcel 低内存导出大数据量的Excel方案探索 50万行 50列 (附:实现代码)

文章目录1.前言2.准备工作3.导出测试3.1.单次查询、全量导出3.2. 多次查询,多个文件,单次写入3.3.多次查询,多个文件,多次写入3.4.多线程导出探索3.5.文件打包成ZIP3.6.响应给客户4.实现代码5.结语1.前言 最近接到一个需求&#…

多元化增长引擎业务占比超四成,联想开启混动模式?

一句话概括联想集团的业绩:预料之内的整体下滑,超出预期的第二曲线。 上周五(2月17日),联想集团发布了2022到2023财年第三季度业绩。根据财报,联想集团实现营收152.67亿美元,同比下降24%&#…

【机器学习】决策树-Gini指数

1. CART树 分类回归树(CART,Classification And Regression Tree)算法是一种决策树分类方法。CART每一个节点上都采用二分法,采用一种二分递归分割的技术,CART生成的树必须是二叉树,也就是无论回归还是分类,无论特征离散还是连续&…

15-基础加强3-单元测试日志

文章目录1.单元测试1.1概述【理解】1.2特点【理解】1.3使用步骤【应用】1.4相关注解【应用】2.日志2.1概述【理解】2.2日志体系结构和Log4J【理解】2.3入门案例【应用】1.单元测试 1.1概述【理解】 JUnit是一个 Java 编程语言的单元测试工具。JUnit 是一个非常重要的测试工具…

Profinet转ModbusTCP网关连接昆仑通态触摸屏配置案例

本案例是模拟将Modbus TCP 设备数据接入到西门子PROFINET 网络中。 使用设备为西门子 S7-1500 型 PLC, Profinet转ModbusTCP网关。MODBUS 从站昆仑通态触摸屏。 配置方法: 打开博图,新建项目并添加站点。 添加1513PLC。 设置好IP并处于联网状态 导入Pr…

VTK学习笔记(四十)vtk提取单层数据

VTK学习笔记(四十)vtk提取单层数据1. VTK学习笔记(四十)vtk提取单层数据1.1 vtkImageReslice提取单层图像1.2 vtkExtractVOI提取单层图像1. VTK学习笔记(四十)vtk提取单层数据 VTK实现单层图片的提取方法有…

力扣mysql刷题记录

mysql刷题记录 刷题链接https://leetcode.cn/study-plan/sql/?progressjkih0qc mysql冲!mysql刷题记录一. 1699. 两人之间的通话次数题解二、1251. 平均售价题解三. 1571. 仓库经理题解四.1445. 苹果和桔子解五.1193. 每月交易 I题解六.1633. 各赛事的用户注册率题…

Android Spider XX兔 Wechat Cookie 校验 注册案例(二)

声明 此次案例只为学习交流使用,抓包内容、敏感网址、数据接口均已做脱敏处理,切勿用于其他非法用途; 文章目录声明前言一、资源推荐二、任务说明三、App抓包分析四、还原JS加密1、Date类2、MD5类3、组合调用还原 api_token 参数4、execjs模…

Android 基础知识4-2.10 GridLayout(网格布局)详解

一、GridLayout(网格布局)概述 GridLayout 布局是 Android 4.0 以后引入的新布局,和 TableLayout(表格布局) 有点类似,不过它功能更多,也更加好用,最大的特点是放置的组件自动占据网格的整个区域,每个组件的…

《FPGA学习》->呼吸灯

🍎与其担心未来,不如现在好好努力。在这条路上,只有奋斗才能给你安全感。你若努力,全世界都会为你让路。呼吸灯,简而言之就像人类呼吸一样,有节奏的让LED灯从:灭->微微亮->微亮->亮-&g…

K_A12_014 基于STM32等单片机驱动S12SD紫外线传感器模块 串口与OLED0.96双显示

K_A12_014 基于STM32等单片机驱动S12SD紫外线传感器模块 串口与OLED0.96双显示一、资源说明二、基本参数参数引脚说明三、驱动说明IIC地址/采集通道选择/时序对应程序:数据对比:四、部分代码说明1、接线引脚定义1.1、STC89C52RCS12SD紫外线传感器模块1.2、STM32F103…

Leetcode.2257 统计网格图中没有被保卫的格子数

题目链接 Leetcode.2257 统计网格图中没有被保卫的格子数 Rating : 1709 题目描述 给你两个整数 m和 n表示一个下标从 0开始的 m x n网格图。同时给你两个二维整数数组 guards和 walls,其中 guards[i] [rowi, coli]且 walls[j] [rowj, colj]&#xff…