前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >加签验签原理

加签验签原理

作者头像
找Bug
发布2023-11-20 13:29:37
5350
发布2023-11-20 13:29:37
举报
文章被收录于专栏:你的Bug我做主你的Bug我做主

当我们谈到加签(签名)和验签(验证签名)时,通常是在信息安全领域中,特别是在数据传输和通信方面。这两个概念主要用于确保数据的完整性和身份验证,以防止数据被篡改或冒充。

加签原理:

加签是指在数据传输之前,发送方对数据进行加密处理,生成一个数字签名,并将该签名与原始数据一起发送给接收方。数字签名是基于加密算法的计算值,其生成过程需要使用私钥,而验证过程则使用相应的公钥。

  1. 选择哈希算法: 首先,选择一个哈希算法,这个算法将用于产生原始数据的哈希值。哈希值是一个固定长度的字符串,唯一地表示输入数据。
  2. 计算哈希值: 发送方使用选择的哈希算法对原始数据进行哈希运算,生成哈希值。
  3. 使用私钥加密哈希值: 发送方使用其私钥对生成的哈希值进行加密,形成数字签名。
  4. 发送数据和数字签名: 发送方将原始数据和数字签名一起发送给接收方。

验签原理:

验签是在接收方接收到数据后,利用发送方的公钥来验证数据的完整性和真实性。

  1. 选择哈希算法: 接收方选择与发送方相同的哈希算法。
  2. 计算哈希值: 接收方使用选择的哈希算法对接收到的原始数据进行哈希运算,生成哈希值。
  3. 使用公钥解密数字签名: 接收方使用发送方的公钥对接收到的数字签名进行解密,得到解密后的哈希值。
  4. 比较哈希值: 接收方将解密后的哈希值与自己计算得到的哈希值进行比较。如果两者相同,则说明数据完整,未被篡改。

通过这样的加签和验签过程,可以确保数据在传输过程中没有被篡改,并且能够验证数据的发送方是否是合法的。这种方式在保护数据完整性和身份验证方面非常有用,特别是在网络通信和安全传输的场景中。下面是python代码示例

代码语言:javascript
复制
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.exceptions import InvalidSignature

# 生成密钥对
def generate_key_pair():
    private_key = rsa.generate_private_key(
        public_exponent=65537,
        key_size=2048,
        backend=default_backend()
    )
    public_key = private_key.public_key()
    return private_key, public_key

# 存储私钥
def save_private_key(private_key, filename="private_key.pem"):
    with open(filename, "wb") as key_file:
        key_file.write(private_key.private_bytes(
            encoding=serialization.Encoding.PEM,
            format=serialization.PrivateFormat.TraditionalOpenSSL,
            encryption_algorithm=serialization.NoEncryption()
        ))
        
# 加载私钥
def load_private_key(filename="private_key.pem"):
    with open(filename, "rb") as key_file:
        private_key = serialization.load_pem_private_key(
            key_file.read(),
            password=None,
            backend=default_backend()
        )
    return private_key

# 存储公钥
def save_public_key(public_key, filename="public_key.pem"):
    with open(filename, "wb") as key_file:
        key_file.write(public_key.public_bytes(
            encoding=serialization.Encoding.PEM,
            format=serialization.PublicFormat.SubjectPublicKeyInfo
        ))

#加载公钥
def load_public_key(filename="public_key.pem"):
    with open(filename, "rb") as key_file:
        public_key = serialization.load_pem_public_key(
            key_file.read(),
            backend=default_backend()
        )
    return public_key
    
# 私钥加签
def sign_data(private_key, data):
    signature = private_key.sign(
        data,
        padding.PKCS1v15(),
        hashes.SHA256()
    )
    return signature

# 公钥验签
def verify_signature(public_key, signature, data):
    try:
        public_key.verify(
            signature,
            data,
            padding.PKCS1v15(),
            hashes.SHA256()
        )
        return True
    except InvalidSignature:
        return False

# 示例用法
private_key, public_key = generate_key_pair()

# 保存密钥对
save_private_key(private_key)
save_public_key(public_key)

# 加签
original_data = b"Hello, World!"
signature = sign_data(private_key, original_data)

# 传输原始数据和签名
# ... (在实际应用中,这两个值可能被传输到其他地方)

# 验签
loaded_public_key = load_public_key()
is_valid_signature = verify_signature(loaded_public_key, signature, original_data)

if is_valid_signature:
    print("签名验证成功,数据完整。")
else:
    print("签名验证失败,数据可能被篡改。")
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-11-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 找Bug 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 加签原理:
  • 验签原理:
相关产品与服务
多因子身份认证
多因子身份认证(Multi-factor Authentication Service,MFAS)的目的是建立一个多层次的防御体系,通过结合两种或三种认证因子(基于记忆的/基于持有物的/基于生物特征的认证因子)验证访问者的身份,使系统或资源更加安全。攻击者即使破解单一因子(如口令、人脸),应用的安全依然可以得到保障。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档