Python 3密码scrypt

时间:2016-01-22 15:09:46

标签: python

您好我正在寻找一些协助为python 3制作我的密码脚本。我对该程序有基本的了解,但python是我的一种新语言。我正在尝试为我的朋友和我制作的辅助移动套装制作AI,包括旧的自行车零件,如齿轮和链条,直流电机,以及许多金属条...对于我们使用的重型物品arduino但是我的朋友负责那个部分..我已经参与了AI但是在我继续前进之前我想知道是否有人可以帮助我制作密码。我实际上使用的是覆盆子pi,因为我知道如何操作GPIO(或通用输入输出。我尝试过使用类似的东西:

The_man113 = 'Password correct'
else:
     print'passcode incorrect'

这是一个不好的例子,我知道不会工作,但有人可以给我一些建议。我知道如何使用诸如制作计算器之类的东西,或者只是通过在后台添加一些数字来制作像它一样的东西,但是这个真的让我感到难过。我感谢任何帮助我的人。谢谢

2 个答案:

答案 0 :(得分:2)

好吧,如果目标只是验证单个密码(没有密码数据库),但您不想将该密码存储在脚本中(任何能够读取该文件的人都能看到它),那么你可以使用散列。首先,决定一个密码,然后生成一个salt和hash(传递hash方法隐式生成一个合适的salt):

>>> import crypt
>>> password = input("Enter password:")
>>> print(crypt.crypt(password, crypt.METHOD_SHA512)) # Save this to add to verifier

我们使用input而不是直接在终端中初始化变量,因为从3.4开始,Python交互式终端默认保存历史记录,而我们不想在Python历史记录中输入密码。我们将接受在世代时间肩上冲浪的风险,以换取知道你没有输入错字(在使用时,我们将getpass.getpass用来陪衬肩膀冲浪者。) / p>

现在在您的验证码中:

import crypt
import getpass

PASSHASH = '...'  # Hash from generation stage

# Loop until correct password given or user hits Ctrl-C to kill program
# crypt.crypt hashes include their salt, and can be used to salt another crypt
while crypt.crypt(getpass.getpass(), PASSHASH) != PASSHASH:
    pass

# If we get here, the password was correct
print("Password accepted")

此设计意味着可以查看源代码的用户无法看到密码;只要他们无法覆盖该文件,他们就无法更改密码。

使用getpass.getpass代替input,您还可以避免在输入密码时回显密码,从而最大限度地降低肩上冲浪者查看密码的风险。

注意:此代码需要Python 3.3或更高版本; crypt module之前的安全密码哈希没有用,因为它使用crypt(3),一个已知的弱密码哈希系统。

答案 1 :(得分:0)

通常的方法是使用单向加密哈希函数,例如:sha-256。

来自wikipedia

  

加密散列函数是考虑的散列函数   实际上不可能反转,即重新创建输入数据   仅从哈希值开始。

Python有一个内置库:hashlib

您必须在代码中存储以前的哈希密码:

secure_hash = hashlib.sha256("This is the original password that will be hashed").hexdigest()

此代码将输出:

759deb001f7fc1fceea917efd3b3dc7628f3b67633c7b77a2b77a7c3afa736a8

您将在脚本中存储此哈希字符串,然后当用户“登录”时,您使用用户密码执行相同的操作并进行比较:

password_hash = hashlib.sha256("Incorrect password from the user").hexdigest()

然后比较:

if secure_hash != password_hash:
    print("Incorrect password")
    ...

虽然有一些警告...... 一种方式加密函数并不完美,两个不同的字符串具有相同散列的可能性非常小,这个机会非常小,但它存在。

注意: 如果在使用hashlib时遇到TypeError,则必须将字符串编码为utf-8:

secure_hash = hashlib.sha256("This is the original password that will be hashed".encode("utf-8")).hexdigest()

并且......你必须存储用于在脚本中创建secure_hash的字符串。