Я полагаю, что есть две причины, по которым была сделана эта рекомендация:
- Строки являются неизменными в Lua, поэтому нет способа перезаписать строку другими данными
как только он будет создан.
- В Lua объекты собирают мусор. Сборщик мусора работает только в определенных точках
программа и приложение не могут определить, когда будет запущен сборщик мусора после того, как больше не будет ссылок на объект. До тех пор строка пароля останется в памяти к точке 1.
См. Случай Java, который похож на Lua:
Почему char [] предпочтительнее, чем String для паролей?
Как вы можете видеть, использование char
массивов вместо строк является лучшим способом хранения паролей, поскольку массивы являются изменяемыми и могут быть повторно инициализированы до нуля, когда закончите.
Ближайшим Lua, эквивалентным массиву char
, является таблица, заполненная числами. Здесь пароль хранится в виде таблицы, а не строки, где каждый элемент в таблице состоит из целочисленного представления каждого символа. Например, "pass"
становится {0x70,0x61,0x73,0x73}
. После того, как таблица, содержащая пароль, используется для шифрования или дешифрования, она заполняется нулями до того, как она не станет доступной для программы, и в конечном итоге соберет мусор.
Согласно вашему комментарию, возможно, меня неправильно поняли. Возможно, «тест шифрования файлов» хранит пароль в виде простого текста вместе с зашифрованным файлом, что позволяет любому, имеющему доступ к файлу, даже злоумышленникам, иметь возможность тривиально его расшифровать. Приведенные выше пункты все еще применяются, хотя. Это все еще только предположение, однако; Я не могу точно знать, что вы имеете в виду, если вы не предоставите ссылку на библиотеку шифрования, которую вы упомянули.
Я взглянул на библиотеку AES, и обеспокоенность по поводу того, что пароль «легко просматривается», возникает из-за того, что пользователь вводит пароль в виде обычного текста через командную строку или терминал, чтобы запустить программу Lua, даже если вывод программы содержит только зашифрованный текст. Несколько более безопасный способ предоставления пароля - не показывать ввод (как это делается в sudo
) или маскировать ввод точками или звездами (как это делается на многих веб-страницах).
Либо это, либо приведенные выше пункты являются, пожалуй, единственным логическим объяснением.