2016-01-22 97 views
-4

你好,我正在尋找一些幫助,使我的密碼腳本python 3.我有一個程序的基本瞭解,但python是一種新的語言對我來說。我正在嘗試爲我的朋友和我建立的輔助移動服裝做一個AI,包括舊的自行車零件,如齒輪和鏈條,直流電動機,以及很多很多的金屬棒......對於我們使用的重型物品arduino但我的朋友負責這一部分..我已經在AI上工作,但在我走之前,我想知道是否有人可以幫我做一個通行代碼腳本。 。Python 3密碼scrypt

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

這是一個壞榜樣,我知道不會工作,但有人可以:其實我用樹莓派,因爲我知道如何操作GPIO(或通用輸入輸出我已經使用像試過給我一些建議,我知道如何使用諸如製作計算器之類的東西,或者通過在背景中添加一些數字來使事情變得像知道所有事情一樣,但是這真的讓我難以接受,謝謝

+4

'if raw_input(「Enter password:」)!=「hunter2」:print「access denied」'。 – Kevin

+4

(oops,即2.7。使用'input'代替Python 3的'raw_input',並正確地加上你的'print'調用) – Kevin

回答

2

那麼,如果目標只是驗證一個密碼(沒有密碼DB),但你不想在腳本中存儲該密碼(任何人都可以閱讀該文件可以看到它),你可以使用首先,決定一個密碼,然後生成鹽和散列(通過散列法產生適當的鹽隱式地):

>>> 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來遮擋肩膀衝浪者)。

現在,在您的驗證碼:

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(3)(一種已知的弱密碼哈希系統),所以crypt module在此之前對於安全密碼哈希來說並不好。

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有一個類型錯誤,則必須將字符串編碼爲UTF-8:

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

而且......你一定存儲字符串使用創建您腳本中的secure_hash。

+0

Unsalted密碼哈希值受到預先計算的表攻擊。簡單哈希,即使是密碼哈希,也不足以防止哈希顛倒。 Python提供'crypt'和'hashlib.pbkdf2_hmac'是有原因的。 – ShadowRanger

+0

我會同意,如果我們在談論互聯網連接的設備,因爲我們正在談論某種類型的輔助硬件,如輪椅,除非黑客通過USB端口在物理上破解硬件,我不認爲有必要額外的措施。 – Nazerbayev