Самый простой способ скрыть ключ или значение - создать ключ / значение, имеющее '\ 0' внутри имени. Вы можете сделать это с уважением к собственным функциям NtCreateKey
(см. http://msdn.microsoft.com/en-us/library/ff556468.aspx) NtSetValueKey
(см. http://msdn.microsoft.com/en-us/library/ff557688.aspx), которые используют UNICODE_STRING
в качестве параметров вместо LPCTSTR
. Вы можете прочитать больше о например, использование собственного API реестра в http://www.codeproject.com/kb/system/NtRegistry.aspx. Код Delphi вы найдете здесь http://www.delphi3000.com/articles/article_3539.asp.
ОБНОВЛЕНО : Поскольку многие читают этот вопрос, я хочу добавить несколько слов в свой ответ. Я хочу разделить часть вопроса, которую мы можем прочитать также в заголовке «лучшее место, чтобы скрыть ключ в реестре Windows» , от темы с лицензионными ключами . Поскольку я прочитал некоторые ответы (написанные до меня), которые касались почти только части лицензионных ключей, и почти не прочитал ответа на вопрос из заголовка, я написал мне ответ.
Тема с лицензионным ключом я считаю очень сложной. Это зависит от выбранной модели лицензирования. Важно, как генерировать, распространять (устанавливать) и проверять ключ. Ключ должен быть аппаратно зависимым или нет? Это может быть один на компьютер или один на группу компьютеров. Генерация ключа, установка ключа или проверка ключа может быть как с некоторыми онлайн-сервисами (также из Интернета), так и без них. Я могу продолжить ... Есть много аспектов, преимуществ и недостатков различных подходов.
Поэтому я решаю ответить только на основной вопрос из заголовка , который понятен и имеет отдельный интерес. Все остальные вопросы о лицензионном ключе следует обсудить, по моему мнению, в отдельном вопросе после снятия всех требований.
ОБНОВЛЕНО 2 на основе обновленного вопроса: мне кажется, в вашем случае было бы лучше использовать некоторый сценарий, основанный на криптографическом подписании билета активации . Например, схема может выглядеть следующим образом:
- Ваше программное обеспечение, установленное на клиентском компьютере, нуждается в активации. Перед активацией он может не работать или работать в очень ограниченной форме (например, включены только некоторые меню, необходимые для активации программного обеспечения).
- Вы пишете серверный компонент, который будет использоваться клиентом во время активации для генерации лицензионного ключа на основе запроса активации, полученного от клиента.
- Если клиент платит за программное обеспечение, вы включаете информацию о «идентификаторе компьютера» клиента (в любой форме) в базу данных на сервере.
- После запуска процесса активации из клиентского программного обеспечения (либо при запуске программы из меню, либо любым другим способом, каким вы хотите), он собирает некоторую информацию о компьютере, такую как имя компьютера («идентификатор машины»), некоторые последовательные номера или другая информация об оборудовании или операционной системе, которую нельзя изменить без новой активации. Эту информацию программа отправляет на ваш сервер (это запрос на активацию).
- Сервер проверяет, что клиент с «идентификатором машины» заплатил за программное обеспечение и еще не активирован. Затем сервер вычисляет хеш (SHA1, MD5 или какой-либо другой) из информации, отправленной клиентом, и подписывает ответ закрытым ключом сервера (или сертификатом сервера). Подписанный сервер заявок будет отправлен обратно клиенту. Этот билет будет играть роль лицензионного ключа.
- Сервер может добавить любую дополнительную информацию в тикет до подписания.Например, он может добавить информацию о дате до того, как одна программа должна быть действительной (например, текущий день плюс один год).Таким образом, билет, который будет отправлен обратно клиенту, может содержать хэш входной информации об активации и любую дополнительную информацию, все, что вы хотите.Важно только то, что информация должна быть подписана .В общем случае вы можете включить полный запрос клиента в виде простого текста в заявку сервера вместо включения хеша, но использование хеша а) уменьшает размер заявки и б) делает билет немного более безопасным.
- Каждый клиент имеет открытый ключ , соответствующий личному ключу, используемому сервером для подписания билета активации.Клиент сохраняет билет, полученный от сервера во время активации, в любом месте реестра в файловой системе.
- Каждый раз, когда клиентское программное обеспечение запускается, программное обеспечение считывает сохраненный билет активации из реестра (или из файловой системы).Затем программа собирает ту же информацию, которая используется для генерации билета активации, вычисляет хеш и сравнивает его с хешем из сохраненного билета.Он проверяет причину подписи билета в отношении открытого ключа (или в отношении сертификата сервера).Более того, программное обеспечение может проверять любую другую дополнительную информацию о политике из билета, например, до истечения срока действия билета.
Все написанное является приблизительной схемой, но она очень проста и расширяема.Вам нужно только изучить, как использовать простую криптографическую операцию и реализовать ее в своем программном обеспечении.
Как вариант, вы не можете подключить сервер к сети, а вместо этого реализовать в программном обеспечении (например, в меню) возможность для генерации запроса на активацию и отправьте его по электронной почте , например.Затем вы можете в автономном режиме (!!!) сгенерировать билет активации на основе запроса сервера и отправить билет клиенту также по электронной почте.Простой Reg-файл, который можно импортировать с помощью двойного щелчка или другой простой возможности импорта в программное обеспечение (вырезать и вставить в диалоговом окне активации), может завершить процесс активации программного обеспечения.