2014-10-10 55 views
0

我使用AES(來自PyCrypto)來加密密碼並將其存儲在文件中。該文件的格式是:從Python中的文件存儲和讀取加密的字符串

user:username 
key:<encrypted key> 

這是我用於加密的方法:

BLOCK_SIZE = .. 
PADDING = .. 
pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING 

EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s))) 
DecodeAES = lambda c, e: c.decrypt(base64.b64decode(e)).rstrip(PADDING) 
cipher = AES.new("abcdefgh12345678") 

encrypted_key = EncodeAES(cipher, 'ABC123') 

現在,我該如何從文件中讀取用於解密它的關鍵?如果我使用line.split(「:」),如果加密的密鑰本身具有「:」作爲一個字符,它會不會造成問題?

有沒有什麼辦法可以在加密時避免「:」?或者有更好的方法來存儲密鑰?我不能使用哈希,因爲我需要一些其他功能的關鍵。謝謝。

回答

2

現在,我該如何從文件中讀取密鑰進行解密?如果我使用line.split(「:」),如果加密的密鑰本身具有「:」作爲一個字符,它會不會造成問題?

當然最好,這就是爲什麼恰好split有第二個可選的參數max_split

key, value = line.split(':', 1) 

或者,你可以使用partition

key, _, value = line.partition(':') 

兩者之間的區別是當沒有冒號時會發生什麼;前者會返回一個元素,給你一個ValueError試圖將其解壓縮爲兩個變量,而後者只會給你一個空的value


然而,值得注意的是,如果你使用的基地64,:永遠不會出現在第一的位置。 Base 64使用的唯一字符是A-Z,a-z, 0-9,+/。有一些Base 64變體,也許其中一個使用:,但Python的base64模塊應用的標準版本沒有。

+0

哦,沒錯。對不起,我沒有意識到這一點。睡眠不足。謝謝。 – drunkenfist 2014-10-10 19:27:28

0

存儲的用戶名在第二行的第一行和密碼,如以下

username 
p4ssw0rd 

這樣你就不需要做這樣的事情。

儘管最好的解決方案是將這些東西存儲在數據庫中。

+0

謝謝,但我需要它在鍵:值格式。我爲每個用戶提供了多個屬性,並且它們可以按任意順序排列。 – drunkenfist 2014-10-10 19:23:22

+0

然後我認真地建議使用真正的格式。 Python的使用很簡單,例如JSON。比手動解析東西少得多的代碼。 – dom0 2014-10-10 19:28:23

0

可以限制多少分割執行:

>>> line="key:foo:bar:baz" 
>>> line.split(":", 1) 
['key', 'foo:bar:baz'] 

只要你知道字段名沒有「:」看來,這應該能正常運行。

相關問題