Python加密模块

5

我在查找Python模块时发现了一个叫做“crypt”的东西,但是我不明白它是什么。我尝试阅读相关资料,但我不知道“salt”是什么意思、这个crypt模块的用途是什么,以及是否有一些方法可以将“crypt”应用到这段Python代码中:

import crypt

max_attempts = 3     
attempt = 0          

try:


    while attempt < max_attempts:

        uname = input('Username: ')  
        password = input('pass: ')   

        if uname == 'admin' and password == 'Khs9':
            print('Welcome Admin')
            break
        else:
            attempt += 1
            if attempt == max_attempts:
                raise RuntimeError("\nYou've reached the maximum number of attempts allowed.")

            else:
                print('Wrong credentials.\n Try again or press <ctrl+c> to exit.\n')
                continue


except KeyboardInterrupt:
    print('Terminated by the user.\nGood-bye.')

except RuntimeError as e:
    print("Goodbye")

请查看 https://docs.python.org/2/library/crypt.html。 - Kenly
2个回答

3

现在我已经看到你的代码了,我知道密码是'Khs9',我可以登录你的账户。

你本可以在私人环境中运行以下代码。

>>> crypt.crypt('Khs9', 'aa')
'aa0GPiClW35DQ

现在,您需要将代码更新为以下内容:
import crypt

max_attempts = 3     
attempt = 0          
stored_pw_hash = 'aa0GPiClW35DQ'

try:


     while attempt < max_attempts:

        uname = input('Username: ')  
        entered_pw_hash = crypt.crypt(input('pass: '), stored_pw_hash)

        if uname == 'admin' and entered_pw_hash == stored_pw_hash:
            print('Welcome Admin')
            break
        else:
            attempt += 1
            if attempt == max_attempts:
                raise RuntimeError("\nYou've reached the maximum number of attempts allowed.")

            else:
                print('Wrong credentials.\n Try again or press <ctrl+c> to exit.\n')
                continue


except KeyboardInterrupt:
    print('Terminated by the user.\nGood-bye.')

except RuntimeError as e:
    print("Goodbye")

现在,如果您的代码被泄露,黑客不会立即获得访问权限。您应该有足够的时间意识到自己被黑客攻击了,然后更改密码。
以下是背景信息...
crypt.crypt(password)将返回password的哈希值。您存储哈希而不是明文密码。这样,您就不会因为没有密码而失去对黑客的控制。丢失哈希并不是一个大问题,因为它并不能保证访问(如果您遵循最佳实践,包括使用盐)。
下次有人提供密码时,您计算它的哈希值,将其与之前存储的哈希值进行比较,如果匹配,则知道他们给出了正确的密码。
为什么需要使用盐? 因为有人花费了很长时间来生成一张常用密码和它们的哈希值的表格。一旦完成,就可以快速检查哈希值。通过使用盐,您可以确保不同的查找表适用,其中可能没有可用的表格,并且普通黑客没有时间生成它。
crypt.crypt()需要两个字符作为盐来使用。您可以传递一个两个字符的字符串或使用函数的先前输出。(crypt.crypt()返回一个字符串,其中前两个字符是盐,其余是哈希)
我查看了https://docs.python.org/3.4/library/crypt.html来回答这个问题。

1
现在的 crypt() 函数和两个字节的 salt 已经明显不够用了,遗憾的是。 - Anti-weakpasswords

0

首先,请阅读Thomas Pornin对如何安全地哈希密码的规范答案。这将回答您关于“盐”是什么的问题。

其次,crypt是一种古老的算法 - 不要使用它。即使是基于Python SHA-512的crypt也可能不是要使用的东西,因为您无法控制迭代次数(BCrypt可能称之为工作因素),因此您不能通过增加迭代次数来使其更安全。

第三,Python自3.4以来已经内置了基于OpenSSL的快速PBKDF2

Python 2.7.8也是如此

这两个都支持在hashlib中内置的合理哈希类型!请使用这些替代品!其中一个使用这些的示例是:

import hashlib

BinaryOutput = hashlib.pbkdf2_hmac('sha512',password, salt, args.iterations, args.outputBytes)

在哪里

  • args.iterations 在十万到数十万之间

  • 假设使用 SHA-512,args.outputBytes 不超过 64(对于其他算法而言更少),不少于 20。

  • 将迭代次数以明文形式存储在您的存储中(无论是硬编码、文件还是数据库),以便稍后轻松增加它。

  • 要获取盐值,您应该生成至少 12 个随机字节,最好至少 16 个具有密码学安全性的随机字节。每个用户名都应有一个不同的盐值,并且以明文形式存储在您的存储中(无论是硬编码、文件还是数据库)。

使用 PBKDF2-HMAC-SHA-512 可以使用 64 位操作,从而减少基于 GPU 的攻击者对您的优势。

如果您担心时序攻击,可以使用各种常量时间比较之一。与高迭代 PBKDF2-HMAC-SHA-512 相比,成本几乎可以忽略不计,例如:

if hashlib.sha256(args.expectedBinary).hexdigest() == hashlib.sha256(BinaryOutput).hexdigest():

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接