Существует два способа программной защиты ключа:
- Держите ключ в секрете, или
- Храните алгоритм в секрете.
Криптографы (и здравый смысл) скажут вам, что из двух, второй гораздо менее безопасен, потому что сравнительно легко перепроектировать код. Итак, вы остались с первым методом.
Если я правильно читаю ваши требования, вам нужен ключ, который
- Гарантируется быть уникальным для каждой машины.
- Random.
- Нигде не хранится.
- Воспроизводимый (вашим программным обеспечением).
Но невозможно удовлетворить все это. Например, действительно случайный ключ, который нигде не хранится (в виде данных или встроен в алгоритм), не может быть воспроизведен по желанию. Поэтому, если я смогу воспользоваться некоторой задержкой, я прочту ваш вариант использования и заменю эти менее строгие требования:
- Привязано к хост-машине: ключ с одного компьютера нельзя использовать на другом.
- Безопасный: вряд ли будет продублирован, угадан, перепроектирован, и т. Д. .
- Безопасный: вряд ли будет обнаружен в вашей программе.
- Воспроизводимый: ваше приложение должно быть способно восстановить ключ при необходимости.
Все эти новые требования, за исключением # 3, могут быть удовлетворены с помощью этой процедуры:
- Генерирует секретный случайный набор seed , который будет использоваться на каждой машине.
- Выберите машинно-зависимую подпись , уникальную для каждого хоста, и добавьте ее в начальное число. Классическим примером является MAC-адрес, но на машинах с двумя или более сетевыми картами вы должны быть осторожны, чтобы каждый раз использовать один и тот же сетевой адаптер!
- Хэш результат с помощью алгоритма (например, SHA ), который будет генерировать результат, который является достаточно уникальным и необратимым.
Теперь все, что осталось, - это выполнить третье требование, сделав так, что злоумышленнику будет довольно трудно угадать один секретный предмет: семя. И именно здесь процесс становится скорее религиозным аргументом, чем техническим, потому что «достаточно сложный» зависит от того, насколько сильно злоумышленник хочет найти ключ и риски, если он / она преуспеет.
Чтобы обеспечить максимальную безопасность, ключ должен храниться вне вашего приложения, например, , в вашем мозгу и предоставляться каждый раз, когда это необходимо. Но в целом приемлема некоторая форма более слабой защиты через механизм мрака ; один из моих любимых - использовать что-то вроде 0x%-6.2d
, которое, скорее всего, будет пропущено как формат printf()
. Если вы параноик, храните его по частям и воссоздайте в той части приложения, которая иначе не связана с модулями обработки ключей.
Пожалуйста, расскажите нам немного больше о вашем приложении и его случаях использования, если вам нужны более конкретные предложения.
Удачи!