通过与 Jira 对比,让您更全面了解 PingCode

  • 首页
  • 需求与产品管理
  • 项目管理
  • 测试与缺陷管理
  • 知识管理
  • 效能度量
        • 更多产品

          客户为中心的产品管理工具

          专业的软件研发项目管理工具

          简单易用的团队知识库管理

          可量化的研发效能度量工具

          测试用例维护与计划执行

          以团队为中心的协作沟通

          研发工作流自动化工具

          账号认证与安全管理工具

          Why PingCode
          为什么选择 PingCode ?

          6000+企业信赖之选,为研发团队降本增效

        • 行业解决方案
          先进制造(即将上线)
        • 解决方案1
        • 解决方案2
  • Jira替代方案

25人以下免费

目录

python如何制作密码模块

python如何制作密码模块

制作密码模块的方法有很多种,主要包括:使用内置库如hashlib进行哈希加密、使用内置库cryptography进行对称和非对称加密、利用bcrypt进行密码哈希与验证。 在这些方法中,cryptography库提供了最全面的加密和解密功能,它支持对称加密(如AES)、非对称加密(如RSA)以及哈希函数。在这篇文章中,我们将详细介绍如何使用这些方法来制作密码模块,并且会重点介绍cryptography库的使用。

一、使用hashlib进行哈希加密

hashlib 是 Python 标准库中的一个模块,提供了常见的哈希算法如 SHA-1、SHA-256、MD5 等。哈希函数是一种不可逆的加密方式,通常用于存储密码的哈希值而不是明文密码。

1、生成哈希

import hashlib

def hash_password(password: str) -> str:

# 使用 SHA-256 算法生成密码哈希

hashed_password = hashlib.sha256(password.encode()).hexdigest()

return hashed_password

2、验证密码

def verify_password(stored_password: str, provided_password: str) -> bool:

# 生成提供的密码的哈希值,并与存储的哈希值进行比较

return stored_password == hash_password(provided_password)

二、使用cryptography进行对称和非对称加密

cryptography 是一个功能强大的第三方库,支持多种加密算法。它可以用于对称加密(例如 AES)和非对称加密(例如 RSA)。

1、对称加密(AES)

对称加密使用相同的密钥进行加密和解密。AES 是一种常见的对称加密算法。

from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes

from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC

from cryptography.hazmat.primitives import hashes

from cryptography.hazmat.backends import default_backend

import os

def generate_key(password: str, salt: bytes) -> bytes:

kdf = PBKDF2HMAC(

algorithm=hashes.SHA256(),

length=32,

salt=salt,

iterations=100000,

backend=default_backend()

)

key = kdf.derive(password.encode())

return key

def encrypt_message(message: str, password: str) -> (bytes, bytes, bytes):

salt = os.urandom(16)

key = generate_key(password, salt)

iv = os.urandom(16)

cipher = Cipher(algorithms.AES(key), modes.CFB(iv), backend=default_backend())

encryptor = cipher.encryptor()

encrypted_message = encryptor.update(message.encode()) + encryptor.finalize()

return encrypted_message, salt, iv

def decrypt_message(encrypted_message: bytes, password: str, salt: bytes, iv: bytes) -> str:

key = generate_key(password, salt)

cipher = Cipher(algorithms.AES(key), modes.CFB(iv), backend=default_backend())

decryptor = cipher.decryptor()

decrypted_message = decryptor.update(encrypted_message) + decryptor.finalize()

return decrypted_message.decode()

2、非对称加密(RSA)

非对称加密使用一对密钥——公钥和私钥。公钥用于加密,私钥用于解密。

from cryptography.hazmat.primitives.asymmetric import rsa, padding

from cryptography.hazmat.primitives import serialization, hashes

def generate_rsa_keys():

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 encrypt_message_rsa(message: str, public_key) -> bytes:

encrypted_message = public_key.encrypt(

message.encode(),

padding.OAEP(

mgf=padding.MGF1(algorithm=hashes.SHA256()),

algorithm=hashes.SHA256(),

label=None

)

)

return encrypted_message

def decrypt_message_rsa(encrypted_message: bytes, private_key) -> str:

decrypted_message = private_key.decrypt(

encrypted_message,

padding.OAEP(

mgf=padding.MGF1(algorithm=hashes.SHA256()),

algorithm=hashes.SHA256(),

label=None

)

)

return decrypted_message.decode()

三、使用bcrypt进行密码哈希与验证

bcrypt 是一个流行的密码哈希算法,专门设计用于保护密码。它的特点是计算速度较慢,从而使暴力破解更加困难。

1、生成哈希

import bcrypt

def hash_password_bcrypt(password: str) -> bytes:

# 生成盐并使用 bcrypt 生成密码哈希

salt = bcrypt.gensalt()

hashed_password = bcrypt.hashpw(password.encode(), salt)

return hashed_password

2、验证密码

def verify_password_bcrypt(stored_password: bytes, provided_password: str) -> bool:

# 使用 bcrypt 验证提供的密码

return bcrypt.checkpw(provided_password.encode(), stored_password)

四、密码模块的综合实现

在实际应用中,我们可以将上述方法结合起来,创建一个完整的密码模块。以下是一个示例,实现了哈希加密、对称加密、非对称加密和密码验证功能。

import hashlib

import os

import bcrypt

from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes

from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC

from cryptography.hazmat.primitives import hashes, serialization

from cryptography.hazmat.primitives.asymmetric import rsa, padding

from cryptography.hazmat.backends import default_backend

class PasswordModule:

def __init__(self, password: str):

self.password = password

def hash_password(self) -> str:

hashed_password = hashlib.sha256(self.password.encode()).hexdigest()

return hashed_password

def verify_password(self, stored_password: str) -> bool:

return stored_password == self.hash_password()

def generate_aes_key(self, salt: bytes) -> bytes:

kdf = PBKDF2HMAC(

algorithm=hashes.SHA256(),

length=32,

salt=salt,

iterations=100000,

backend=default_backend()

)

key = kdf.derive(self.password.encode())

return key

def encrypt_message_aes(self, message: str) -> (bytes, bytes, bytes):

salt = os.urandom(16)

key = self.generate_aes_key(salt)

iv = os.urandom(16)

cipher = Cipher(algorithms.AES(key), modes.CFB(iv), backend=default_backend())

encryptor = cipher.encryptor()

encrypted_message = encryptor.update(message.encode()) + encryptor.finalize()

return encrypted_message, salt, iv

def decrypt_message_aes(self, encrypted_message: bytes, salt: bytes, iv: bytes) -> str:

key = self.generate_aes_key(salt)

cipher = Cipher(algorithms.AES(key), modes.CFB(iv), backend=default_backend())

decryptor = cipher.decryptor()

decrypted_message = decryptor.update(encrypted_message) + decryptor.finalize()

return decrypted_message.decode()

def generate_rsa_keys(self):

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 encrypt_message_rsa(self, message: str, public_key) -> bytes:

encrypted_message = public_key.encrypt(

message.encode(),

padding.OAEP(

mgf=padding.MGF1(algorithm=hashes.SHA256()),

algorithm=hashes.SHA256(),

label=None

)

)

return encrypted_message

def decrypt_message_rsa(self, encrypted_message: bytes, private_key) -> str:

decrypted_message = private_key.decrypt(

encrypted_message,

padding.OAEP(

mgf=padding.MGF1(algorithm=hashes.SHA256()),

algorithm=hashes.SHA256(),

label=None

)

)

return decrypted_message.decode()

def hash_password_bcrypt(self) -> bytes:

salt = bcrypt.gensalt()

hashed_password = bcrypt.hashpw(self.password.encode(), salt)

return hashed_password

def verify_password_bcrypt(self, stored_password: bytes) -> bool:

return bcrypt.checkpw(self.password.encode(), stored_password)

五、总结

制作一个密码模块涉及多个方面的知识,包括哈希函数、对称加密、非对称加密等。使用hashlib可以轻松生成和验证密码的哈希值,cryptography库提供了强大的对称和非对称加密功能,而bcrypt则专门用于安全的密码哈希。通过结合这些方法,我们可以创建一个功能全面的密码模块来满足不同的安全需求。无论是存储密码、加密消息,还是验证用户身份,这些方法都提供了可靠的解决方案。

相关问答FAQs:

如何在Python中生成强密码?
在Python中生成强密码可以使用secrets模块,该模块提供了生成随机数的功能,适合生成密码。可以通过组合字母、数字和符号来确保密码的复杂性。例如,使用secrets.choice()从多个字符集中随机选择字符并组合成密码。示例代码如下:

import secrets
import string

def generate_password(length=12):
    characters = string.ascii_letters + string.digits + string.punctuation
    password = ''.join(secrets.choice(characters) for _ in range(length))
    return password

print(generate_password(16))

如何在Python中验证用户输入的密码强度?
密码强度验证可以通过检查密码的长度、包含的字符类型(字母、数字、特殊字符)等条件来实现。可以编写一个函数,该函数返回密码强度评价,帮助用户创建更安全的密码。示例代码如下:

def check_password_strength(password):
    if len(password) < 8:
        return "密码太短,建议至少8个字符"
    if not any(c.isdigit() for c in password):
        return "密码应包含数字"
    if not any(c.islower() for c in password):
        return "密码应包含小写字母"
    if not any(c.isupper() for c in password):
        return "密码应包含大写字母"
    if not any(c in string.punctuation for c in password):
        return "密码应包含特殊字符"
    return "密码强度合格"

print(check_password_strength("Abc@1234"))

如何在Python中安全存储密码?
存储密码时,重要的是不要以明文形式存储。可以使用hashlib库来对密码进行加密,使用如SHA-256的哈希算法。为了增加安全性,建议使用随机生成的盐值(salt)来增强密码的安全性。示例代码如下:

import hashlib
import os

def hash_password(password):
    salt = os.urandom(16)  # 生成16字节的盐
    hashed_password = hashlib.pbkdf2_hmac('sha256', password.encode(), salt, 100000)
    return salt + hashed_password  # 存储盐和哈希值

stored_password = hash_password("my_secure_password")
print(stored_password)

这些方法能够帮助开发者在Python中创建和管理密码模块,确保密码的安全性与强度。

相关文章