Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的Salt和hash密码_Python_Authentication_Hash_Passwords_Salt - Fatal编程技术网

Python中的Salt和hash密码

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

这段代码应该是用盐来散列密码。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)
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)