加密算法用于保护数据的安全性,确保信息在传输和存储过程中不会被未授权的人员读取。常见的加密算法大致可分为两类:
一、对称加密算法
对称加密算法使用相同的密钥进行加密和解密。它们通常速度较快,但密钥管理较为复杂。常见的对称加密算法包括:
1. AES(高级加密标准):一种广泛使用的对称加密算法,支持128位、192位和256位密钥长度,安全性高且速度快。
2. DES(数据加密标准):曾经非常流行,但由于密钥长度仅为56位,现在被认为不够安全。
3. 3DES(三重数据加密标准):在DES的基础上进行了三重加密,安全性相对提高,但处理速度较慢。
4. Blowfish:一种适用于各种用途的对称加密算法,支持多种密钥长度,但已经被更现代的算法如AES所取代。
5. Twofish:Blowfish的后续版本,支持更长的密钥长度,速度快,安全性高。
二、非对称加密算法
非对称加密算法使用一对密钥(公钥和私钥),一个用于加密,一个用于解密。常见的非对称加密算法包括:
1. RSA:一种基于大素数分解难题的算法,广泛用于安全数据传输和数字签名。密钥长度通常为2048位或更长。
2. ECC(椭圆曲线密码学):基于椭圆曲线数学原理的加密算法,提供与RSA相当的安全性,但密钥长度更短,从而计算效率更高。
3. DSA(数字签名算法):用于生成数字签名,以确保数据的完整性和来源的可靠性。
哈希算法
哈希算法用于生成固定长度的唯一表示数据的哈希值,不可逆转。常见的哈希算法包括:
1. MD5:生成128位的哈希值,速度快,但由于碰撞问题,现在不再推荐用于安全目的。
2. SHA-1:生成160位的哈希值,比MD5更安全,但也存在碰撞问题,逐渐被淘汰。
3. SHA-256:属于SHA-2系列,生成256位的哈希值,安全性较高,广泛应用于各种安全场景。
4. SHA-3:最新的SHA系列算法,设计上与SHA-2不同,提供更高的安全性和灵活性。
其他
还有一些其他特殊的加密算法和协议,如:
1. HMAC(哈希消息认证码):结合了哈希函数和密钥的机制,用于验证数据的完整性和真实性。
2. PGP(Pretty Good Privacy):一种用于加密和签名电子邮件的加密标准,结合了对称和非对称加密技术。
3. Diffie-Hellman密钥交换:用于安全地交换密钥的协议,不直接用于加密数据,但对密钥交换至关重要。
这些算法和协议在信息安全领域发挥着重要作用,不同的应用场景可能需要不同的加密技术。
三、非对称加密算法中的两种模式:
非对称加密(也称为公开密钥加密),利用一对密钥——公钥和私钥——来进行数据加密和解密。它具有两个主要用途:数据加密和数字签名。下面是对“公钥加密私钥解密”和“私钥加密公钥解密”这两种模式的解释:
1. 公钥加密私钥解密
工作原理:
**加密过程:** 发送者使用接收者的公钥对消息进行加密。公钥是公开的,可以被任何人获得。
**解密过程:** 接收者使用自己的私钥对加密后的消息进行解密。私钥是保密的,仅接收者自己持有。
特点与用途:
- **安全性:** 只有拥有相应私钥的人才能解密数据,即使加密过程是公开的。
- **用途:** 这种模式主要用于确保数据在传输过程中的机密性。它保证了只有特定的接收者能够读取加密的消息,即使其他人拦截了加密的数据,也无法解密内容。
例子:
1. **假设Alice要发送加密邮件给Bob。**
- Alice从Bob那里获得Bob的公钥。
- Alice使用Bob的公钥对邮件内容进行加密。
- Bob收到加密邮件后,用自己的私钥解密,读取邮件内容。
2. 私钥加密公钥解密
工作原理:
- **加密过程:** 发送者使用自己的私钥对消息进行加密。私钥是保密的,仅发送者自己持有。
- **解密过程:** 接收者使用发送者的公钥对加密后的消息进行解密。公钥是公开的,可以被任何人获得。
特点与用途:
- **安全性:** 这种模式用于确保消息的真实性和完整性。任何拥有发送者公钥的人都可以验证消息是由发送者发出的,而且消息在传输过程中没有被篡改。
- **用途:** 主要用于数字签名。发送者用自己的私钥对消息进行签名,接收者用发送者的公钥来验证签名,从而确认消息的来源和完整性。(有关数字证书的签发和验证及CA证书相关知识可以去看小林coding:3.3 HTTPS RSA 握手解析 | 小林coding)
例子:
1. **假设Alice想要对她的电子文档进行签名,以证明文档的真实性。**
- Alice用自己的私钥对文档生成数字签名。
- Alice将数字签名附加到文档上,并将文档发送给Bob。
- Bob收到文档后,使用Alice的公钥验证数字签名,从而确认文档确实是Alice发出的,并且在传输过程中没有被修改。
总结:
- **公钥加密/私钥解密** 主要用于保护数据的机密性,确保只有特定接收者能够读取加密的数据。
- **私钥加密/公钥解密** 主要用于数字签名,确保数据的真实性和完整性,使接收者能够验证数据的来源和完整性。
这两种模式在实际应用中各有其重要性,通常结合使用以增强数据传输的安全性和可靠性。
四、使用RSA算法对接口自动化做加解密
1、初始的接口自动化程序
以下程序基于requests对审核文章的功能接口做测试
def test03_mis_audit(self):
#审核文章url
self.url_audit = api.host + "/mis/v1 0/articles"
# 参数数据
data = {"article_ids": [api.article_id], "status": 2}
# 调用put方法
r = requests.put(url=self.url_audit, json=data, headers=api.headers)
try:
# 断言
Tool.common_assert(r)
except Exception as e:
# 日志
log.error(e)
# 抛异常
raise
2、使用RSA算法加解密(公钥加密、私钥解密)
步骤:
-
生成RSA密钥对:首先,你需要生成一对RSA密钥(公钥和私钥)。这通常在实际使用之前完成,并且公钥和私钥需要安全存储。
-
使用公钥加密数据:在发送请求时,你可以使用公钥对敏感数据进行加密。
-
使用私钥解密数据:在接收到数据时,使用私钥对加密的数据进行解密。
1. 生成RSA密钥对
你可以使用Python的cryptography
库来生成RSA密钥对:
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization
# 生成RSA密钥对
private_key = rsa.generate_private_key(
public_exponent=65537,
key_size=2048,
)
# 导出私钥和公钥
private_pem = private_key.private_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PrivateFormat.TraditionalOpenSSL,
encryption_algorithm=serialization.NoEncryption()
)
public_key = private_key.public_key()
public_pem = public_key.public_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PublicFormat.SubjectPublicKeyInfo
)
# 将密钥写入文件
with open('private_key.pem', 'wb') as f:
f.write(private_pem)
with open('public_key.pem', 'wb') as f:
f.write(public_pem)
2. 加密数据(在发送请求前)
使用公钥对数据进行加密:
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives import hashes
# 加载公钥
with open('public_key.pem', 'rb') as f:
public_key = serialization.load_pem_public_key(f.read())
# 准备数据
data = {"article_ids": [api.article_id], "status": 2}
data_str = json.dumps(data)
# 使用公钥加密数据
encrypted_data = public_key.encrypt(
data_str.encode(),
padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None)
)
# 发送加密数据
r = requests.put(url=self.url_audit, data=encrypted_data, headers=api.headers)
3. 解密数据(在接收响应后)
使用私钥对数据进行解密:
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives import hashes
# 加载私钥
with open('private_key.pem', 'rb') as f:
private_key = serialization.load_pem_private_key(f.read(), password=None)
# 接收响应并解密
encrypted_response_data = r.content
decrypted_response_data = private_key.decrypt(
encrypted_response_data,
padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None)
)
# 将解密后的数据转换为JSON
response_data = json.loads(decrypted_response_data.decode())
print(response_data)
注意事项
- 密钥管理:密钥需要安全存储和管理。不要将私钥硬编码在代码中,也不要将其与公钥一起暴露。
- 加密与解密:确保加密和解密使用相同的填充模式和哈希算法。
- 数据长度:RSA加密有长度限制,通常应结合对称加密(如AES)来处理较长的数据。
通过以上步骤,可以在接口测试中实现RSA加解密,保护敏感数据在传输过程中的安全性。
3、 使用RSA算法加解密(私钥加密、公钥解密)
使用RSA算法进行私钥加密和公钥解密通常用于数字签名,而不是加密数据的机密性。以下是如何在你的接口自动化测试程序中实现这种方式的步骤:
-
生成RSA密钥对:需要生成一对RSA密钥(公钥和私钥)。
-
使用私钥签名数据:在发送数据时,使用私钥对数据进行签名。
-
使用公钥验证签名:在接收数据时,使用公钥验证签名的有效性。
1. 生成RSA密钥对
首先生成RSA密钥对,这通常在应用程序部署或初始化时完成:
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization
# 生成RSA密钥对
private_key = rsa.generate_private_key(
public_exponent=65537,
key_size=2048,
)
# 导出私钥和公钥
private_pem = private_key.private_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PrivateFormat.TraditionalOpenSSL,
encryption_algorithm=serialization.NoEncryption()
)
public_key = private_key.public_key()
public_pem = public_key.public_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PublicFormat.SubjectPublicKeyInfo
)
# 将密钥写入文件
with open('private_key.pem', 'wb') as f:
f.write(private_pem)
with open('public_key.pem', 'wb') as f:
f.write(public_pem)
2. 使用私钥签名数据
在发送请求前,使用私钥对数据进行签名:
import json
from cryptography.hazmat.primitives import serialization, hashes
from cryptography.hazmat.primitives.asymmetric import padding, rsa
# 加载私钥
with open('private_key.pem', 'rb') as f:
private_key = serialization.load_pem_private_key(f.read(), password=None)
# 准备数据
data = {"article_ids": [api.article_id], "status": 2}
data_str = json.dumps(data)
# 使用私钥对数据进行签名
signature = private_key.sign(
data_str.encode(),
padding.PSS(
mgf=padding.MGF1(hashes.SHA256()),
salt_length=padding.PSS.MAX_LENGTH
),
hashes.SHA256()
)
# 将数据和签名打包
payload = {
'data': data,
'signature': signature.hex() # 将签名转换为十六进制字符串
}
# 发送请求
r = requests.put(url=self.url_audit, json=payload, headers=api.headers)
3. 使用公钥验证签名
在接收到请求后,使用公钥验证签名:
import json
from cryptography.hazmat.primitives import serialization, hashes
from cryptography.hazmat.primitives.asymmetric import padding
# 加载公钥
with open('public_key.pem', 'rb') as f:
public_key = serialization.load_pem_public_key(f.read())
# 假设从响应中获取数据和签名
response_json = r.json()
data = response_json['data']
signature = bytes.fromhex(response_json['signature'])
# 准备数据字符串
data_str = json.dumps(data)
# 使用公钥验证签名
try:
public_key.verify(
signature,
data_str.encode(),
padding.PSS(
mgf=padding.MGF1(hashes.SHA256()),
salt_length=padding.PSS.MAX_LENGTH
),
hashes.SHA256()
)
print("签名验证成功")
except Exception as e:
print("签名验证失败:", e)
注意事项
- 签名算法:签名通常使用
PSS
(Padding Scheme)与SHA256
哈希算法结合。可以根据需要选择其他签名方案或哈希算法。 - 签名的安全性:确保私钥的安全性,并仅在需要的地方使用它。
- 公钥验证:在验证签名时,确保公钥与用来签名的私钥匹配。
通过这些步骤,可以实现RSA私钥加密(签名)和公钥解密(验证签名),确保数据的完整性和来源可靠性。这对于确保数据未被篡改以及确认数据来源是非常重要的。
五、方法封装
import json
import requests
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import serialization, hashes
import logging
# 配置日志
log = logging.getLogger(__name__)
def generate_rsa_keys():
# 生成RSA密钥对
private_key = rsa.generate_private_key(
public_exponent=65537,
key_size=2048,
)
# 导出私钥和公钥
private_pem = private_key.private_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PrivateFormat.TraditionalOpenSSL,
encryption_algorithm=serialization.NoEncryption()
)
public_key = private_key.public_key()
public_pem = public_key.public_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PublicFormat.SubjectPublicKeyInfo
)
# 将密钥写入文件
with open('private_key.pem', 'wb') as f:
f.write(private_pem)
with open('public_key.pem', 'wb') as f:
f.write(public_pem)
def load_public_key():
# 加载公钥
with open('public_key.pem', 'rb') as f:
return serialization.load_pem_public_key(f.read())
def load_private_key():
# 加载私钥
with open('private_key.pem', 'rb') as f:
return serialization.load_pem_private_key(f.read(), password=None)
def encrypt_data(public_key, data):
# 将数据转换为字符串并加密
data_str = json.dumps(data)
encrypted_data = public_key.encrypt(
data_str.encode(),
padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None)
)
return encrypted_data
def decrypt_data(private_key, encrypted_data):
# 解密数据
decrypted_data = private_key.decrypt(
encrypted_data,
padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None)
)
return json.loads(decrypted_data.decode())
def test03_mis_audit(self):
# 如果密钥文件不存在,可以生成密钥对
try:
load_public_key()
load_private_key()
except FileNotFoundError:
generate_rsa_keys()
# 定义审核文章的URL
self.url_audit = f"{api.host}/mis/v1/articles"
# 准备数据
data = {"article_ids": [api.article_id], "status": 2}
# 加载公钥并加密数据
public_key = load_public_key()
encrypted_data = encrypt_data(public_key, data)
# 发送加密数据
try:
r = requests.put(url=self.url_audit, data=encrypted_data, headers=api.headers)
r.raise_for_status() # 确保请求成功
# 加载私钥并解密响应
private_key = load_private_key()
response_data = decrypt_data(private_key, r.content)
print(response_data)
# 断言
Tool.common_assert(r)
except Exception as e:
# 记录错误日志
log.error("An error occurred: %s", e)
# 抛出异常
raise
创作不易,点赞收藏支持一下吧~