Я работаю над проектом, используя Pyramid 1.3 (Python 2.7) и храня данные в MySQL. У меня есть таблица адресов электронной почты, и я хотел бы зашифровать их для хранения. Я пытаюсь зашифровать их в приложении, а потом расшифрую для просмотра. Я не стремлюсь к полной безопасности, но в основном стремлюсь запутать данные в достаточной степени, если сама база данных скомпрометирована.
Я использую PyCrypto с AES и пытаюсь следить за некоторыми сообщениями здесь и некоторыми веб-учебниками, которые я нашел. Самое близкое, что я нашел, это этот пост, и кажется, это работает, по крайней мере, шифрование. Я следую этому и получаю что-то вроде "7hBAQrWhJRnL9YdBGJfRErGFwGi3aC6noGzYTrGwAoQ="
в базе данных. Но функция расшифровки продолжает выдавать ошибку:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xa1 in position 1: ordinal not in range(128)
Я наткнулся на какую-то презентацию Unicode о Python, которая помогла мне лучше понять это, но я все еще продолжаю получать ту же ошибку.
Есть ли простой учебник о том, как кодировать, сохранять в базе данных, извлекать из базы данных и декодировать строку исходных данных?
Нужна ли мне определенная сортировка в столбце базы данных? Должно ли поле быть определенного типа? До сих пор я использовал сопоставление по умолчанию и устанавливал его на VARCHAR, предполагая, что сохраняю строку. Похоже, у меня где-то проблема с кодировкой с несовместимыми типами или что-то в этом роде, но у меня голова кружится, где мне нужно что-то изменить.
Любые лучшие указатели или что-нибудь еще, что я могу предоставить? Я могу показать свой код, но в основном это копия ссылки выше... Я просто пытался получить доказательство работоспособности концепции, прежде чем слишком сильно ее модифицировать.
редактировать: некоторый образец источника... В MySQL таблица имеет вид id (int) client_id (int) emailaddress varchar (100) utf8mb4_general_ci (я играл с сопоставлениями, я понятия не имею, что это должно быть!)
Питон:
from base64 import b64encode, b64decode, urlsafe_b64decode, urlsafe_b64encode
BLOCK_SIZE = 32
INTERRUPT = u'\u0001'
PAD = u'\u0000'
def AddPadding(data, interrupt, pad, block_size):
new_data = ''.join([data, interrupt])
new_data_len = len(new_data)
remaining_len = block_size - new_data_len
to_pad_len = remaining_len % block_size
pad_string = pad * to_pad_len
return ''.join([new_data, pad_string])
def StripPadding(data, interrupt, pad):
return data.rstrip(pad).rstrip(interrupt)#data.rsplit(interrupt,1)[0]#rstrip(pad).rstrip(interrupt)
SECRET_KEY = u'a1b2c3d4e5f6g7h8a1b2c3d4e5f6g7h8'
IV = u'12345678abcdefgh'
cipher_for_encryption = AES.new(SECRET_KEY, AES.MODE_CBC, IV)
cipher_for_decryption = AES.new(SECRET_KEY, AES.MODE_CBC, IV)
def EncryptWithAES(encrypt_cipher, plaintext_data):
plaintext_padded = AddPadding(plaintext_data, INTERRUPT, PAD, BLOCK_SIZE)
encrypted = encrypt_cipher.encrypt(plaintext_padded)
return urlsafe_b64encode(encrypted)
def DecryptWithAES(decrypt_cipher, encrypted_data):
decoded_encrypted_data = urlsafe_b64decode(encrypted_data)
decrypted_data = decrypt_cipher.decrypt(decoded_encrypted_data)
return StripPadding(decrypted_data, INTERRUPT, PAD)
#encrypts it
posted_singleaddress = EncryptWithAES(cipher_for_encryption, posted_singleaddress)
#"[email protected]" inserts "Ktpr49Uzn99HZXbmqEzGKlWo9wk-XBMXGZl_iyna-8c=" into the database
clientemails — это список адресов электронной почты из таблицы выше. Я получаю сообщение об ошибке при раскомментировании:
#if clientemails:
# decrypted = DecryptWithAES(cipher_for_decryption, clientemails[0].emailaddress)
Я просто пытался декодировать первый элемент, просто чтобы попытаться заставить его работать, но это та часть, которая, кажется, сейчас подходит ....
AddPadding
иStripPadding
работают так, как вы ожидаете? Второе определение подходит, выдает ли оно исключение или просто дает вам неверные данные? Если он выдает исключение, что это за исключение, можем ли мы увидеть обратную трассировку? - person john-charles   schedule 26.05.2012