Python crypt模块

时间:2016-02-10 21:22:39

标签: python python-3.x encryption module crypt

当我发现一些名为'crypt'的东西时,我正在查看python模块。我不明白。我试过阅读这个,这个“盐”是什么,这个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")

2 个答案:

答案 0 :(得分: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(密码)将返回密码的哈希值。您存储哈希而不是明文密码。这样,您就不会丢失密码给黑客,因为您没有密码。丢失哈希不是一个大问题,因为它不保证访问(如果你遵循最佳实践,包括使用盐)。

下次有人提供密码时,你会计算它的哈希值,将它与你之前存储的哈希值进行比较,如果匹配,你就知道他们给了你正确的密码。

为什么需要使用盐? 因为有人花了很长时间来生成一个包含常用密码和哈希值的表。完成后,可以快速检查哈希值。通过使用salt,您可以确保应用不同的查找表,其中一个可能不可用,而普通黑客没有时间生成它。

crypt.crypt()需要两个字符作为salt使用。您可以将它传递给两个字符串或使用该函数的上一个输出。 (crypt.crypt()返回一个字符串,前两个字符为salt,其余为哈希值)

我看了https://docs.python.org/3.4/library/crypt.html来回答这个问题。

答案 1 :(得分:0)

首先,请阅读Thomas Pornin's canonical answer to How to securely hash passwords。这将回答您关于“盐”的问题。是

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

第三,Python as of 3.4 has fast PBKDF2 based on OpenSSL built in

Python 2.7.8也是如此。

这两个都支持hashlib内置的合理哈希类型!请改用它们!如何使用这些的一个例子是:

systemIp 192.168.1.1

status done

systemIp 192.153.1.1

status done

其中

  • args.iterations低至数十万至数万

  • args.outputBytes不超过64,假设使用SHA-512(其他算法较少),且不低于20.

  • 以明文形式存储存储中的迭代次数(无论是硬编码,文件还是数据库),以便以后轻松将其设置得更大。

  • 要获取salt,您应该生成至少12个,最好是至少16个加密随机字节。为每个用户名添加不同的盐,并将其以明文形式存储在存储中(无论是硬编码,文件还是数据库)。

使用PBKDF2-HMAC-SHA-512使用64位操作,这可以降低基于GPU的攻击者对您的优势。

如果您担心时间攻击,可以使用各种常数时间比较中的一种。与高迭代次数PBKDF2-HMAC-SHA-512相比,没有任何成本的是:

import hashlib

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