Строго глядя на более безопасный:
Salt, HMAC, or both?
Оба будут более безопасными. Так как ключ к HMAC можно считать солью, выполнение обоих будет немного излишним, но все же более безопасным, потому что для взлома потребуется больше работы.
How much salt?
Каждый кусочек соли удвоил бы комбинации, которые нужно было бы сохранить в радужном столе, чтобы легко взломать пароль. Но поскольку существует только один пароль и только одна соль, больше может не потребоваться. HMAC использует размер блока базового хэша для размера ключа, 1024 бита для SHA512. Размер блока должен быть достаточно хорошим для соли, но удвоение или утроение его значительно усложнит взлом пароля с помощью радуги.
How many iterations?
Чем больше, тем лучше. Конечно, больше итераций означает, что потребуется больше времени, чтобы определить, был ли введен правильный пароль, но компьютеры работают быстро, и пользователи не будут возражать подождать несколько секунд при проверке пароля. Выполнение большего количества итераций будет означать, что кто-то, взломавший пароль, должен будет выполнить больше итераций.
What encoding? (The password is plain ASCII)
Можно также зашифровать (с помощью AES) сверх-итеративный, сверхзащищенный, сверхзащищенный пароль HMAC вместе с его солью только для того, чтобы сделать его сложнее. Создайте пароль для хэша и ключа зашифрованного пароля, представляйте собой комбинацию строк, которые должны появляться в исполняемом файле, например «RNGCryptoServiceProvider» или «System.Security.Cryptography». И при кодировании мы могли бы также преобразовать его в шестнадцатеричное или base64, или, что еще лучше, в base-36 или в другое, менее ожидаемое преобразование.
Примечание: Это было написано в основном в шутку, но все же должно содержать некоторую правду.