Ответ 1
Самый простой способ скрыть ключ или значение - создать ключ/значение, имеющее '\ 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 или какой-либо другой) из информации, отправляемой от клиента, и подписывает ответ с помощью секретного ключа сервера (или сертификата сервера). Подписанный билетный сервер будет отправлен обратно клиенту. Этот билет будет играть роль лицензионного ключа.
- Сервер может добавлять дополнительную информацию в билет до подписания. Например, он может добавить информацию о дате до того, как программное обеспечение будет действительным (например, текущий день плюс один год). Таким образом, билет, который будет отправлен обратно клиенту, может содержать хэш информации активации ввода и любую дополнительную информацию, все, что вы хотите. Важно только то, что информация должна быть подписана. В общем случае вы можете включить полный запрос клиента как чистый текст в билете серверов вместо включения хеша, но использование хэша a) уменьшить размер билета и b) сделать билет немного более безопасным.
- Каждый клиент имеет открытый ключ, соответствующий закрытому ключу, используемому сервером для подписания активационного билета. Клиент сохраняет билет, полученный от сервера, во время активации в любом месте в реестре в файловой системе.
- В следующий раз, когда клиентское программное обеспечение будет запущено, программное обеспечение будет считывать сохраненный билет активации из реестра (или из файловой системы). Затем программное обеспечение собирает ту же информацию, которая используется для генерации билета активации, вычисляет хэш и сравнивает его с хешем из сохраненного билета. Он проверяет причину подписания билета в отношении открытого ключа (или в отношении сертификата сервера). Кроме того, программное обеспечение может проверять любую другую дополнительную информацию о политике из билета, например, время, пока билет не будет действительным.
Все написанное является примерно схемой только, но она очень проста и расширяема. Вам нужно только изучить, как использовать простую криптографическую операцию и внедрять ее в ваше программное обеспечение.
В качестве опции вы можете не иметь сервера в сети, но вместо этого реализовать в программном обеспечении (например, в меню) возможность генерировать запрос активации и отправлять его по электронной почте, например. Затем вы можете в автономном режиме (!!!) генерировать билет активации на основе запроса сервера и отправлять билет обратно клиенту и по электронной почте. Простой файл Reg файл, который можно импортировать с помощью двойного щелчка или какой-либо другой простой возможностью импорта в вашем программном обеспечении (вырезать и вставить в диалоговом окне активации), может привести к завершению процесса активации программного обеспечения.