2014-10-10 2 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.


Тем не менее, стоит отметить, что если вы используете Base 64, : никогда не будет появляться в первую очередь. Единственным символом, используемым базой 64, являются A - Z, a - z, 0 - 9, + и /. Есть несколько вариантов Base 64, и, возможно, один из них использует :, но стандартная версия, применяемая модулем base64 Python, не поддерживает.

+0

О, это так.Извините, я этого не осознавал. Недостаток сна. Благодарю. – drunkenfist

0

Хранить имя пользователя в первой строке и пароль во второй строке, в следующем

username 
p4ssw0rd 

Таким образом, вам не нужно будет делать такого рода вещи.

Хотя наилучшим решением является хранение таких вещей в базе данных.

+0

Спасибо, но мне нужно, чтобы он был в ключе: формат значения. У меня есть несколько атрибутов для каждого пользователя, и они могут быть в любом порядке. – drunkenfist

+0

Тогда я всерьез предлагаю использовать реальный формат. Это reaaallllyyyy легко с Python, например. JSON. Гораздо меньше кода, чем разбор вручную. – dom0

0

Вы можете ограничить, сколько расщепляется выполняются:

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

До тех пор, как вы знаете, что имя_поля не имеет «:» в нем, это должно работать нормально.

Смежные вопросы