Что вы делаете несколько безопасным.
Я бы назвал вашу соль, но как ключ - вы генерируете хеш-ключ. Убедитесь, что вы создаете ключ с достаточной энтропией. Я бы рекомендовал силу 128 бит, сгенерированных CSPRNG.
Некоторые ключевые хэши, созданные таким образом, уязвимы для атаки длины. То есть, если злоумышленник сгенерировал токен проверки для [email protected]
, тогда они смогут обработать хэш для [email protected]
. Это связано с тем, что вывод хэш-алгоритма также предает его состояние. Чтобы уменьшить это, вы можете использовать HMAC algorithm.
Ваш текущий подход также имеет ограничение на то, что адрес электронной почты всегда имеет один и тот же токен. Если истечет срок действия адреса электронной почты (скажем, Боб Смит с электронным адресом [email protected]
уволен с работы в «Пример организации», он узнает код подтверждения, который получит следующий Боб С., когда он начнет работать в «Пример организации»). Является ли это какой-либо риск для вашего приложения, вам решать. Чтобы смягчить это, вместо этого вы можете использовать JWTs, что позволит вам указать дату истечения срока действия в токен, который может быть проверен. Алгоритм HS256 JWT также использует HMAC, также решая эту проблему.
Использование хешей с ключами должно быть эффективным и не содержать хранения, обслуживания и накладных расходов на поиск базы данных.
UID Вы имеете в виду UUID?
Remember that:
цель в [UUID] должна быть глобально уникальными, чтобы не быть неопределяемыми.
и
[UUID,] предназначены для уникальности, а не для обеспечения безопасности.
Вам будет лучше генерировать 128-разрядный токен на лету, используя безопасный источник энтропии (скажем, другой CSPRNG). Вы можете захотеть использовать эти (без соли) на стороне сервера, используя SHA-256, чтобы предотвратить любую уязвимость утечки данных от значения, которое злоумышленник может проверить на любой адрес электронной почты.
Я думаю, что каждая учетная запись пользователя должна иметь свой собственный случайный хэш. Эффективность на самом деле не вызывает беспокойства в контексте создания учетной записи, потому что это довольно редкое событие, которое не происходит часто. –