Правильный способ сделать то, что вы просите, - это зашифровать-затем-аутентифицировать данные. Здесь есть некоторое уместное обсуждение: Должны ли мы MAC-затем-шифровать или encrypt-then-MAC?
Обычным способом является сначала использование стандартного шифра в стандартном режиме, например AES в режиме CBC, а затем вычисление HMAC (например, HMAC-SHA256) по тексту шифра. Есть также некоторые режимы шифрования, такие как CCM, EAX, GCM, которые будут выполнять как шифрование, так и аутентификацию.
Не используйте для этого хеш вместо HMAC.
Ключ, который вы используете для шифрования, должен быть независимым от ключа, который вы используете для аутентификации. Вы могли бы, например, генерировать оба случайно, но абсолютно не , используя функцию System.Random. Если вы развертываете в Vista SP2 или более поздней версии, вы можете использовать CryptGenRandom из Windows API, но в противном случае вам следует использовать криптографическую библиотеку с поддержкой генерации криптографических случайных чисел.
Если вы используете шифрование на основе пароля, используйте реализацию PBKDF2 для получения ключа шифрования и ключа аутентификации. Существует четыре распространенных способа обеспечить независимость двух ключей:
- Используйте два отдельных значения Соли;
- Используйте одну соль, но объедините ее с отдельными "ярлыками", например, строки 'E' и 'A' соответственно
- Сгенерируйте вдвое более длинный производный ключ и используйте одну половину как ключ шифрования, а другую половину как ключ аутентификации, или
- Пусть полученный ключ является «ключом шифрования ключа», который вы используете для шифрования случайно сгенерированных ключей шифрования и ключей аутентификации.