59 lines
2.0 KiB
Python
59 lines
2.0 KiB
Python
import secrets
|
||
|
||
class Password:
|
||
|
||
@staticmethod
|
||
def generate(
|
||
length: int = 16,
|
||
url_safe: bool = False
|
||
) -> str:
|
||
"""
|
||
生成一个随机密码。
|
||
|
||
:param length: 密码长度,默认为 `16` 个字符。
|
||
:param url_safe: 是否生成URL安全的密码,默认为 `False` 。
|
||
:return: 生成的随机密码字符串。
|
||
"""
|
||
if url_safe:
|
||
return secrets.token_urlsafe(length)
|
||
return secrets.token_hex(length)
|
||
|
||
@staticmethod
|
||
def hash(
|
||
password: str,
|
||
) -> str:
|
||
"""
|
||
生成密码的加盐哈希值。
|
||
|
||
:return: 包含盐值和哈希值的字符串。
|
||
:rtype: str
|
||
"""
|
||
import os, hashlib, binascii
|
||
salt = hashlib.sha256(os.urandom(60)).hexdigest().encode('ascii')
|
||
pwdhash = hashlib.pbkdf2_hmac('sha256', password.encode('utf-8'), salt, 100000)
|
||
pwdhash = binascii.hexlify(pwdhash)
|
||
return (salt + pwdhash).decode('ascii')
|
||
|
||
@staticmethod
|
||
def verify(
|
||
stored_password: str,
|
||
provided_password: str,
|
||
) -> bool:
|
||
"""
|
||
验证存储的密码哈希值与用户提供的密码是否匹配。
|
||
|
||
:param stored_password: 存储的密码哈希值(包含盐值)。
|
||
:param provided_password: 用户提供的密码。
|
||
:param debug: 是否输出调试信息,将会输出原密码和哈希值。
|
||
:return: 如果密码匹配返回 `True` ,否则返回 `False` 。
|
||
"""
|
||
import hashlib, binascii
|
||
salt = stored_password[:64]
|
||
stored_password = stored_password[64:]
|
||
pwdhash = hashlib.pbkdf2_hmac('sha256',
|
||
provided_password.encode('utf-8'),
|
||
salt.encode('ascii'),
|
||
100000)
|
||
pwdhash = binascii.hexlify(pwdhash).decode('ascii')
|
||
|
||
return pwdhash == stored_password |