当前位置:

首页 > 编程开发 > 密码管理器Padding问题怎么解决

密码管理器Padding问题怎么解决

本文目录

    本文旨在解决在使用Python的Crypto库进行AES加密时,由于Padding不正确导致的解密失败问题。通过引入自定义的Padding和Unpadding方法,并结合示例代码,详细展示了如何正确地加密和解密密码,并将其安全地存储在文本文件中。同时,也对代码结构和潜在的安全风险提出了改进建议,确保密码管理器的安全性和可靠性。

    解决密码管理器中的Padding问题

    本文旨在解决在使用Python的`Crypto`库进行AES加密时,由于Padding不正确导致的解密失败问题。通过引入自定义的Padding和Unpadding方法,并结合示例代码,详细展示了如何正确地加密和解密密码,并将其安全地存储在文本文件中。同时,也对代码结构和潜在的安全风险提出了改进建议,确保密码管理器的安全性和可靠性。

    在使用 Crypto 库进行 AES 加密时,Padding 错误是一个常见的问题,尤其是在处理需要多次加密和解密,并将结果保存到文件中的场景下。 根本原因是AES算法要求加密的数据长度必须是块大小(通常是16字节)的倍数。当数据长度不满足此要求时,需要进行 Padding 填充。如果 Padding 的方式不正确,解密时就会出现 ValueError: Padding is incorrect. 错误。

    理解Padding和Unpadding

    Padding 是在数据末尾添加额外字节,使其长度达到块大小的倍数的过程。Unpadding 则是解密后,移除这些额外字节,恢复原始数据的过程。Crypto.Util.Padding 模块提供了一些 Padding 和 Unpadding 的方法,但有时使用自定义的方法可能更可靠。

    解决Padding问题的示例代码

    以下代码展示了如何使用自定义的 Padding 和 Unpadding 方法来解决这个问题。此代码基于 Stack Overflow 上的一个答案,并进行了修改以适应密码管理器的需求。

    import re
    import random
    import string
    from Crypto.Cipher import AES
    from Crypto.Random import get_random_bytes
    import hashlib
    
    def password_generator(size=10):
        if size <= 8:
            print("Size must be at least 4")
            return None
        password = []
        while len(password) < size:
            password.append(random.choice(string.ascii_lowercase))  # ensure at least one lowercase letter
            if len(password) < size:
                password.append(random.choice(string.ascii_uppercase))  # ensure at least one uppercase letter
            if len(password) < size:
                password.append(random.choice(string.digits))  # ensure at least one digit
            if len(password) < size:
                password.append(random.choice(string.punctuation))  # ensure at least one special character
        random.shuffle(password)  # shuffle to remove the predictability
        return ''.join(password)
    
    def password_checker(password):
        if len(password) >= 8:
            if bool(re.match(r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^A-Za-z\d])', password)):
                print("The password is strong")
            else:
                print("The password is weak")
        else:
            print("You have entered a short or invalid password.")
    
    # Generate a password
    generated_password = password_generator()
    print(generated_password)
    
    # Check the generated password
    password_checker(generated_password)
    
    
    class AESCipher(object):
    
        def __init__(self, key):
            self.bs = AES.block_size
            self.key = hashlib.sha256(key).digest()
    
        def encrypt_data(self, iv, raw):
            raw = self._pad(raw)
            cipher = AES.new(self.key, AES.MODE_CBC, iv)
            return cipher.iv, iv + cipher.encrypt(raw.encode())
    
        def decrypt_data(self, iv, enc):
            cipher = AES.new(self.key, AES.MODE_CBC, iv)
            return AESCipher._unpad(cipher.decrypt(enc[AES.block_size:])).decode('utf-8')
    
        def _pad(self, s):
            return s + (self.bs - len(s) % self.bs) * chr(self.bs - len(s) % self.bs)
    
        @staticmethod
        def _unpad(s):
            return s[:-ord(s[len(s)-1:])]
    
    # Generate a random 128-bit IV for AES
    iv = get_random_bytes(16)
    
    # Generate a random 256-bit key for AES
    key = get_random_bytes(32)  # save this maybe?
    
    Cipher = AESCipher(key)
    
    # Encrypt the generated password
    iv, encrypted_password = Cipher.encrypt_data(iv, generated_password)
    print(f"Encrypted password: {encrypted_password}")
    
    # Decrypt the encrypted password
    decrypted_password = Cipher.decrypt_data(iv, encrypted_password)
    print(f"Decrypted password: {decrypted_password}")
    
    # Save the encrypted password to a file
    with open(
            'Password.txt',
            'a', encoding='utf-8') as f:
        f.write(f"{iv.hex()}:{encrypted_password.hex()}\n")
    
    # Read the encrypted password from the file
    with open(
            'Password.txt',
            'r', encoding='utf-8') as f:
        for line in f.readlines():
            line = line.strip()  # Remove the trailing newline character
            iv, encrypted_password = line.split(':')
            decrypted_password = Cipher.decrypt_data(bytes.fromhex(iv), bytes.fromhex(encrypted_password))
            print(f"Decrypted password from file: {decrypted_password}")

    代码解释:

    1. AESCipher 类: 这个类封装了 AES 加密和解密的所有操作,包括初始化、Padding 和 Unpadding。
      • __init__: 初始化方法,接收一个密钥,并使用 SHA256 对其进行哈希处理,以确保密钥的安全性。
      • encrypt_data: 加密数据的方法,先对数据进行 Padding,然后使用 AES 加密。
      • decrypt_data: 解密数据的方法,先使用 AES 解密,然后进行 Unpadding。
      • _pad: 自定义的 Padding 方法,将数据填充到块大小的倍数。
      • _unpad: 自定义的 Unpadding 方法,移除 Padding 字节。
    2. 密钥生成: 使用 get_random_bytes(32) 生成一个 256 位的随机密钥。请注意,在实际应用中,需要安全地存储和管理这个密钥。
    3. 加密和解密流程: 首先创建一个 AESCipher 实例,然后使用 encrypt_data 方法加密密码,并使用 decrypt_data 方法解密密码。
    4. 文件存储: 将 IV 和加密后的密码以十六进制字符串的形式存储在文本文件中,用冒号分隔。读取文件时,将十六进制字符串转换回字节,然后进行解密。

    注意事项和改进建议

    • 密钥管理: 密钥的安全存储至关重要。不要将密钥硬编码在代码中,也不要将其存储在与加密数据相同的文件中。考虑使用密钥管理系统或硬件安全模块 (HSM) 来安全地存储密钥。
    • 避免硬编码路径: 避免在代码中硬编码文件路径,使用相对路径或配置文件来提高代码的可移植性和安全性。
    • 异常处理: 在文件读写和加密解密过程中,添加适当的异常处理,以提高代码的健壮性。
    • 使用更安全的文件格式: 虽然文本文件可以用于存储加密数据,但使用二进制文件格式(如 .bin)可能更安全,因为它们不容易被意外编辑或损坏。
    • 使用更强的密钥派生函数 (KDF): SHA256 是一种哈希函数,但它不是专门为密钥派生设计的。考虑使用 Argon2、bcrypt 或 scrypt 等 KDF 来从用户密码派生密钥。
    • 组织代码结构: 始终将所有导入放在文件的开头,这是一种良好的编码实践。

    总结

    通过使用自定义的 Padding 和 Unpadding 方法,可以有效地解决 Crypto 库中由于 Padding 不正确导致的解密失败问题。同时,注意密钥的安全存储和管理,以及代码的健壮性和安全性,可以构建一个安全可靠的密码管理器。

    本文内容来源于网友投稿,如有侵权请联系删除。
    作者最新文章
    编程开发
    相关文章 更多
    PHP递归性能优化技巧与迭代替代方案
    PHP递归性能优化技巧与迭代替代方案

    解析PHP递归函数在树形数据处理中的性能瓶颈,提供预加载数据消除I/O、使用显式栈替代深层递归的实战方案,帮助开发者在代码可读性与执行效率间做出合理取舍。

    Java测试中怎么使用Mockito模拟依赖对象
    Java测试中怎么使用Mockito模拟依赖对象

    详细讲解在Java单元测试中如何使用Mockito模拟依赖对象,包括引入依赖、创建Mock、打桩返回值、行为验证以及Mock与Spy的核心差异和常见陷阱排查。

    链表删除节点的时间复杂度是多少及其详细分析
    链表删除节点的时间复杂度是多少及其详细分析

    详细分析链表删除节点的时间复杂度,深入探讨单链表与双向链表在不同已知前提下的查找与删除开销,并结合完整代码与清晰图解进行对比总结。

    codex如何配置模型参数及文件设置教程
    codex如何配置模型参数及文件设置教程

    想知道如何让AI写出的代码更贴合你的习惯?本文手把手教你在VS Code中调整Codex相关模型参数,通过修改配置文件优化温度值和令牌限制,解决代码建议不准确或响应慢的问题。

    Claude Code AI编程工具实力揭秘与编程助手实测
    Claude Code AI编程工具实力揭秘与编程助手实测

    通过实测展示Claude Code在终端中如何理解自然语言指令、自动修改代码文件并处理复杂编程任务,帮助开发者评估其实际辅助能力。

    winforms教程自学入门与基础开发步骤详解
    winforms教程自学入门与基础开发步骤详解

    本教程详细讲解如何使用Visual Studio创建WinForms项目,通过添加按钮和标签控件并编写点击事件代码,实现一个基础的计数器功能,适合C#初学者快速上手Windows窗体应用开发。

    Cursor自动补全设置教程教你快速开启代码补全功能
    Cursor自动补全设置教程教你快速开启代码补全功能

    详解Cursor编辑器中自动补全功能的开启与优化设置,涵盖Tab触发机制、上下文窗口调整及模型切换,帮助开发者解决补全延迟、干扰大等问题,提升编码流畅度。

    pandas的数据格式怎么转换和设置方法教程
    pandas的数据格式怎么转换和设置方法教程

    详解Pandas中数据格式转换的核心方法,包括astype强制转换、to_numeric容错处理及日期解析技巧,解决常见类型错误并提升数据处理效率。

    VS Code中文设置方法 简体语言包安装与切换教程
    VS Code中文设置方法 简体语言包安装与切换教程

    详细介绍在Visual Studio Code中安装Chinese (Simplified)语言包的方法,包括通过扩展市场搜索、安装及自动重启切换至简体中文界面的完整步骤,帮助开发者快速将编辑器本地化。

    cursor安装过程无法更改安装位置的解决方法
    cursor安装过程无法更改安装位置的解决方法

    针对Cursor安装包默认锁定C盘且无路径选择界面的问题,提供通过手动移动文件并创建目录联结(Symbolic Link)的解决方案,实现将软件安装在其他磁盘分区。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    macOS软件
    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    Mac软件 更多
    photoshop
    photoshop
    Windows、macOS 、 iPad

    Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

    Blender
    Blender
    Windows、macOS 和 Linux

    Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

    灵活计算器
    灵活计算器
    macOS/iOS/Android

    灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

    WINDOWS 更多
    3dmax(3ds max)
    3dmax(3ds max)
    Windows

    Autodesk 3ds Max 是一款专业的三维建模、动画与渲染软件,广泛应用于建筑可视化、游戏开发、影视动画、广告设计和产品展示等领域。

    photoshop
    photoshop
    Windows、macOS 、 iPad

    Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

    Blender
    Blender
    Windows、macOS 和 Linux

    Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。