2015-12-21 5 views
0

Update: Я задал новый вопрос, который дает полный пример кода: Decrypting a file to a stream and reading the stream into pandas (hdf or stata)Чтение зашифрованных файлов в панд

Моя основная проблема заключается в том, что мне нужно, чтобы сохранить данные зашифрованы, а затем прочитать в панд. Я открыт для различных решений, но шифрование должно быть AES256. На данный момент я использую PyCrypto, но это не требование.

Мое текущее решение:

  1. Расшифровать во временный файл (CSV, HDF и т.д.)
  2. Прочитайте временный файл в панд
  3. Удалите временный файл

Это далеко не идеально, потому что на жестком диске есть незашифрованный файл, и с ошибкой пользователя он может быть длиннее временного. Столь же плохо, IO существенно утроился по мере того, как не зашифрованный файл выписывается, а затем считывается в панды.

В идеале шифрование будет встроено в HDF или какой-либо другой двоичный формат, который может читать pandas, но, похоже, это не так, насколько я могу судить.

. (Примечание: это на коробке Linux, так что, возможно, есть решение сценарий оболочки, хотя я бы, наверное, предпочел, чтобы избежать этого, если все это может быть сделано внутри питона)

Второй лучший, и все еще большое улучшение, заключалось бы в дешифровке файла в память и чтении непосредственно в пандах без создания нового (незашифрованного) файла. Пока что я не смог этого сделать.

Вот несколько псевдокодов, которые, надеюсь, иллюстрируют.

# this works, but less safe and IO intensive 
decrypt_to_file('encrypted_csv', 'decrypted_csv') # outputs decrypted file to disk 
pd.read_csv('decrypted_csv') 

# this is what I want, but don't know how to make it work 
# no decrypted file is ever created 
pd.read_csv(decrypt_to_memory('encrypted_csv')) 

Так вот что я пытаюсь сделать, но также заинтересованы в других альтернатив, которые выполняют ту же самую вещь (являются эффективными и не создают временный файл).

Обновление: Возможно, прямой ответ на этот вопрос не будет прямым ответом - не слишком удивительно, но я думал, что проверю. Я думаю, что ответ будет включать в себя что-то вроде BytesIO (упомянутое DSM) или mmap (упомянутое Mad Physicist), поэтому я изучаю их. Спасибо всем, кто искренне пытался помочь здесь.

+0

Какая у вас проблема с решением «второе лучшее»? – zaph

+0

Если вы используете pycrypto, вы должны записывать дешифрованные байты в файл. Не можете ли вы просто назначить эти байты переменной и передать ее в pandas? Я не понимаю, в чем проблема. –

+0

@ArtjomB. Ну, это может быть проблема, но я не знаю, как это сделать. Вероятно, я удалю эту проблему очень скоро, поскольку, похоже, не существует какого-либо определенного для шифрования ответа, и в корне проблема может заключаться в том, что мне нужно направить вывод на переменную (память?), А не на файл, я знаю, как это сделать, но, возможно, можно выяснить ... – JohnE

ответ

2

Если вы уже используете Linux, и вы ищете «простую» альтернативу, которая не включает шифрование/дешифрование на уровне Python, вы можете использовать native file system encryption with ext4.

Такой подход может сделать ваша установка сложной, но она имеет следующие преимущества:

  • Нулевой риск утечки через временный файл.
  • Быстро, так как собственное шифрование находится в C (хотя PyCrypto также находится в C, я предполагаю, что он будет быстрее на уровне ядра).

Неудобство:

  • Вы должны научиться работать с конкретной файловой системой команд
  • Вы текущее ядро ​​Linux это два старых
  • Вы не знаете, как обновить \ может» t обновить ваше ядро ​​Linux.

Что касается написания расшифрованного файла в памяти можно использовать /dev/shm в качестве места записи, тем самым избавляя от необходимости делать сложные потоковую или верховные методы панд. Короче говоря, /dev/shm использует память (в некоторых случаях ваш tmpfs делает это тоже), и это намного быстрее, чем ваш обычный жесткий диск (info /dev/shm/).

Надеюсь, это поможет вам в некотором роде.

+0

Спасибо, наверное, не то направление, которое я собираюсь, но ценю вклад. – JohnE

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