基于RSA算法的接口自动化加解密

加密算法用于保护数据的安全性,确保信息在传输和存储过程中不会被未授权的人员读取。常见的加密算法大致可分为两类:

一、对称加密算法

对称加密算法使用相同的密钥进行加密和解密。它们通常速度较快,但密钥管理较为复杂。常见的对称加密算法包括:

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算法进行私钥加密和公钥解密通常用于数字签名,而不是加密数据的机密性。以下是如何在你的接口自动化测试程序中实现这种方式的步骤:

  1. 生成RSA密钥对:需要生成一对RSA密钥(公钥和私钥)。

  2. 使用私钥签名数据:在发送数据时,使用私钥对数据进行签名。

  3. 使用公钥验证签名:在接收数据时,使用公钥验证签名的有效性。

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

创作不易,点赞收藏支持一下吧~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值