Разница между шифрованием и хэшированием
В нашем проекте есть несколько мест, где мы могли бы избежать хэширования. Например, мы храним зашифрованную ссылку между лицензией и лицензированным объектом в базе данных вместе с незашифрованной ссылкой. Это делается для того, чтобы пользователь не мог изменить объект, на который он получил лицензию, путем взлома базы данных.
Основная причина, по которой мы используем шифрование везде, в том, что у нас уже была хорошая библиотека шифрования и системный ключ. Похоже, что на самом деле не стоило тратить время на разработку библиотеки хеширования.
Есть ли какой-то риск для безопасности, который мы создаем, используя шифрование вместо хеширования?
6 ответов
Сохраняя простой текст вместе с зашифрованным текстом, вы создаете хорошее хранилище тестовых строк, если кто-то захочет узнать ваш ключ. Поскольку вы, очевидно, используете указанный ключ для шифрования всего, я бы сказал, что это риск.
Помните, что хорошая вещь о центральных базах данных в том, что когда-нибудь кто-то получит данные. Если история - какой-то урок, по крайней мере.
Если вы используете симметричный шифр, и система развернута в "враждебной" среде, то вопрос времени, прежде чем мотивированный человек сможет изолировать ключ и подписать свои (или другие) данные лицензии.
В этих случаях вам нужен ассиметричный шифр, чтобы "подписать" лицензию вашим закрытым ключом, который надежно хранится на компьютере в хранилище и не связан с внешним миром. Хорошо, небольшое преувеличение, но в безопасной обстановке.
Простой хеш не поможет в этом случае, потому что они могут использоваться для подписи поддельных лицензий. Если вы хотите быть уверены, что только вы можете утвердить изменения лицензии, то использование асимметричного шифра для шифрования лицензии (или ее хеш-кода) является наиболее простым способом.
Ну, шифрование - это двусторонний процесс. Предполагая, что вы используете шифрование на основе ключей, вы в безопасности, если ключ шифрования безопасен и вы используете современный алгоритм (скажем, AES). Хеширование, напротив, является односторонним процессом, когда практически невозможно восстановить входные данные хеш-функции из хешированного значения. Поэтому, не имея ключа, хеширование можно считать более безопасным. Это также может быть менее требовательным в вычислительном отношении.
Любые данные, которые могут быть зашифрованы, также могут быть расшифрованы.
Хеширование - это односторонний процесс, особенно если вы используете новые методы SHA2.
Из того, что я понимаю, вы хотите добиться целостности ваших данных (т.е. вы хотите добиться того, чтобы никто не мог изменить ваши данные незамеченными). Это может быть достигнуто путем использования цифровой подписи (например, RSA, DSA) или MAC (код аутентификации сообщения). Mac - это симметричный эквивалент цифровой подписи, которая обычно является асимметричной схемой.
Так что в вашем случае MAC (как, например, HMAC) должен быть хорошим выбором!
Вы представили секретность ключа как слабое место, я бы сказал, что это риск, хотя для оценки серьезности потребуется больше деталей.
Хеширование, с другой стороны, будет зависеть исключительно от сложности обнаружения коллизий, что, вероятно, является более безопасным сценарием, чем сохранение этого ключа в секрете.