Python中的Salt和hash密码
这段代码应该是用盐来散列密码。salt和哈希密码保存在数据库中。密码本身不是 考虑到这次行动的敏感性,我想确保一切都符合犹太标准Python中的Salt和hash密码,python,authentication,hash,passwords,salt,Python,Authentication,Hash,Passwords,Salt,这段代码应该是用盐来散列密码。salt和哈希密码保存在数据库中。密码本身不是 考虑到这次行动的敏感性,我想确保一切都符合犹太标准 import hashlib import base64 import uuid password = 'test_password' salt = base64.urlsafe_b64encode(uuid.uuid4().bytes) t_sha = hashlib.sha512() t_sha.update(password+salt) hashe
import hashlib
import base64
import uuid
password = 'test_password'
salt = base64.urlsafe_b64encode(uuid.uuid4().bytes)
t_sha = hashlib.sha512()
t_sha.update(password+salt)
hashed_password = base64.urlsafe_b64encode(t_sha.digest())
编辑:这个答案是错误的。SHA512的单次迭代速度很快,因此不适合用作密码哈希函数。请使用此处的其他答案之一
我觉得不错。然而,我很确定你实际上并不需要base64。你可以这样做:
import hashlib, uuid
salt = uuid.uuid4().hex
hashed_password = hashlib.sha512(password + salt).hexdigest()
如果不造成困难,您可以通过将salt和哈希密码存储为原始字节而不是十六进制字符串,在数据库中获得稍微更高效的存储。为此,请将hex
替换为bytes
,将hexdigest
替换为digest
,编辑:
这个答案中建议的图书馆现在已经过时了,而这个答案中提到的:是一个很好的建议,可以在今天使用
原始答案
聪明的做法不是自己编写加密,而是使用类似passlib的东西:
以安全的方式编写加密代码很容易出错。令人讨厌的是,对于非加密代码,由于程序崩溃,当它无法工作时,您常常会立即注意到它。而使用加密代码时,您通常只能在时间已晚且数据已被泄露后才能发现。因此,我认为最好使用一个由其他人编写的包,该人对该主题很了解,并且基于经过战斗测试的协议
passlib还有一些很好的特性,这些特性使它易于使用,并且在旧的密码散列协议被破坏时,也很容易升级到新的密码散列协议
此外,单轮sha512更容易受到字典攻击。sha512的设计初衷是快速,但在尝试安全地存储密码时,这实际上是一件坏事。其他人对所有这类问题都想了很久,所以您最好利用这一点。要在Python 3中工作,您需要UTF-8编码,例如:
hashed_password = hashlib.sha512(password.encode('utf-8') + salt.encode('utf-8')).hexdigest()
否则,您将得到:
回溯(最近一次呼叫最后一次):文件“”,第1行,在
hashed_password=hashlib.sha512(密码+salt).hexdigest() TypeError:在散列之前必须对Unicode对象进行编码
如果需要使用现有系统存储的哈希,则passlib似乎很有用。如果您可以控制格式,请使用bcrypt或scrypt等现代散列。此时,从python中使用bcrypt似乎要容易得多 passlib支持bcrypt,建议将py bcrypt安装为后端: 如果不想安装passlib,也可以直接使用。自述文件中有一些基本用法的例子
另请参见:基于此问题的其他答案,我使用bcrypt实现了一种新方法 为什么要使用bcrypt 如果我理解正确,在
SHA512
上使用bcrypt
的理由是bcrypt
设计得很慢bcrypt
还提供了一个选项,用于调整首次生成哈希密码时所需的速度:
# The '12' is the number that dictates the 'slowness'
bcrypt.hashpw(password, bcrypt.gensalt( 12 ))
慢是可取的,因为如果恶意方得到了包含哈希密码的表,那么对它们进行暴力攻击要困难得多
实施
笔记
我能够在linux系统中非常轻松地安装库,使用:
pip install py-bcrypt
然而,我在windows系统上安装它时遇到了更多的麻烦。它似乎需要一个补丁。查看此堆栈溢出问题:我不想恢复旧线程,但是。。。任何想要使用现代最新安全解决方案的人,请使用argon2 它在密码哈希竞赛中获胜。()比bcrypt更容易使用,比bcrypt更安全。首先导入:-
import hashlib, uuid
然后根据方法中的以下内容更改代码:
uname = request.form["uname"]
pwd=request.form["pwd"]
salt = hashlib.md5(pwd.encode())
然后在数据库sql查询中传递此salt和uname,下面的登录名是表名:
sql = "insert into login values ('"+uname+"','"+email+"','"+salt.hexdigest()+"')"
从Python 3.4开始,标准库中的
hashlib
模块包含“为安全密码哈希而设计”的函数
因此,使用其中一种,比如,使用以下方法生成的盐:
从键入导入元组
导入操作系统
导入hashlib
进口hmac
def hash_new_password(密码:str)->元组[字节,字节]:
"""
使用随机生成的salt散列提供的密码,并返回
盐和散列存储在数据库中。
"""
盐=铀氧化物(16)
pw_hash=hashlib.pbkdf2_hmac('sha256',password.encode(),salt,100000)
返盐
def是正确的密码(salt:bytes,pw\u hash:bytes,password:str)->bool:
"""
给定先前存储的salt和hash,以及用户提供的密码
尝试登录时,请检查密码是否正确。
"""
返回hmac.compare\u摘要(
嗯!,
hashlib.pbkdf2_hmac('sha256',password.encode(),salt,100000)
)
#用法示例:
salt,pw_hash=hash_new_密码('正确的马电池钉')
断言是正确的密码(salt、pw\u散列、“正确的马电池钉”)
断言密码不正确(salt、pw\u散列、“Tr0ub4dor&3”)
断言密码不正确(salt,pw_散列,'rosebud')
请注意:
- 16字节salt的使用和100000次PBKDF2迭代符合Python文档中建议的最小数量。进一步增加迭代次数将使哈希计算速度变慢,因此更安全
始终使用加密安全的随机性源os.uradom
- ,用于
,基本上只是字符串的is\u correct\u password
运算符,但没有短路功能,这使它对定时攻击免疫。但是也不痛,所以我已经用过了==
sql = "insert into login values ('"+uname+"','"+email+"','"+salt.hexdigest()+"')"
for i in range(len(rserver.keys())):
salt = uuid.uuid4().hex
print(salt)
mdp_hash = rserver.get(rserver.keys()[i])
rserver.set(rserver.keys()[i], hashlib.sha256(salt.encode() + mdp_hash.encode()).hexdigest() + salt)
rsalt.set(rserver.keys()[i], salt)