У меня есть ситуация, когда я должен сохранить пароль, поскольку я создаю систему для подключения к другой системе. Эта другая система позволяет использовать только одну учетную запись пользователя, и единственный способ подключиться к ней — через пароль. Хэш здесь неуместен. Я должен хранить пароль таким образом, чтобы я мог его восстановить.
Теперь, зная, что это не идеальная система, я пытаюсь ограничить ущерб, если кто-то каким-то образом получит доступ к базе данных. Поскольку эту базу данных нужно будет использовать на различных платформах, я решил использовать собственные встроенные функции шифрования MySQL. Таким образом, мне не нужно беспокоиться о поиске совместимых реализаций алгоритмов шифрования/дешифрования для различных языков и систем. Я могу просто использовать функцию MySQL в запросе.
При сохранении пароля я буду использовать AES_ENCRYPT("password", "encryption key")
. Затем я понял, что мне, вероятно, следует использовать немного соли, чтобы, если они смогли получить один пароль, получить другие было бы сложнее. Но ждать! В чем смысл? Если они могут получить один пароль, у них должен быть ключ шифрования, да?
Кроме того, это блочный шифр. В некоторых ситуациях соль может быть почти бесполезной.
/* Returns 8CBAB2A9260975FF965E5A7B02E213628CBAB2A9260975FF965E5A7B02E21362FBB5D173CBAFA44DC406B69D05A2072C */
SELECT HEX(AES_ENCRYPT("passwordpasswordpasswordpassword", "encryption key"));
/* Returns 8CBAB2A9260975FF965E5A7B02E213628CBAB2A9260975FF965E5A7B02E21362C49AF8D5B194770E64FEF88767206391 */
SELECT HEX(AES_ENCRYPT("passwordpasswordpasswordpassworda", "encryption key"));
Мои вопросы
Прав ли я, думая, что нет причин использовать соль при использовании симметричного шифрования в таких ситуациях, как моя?
Учитывая, что я должен хранить пароль таким образом, чтобы получить исходное значение, есть ли какие-либо другие методы, которые мне следует рассмотреть? (Я знаю, что мне нужно быть осторожным с тем, где и как хранится ключ шифрования, и что мне также нужно защищать свои журналы MySQL.)