2013-05-02 328 views
3

我有一個小型的Python程序,將由一小部分人在本地使用(< 15人)。但對於問責制,我想在程序開始時有一個簡單的用戶名和密碼檢查(並不需要超級安全)。對於你的信息,我只是一個初學者,這是我第一次嘗試它。當我搜索時,我發現python有passlib加密。但即使在看後,我仍然不確定如何實現我的加密。所以,我想知道一些事情。密碼保護Python

  1. 我如何在本地存儲用戶密碼?我目前唯一知道的方式是創建一個文本文件並從中讀取/寫入,但這會破壞加密的全部目的,因爲人們可以打開文本文件並從中讀取文本文件。
  2. 哈希是什麼意思&加密意味着什麼,它是如何工作的? (一個簡單而簡單的解釋就可以)
  3. 實現用戶名和密碼檢查的推薦方式是什麼?

對於愚蠢的問題,我很抱歉。但如果你能回答我的問題,我將不勝感激。

+0

使用數據庫存儲用戶名和密碼。 'sqlite3'應該這樣做。 – 2013-05-02 09:26:15

+0

爲什麼/什麼是哈希和鹽:http://www.youtube.com/watch?v=FYfMZx2hy_8 – Thijs 2013-05-02 10:43:04

+1

我建議[scrypt](https://pypi.python.org/pypi/scrypt/)而不是設計你自己的哈希/鹽計劃。 – 2013-05-02 10:53:06

回答

5
import getpass 
import pickle 
import hashlib 
from os import path 

def Encryption(data): 
    return hashlib.sha224(data).hexdigest() 

## First we check if the database exists. 
if path.isfile('database.db'): 
    fh = open('database.db', 'rb') 
    db = pickle.load(fh) 
    fh.close() 
## If it doesn't, we will create one. 
else: 
    ## First we create the desired variable. 
    db = {'torxed' : Encryption('wham'), 'someoneelse' : Encryption('pass')} 
    ## Then we open a filehandle to it. 
    fh = open('database.db', 'wb') 
    ## And then we dump the variable into the filehandle. 
    ## This will keep the variable intact between sessions, 
    ## meaning the next time you start your script, the variable will look the same. 
    pickle.dump(db, fh) 
    fh.close() 


## Then we ask the user for his/hers credentials. 
user = raw_input('Username: ') 
_pass = getpass.getpass('Password: ') 

## If the user exists in the "db" and the decoded password 
## Matches the logged in user, it's a-ok :) 
if user in db and db[user] == Encryption(_pass): 
    print 'You logged in' 

添加更多的用戶

import pickle, hashlib 

def Encryption(data): 
    return hashlib.sha224(data).hexdigest() 

with open('database.db', 'rb') as fh: 
    db = pickle.load(fh) 

db['new_user'] = Encryption('password') 

with open('database.db', 'wb') as fh: 
    pickle.dump(db, fh) 

另一種方法是使用sys.argv擺脫命令行的用戶名和密碼的時候addings用戶,在這種情況下:

import pickle, hashlib, sys 
if len(sys.argv) < 3: 
    raise ValueError('Need two parameters, username and password') 

def Encryption(data): 
    return hashlib.sha224(data).hexdigest() 

with open('database.db', 'rb') as fh: 
    db = pickle.load(fh) 

db[sys.argv[1]] = Encryption(sys.argv[2]) 

with open('database.db', 'wb') as fh: 
    pickle.dump(db, fh) 
+0

我更喜歡用戶名和密碼是可以改變的。沒有硬編碼。所以,我想我需要一些方法來存儲密碼。但感謝您的幫助 – 2013-05-02 09:28:45

+0

我的編輯確實:)忘了將該部分添加到文件。 請注意,爲了完全保護您的字符串,您將需要適當的加密,但是您可以對存儲在數據中的字符串執行「base64.b64encode」,至少會使其「隱藏」一點。 此外,我假設Python2.X在這裏,'raw_input'實際上是'輸入()'在python3.x – Torxed 2013-05-02 09:28:48

+0

是的我在Windows XP上使用python 2.7。感謝您的幫助 – 2013-05-02 09:33:45

-1

你可以使用與Apache一起安裝的htpasswd或可以單獨下載。使用subprocess.check_output來運行它,你可以創建Python函數來添加用戶,刪除它們,驗證它們是否給出了正確的密碼等。通過-B選項來啓用salting,你會知道它是安全的(不像如果你實現鹽你自己)。

+0

當我們使用3:d派對軟件時,我並沒有真正看到這一點:模塊做同樣的工作? 此外,如果您需要使用check_output在您的代碼中添加主要功能,您確實需要重新設置您要執行的操作。 – Torxed 2013-05-02 16:36:21

1

你可以這樣做哈希。

import hashlib 
def Encryption(data): 
    return hashlib.sha224(data).hexdigest() 

當你想保存密碼,然後調用這個函數並保存編碼密碼。

0

你可以使用Pickle,它是一種簡單的方法將事情序列化到.pkl文件,這將很難打開和閱讀。

+0

這完全是**我的整個解決方案基於什麼? o0 – Torxed 2013-05-03 20:14:03

+0

哎呀,錯過了以後的一些要點 – Chachmu 2013-05-07 00:28:32