2013-01-21 35 views
0

我正在嘗試編寫一個簡單的Python解決方案來使用密碼安全地加密文件。我想我會使用類似bcryptpbkdf2的東西,以便隨着時間的推移,我可以使我的密碼哈希值越來越難以暴力破解。我也認爲我會使用AES來進行實際的加密,因爲這是一個非常安全的標準。我沒有固定加密密碼,但我真的很喜歡bcrypt使用多輪AES加密的bcrypt密碼?

我有一個相當困難的時間搞清楚如何實際執行加密。假設我有一個密碼和一個我想要加密的文件。我認爲我基本上需要做這樣的事情:

from Crypto.Cipher import AES 
from bcrypt import gensalt, hashpw 
from hashlib import sha256 

def encryptify(passphrase, file_name): 
    target_file = open(file_name, 'r') 

    # generate password, takes time 
    passphrase_rounds = 15 
    passphrase_salt = gensalt(rounds) 
    passphrase = sha256(hashpw(passphrase, passphrase_salt)).hexdigest() 

    # encrypt the file 
    encrypted_file = AES.new(passphrase, AES.MODE_CBC).encrypt(target_file.read()) 

在最後一步時,出現一個ValueError,告訴我,我的鑰匙必須是16,24或32字節長。我不理解的是,如果我所做的是安全的,爲什麼最後一步失敗。我認爲SHA256輸出32個字符的數據?

我特別在意使用bcrypt密碼並將其扔到sha256,這樣做是否存在潛在的安全風險?我不會想象如此,但再一次,我不是密碼學家。

回答

1

我無法評論安全性,但是如果您想要實際32字節的SHA256,則需要撥打digest而不是hexdigesthexdigest返回一個十六進制字符串表示形式(即64個字符)。

+0

太好了,但不幸的是,它現在告訴我輸入字符串的長度必須是16的倍數。 –

+0

CBC模式是一個塊,因此輸入應該是16的倍數,或者您應該爲輸入數據指定填充(通常爲PKCS#5)。 –