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