문제

C# 애플리케이션용 제품 키를 어떻게 만들 수 있나요?

매년 업데이트하는 제품(또는 라이센스) 키를 생성해야 합니다.또한 평가판용 버전을 만들어야 합니다.

관련된:

도움이 되었습니까?

해결책

애플리케이션에 인증하려는 데이터가 포함된 레코드를 생성하는 등의 작업을 수행할 수 있습니다.여기에는 원하는 모든 것이 포함될 수 있습니다.활성화할 프로그램 기능, 만료 날짜, 사용자 이름(사용자에게 바인딩하려는 경우).그런 다음 고정 키가 있는 일부 암호화 알고리즘을 사용하여 암호화하거나 해시합니다.그런 다음 프로그램 내에서 이를 확인하면 됩니다.Windows에서 라이센스 파일을 배포하는 한 가지 방법은 레지스트리를 업데이트하는 파일로 제공하는 것입니다(사용자가 입력해야 하는 시간을 절약함).

하지만 보안에 대한 잘못된 인식을 조심하세요. 조만간 누군가 프로그램을 패치하여 해당 검사를 건너뛰고 패치된 버전을 배포할 것입니다.또는 모든 검사를 통과하는 키를 만들어 배포하거나 시계 날짜를 소급하는 등의 작업을 수행합니다.계획을 얼마나 복잡하게 만드는지는 중요하지 않습니다. 이를 위해 수행하는 모든 작업은 궁극적으로 모호함을 통한 보안이 될 것이며 항상 이를 수행할 수 있습니다.그렇게 할 수 없더라도 누군가는 해킹된 버전을 배포할 것입니다.동글을 제공하는 경우에도 마찬가지입니다. 누군가가 원할 경우 그에 대한 수표도 패치할 수 있습니다.코드에 디지털 서명을 해도 도움이 되지 않습니다. 서명을 제거하거나 취소할 수 있습니다.

디버거 등에서 프로그램이 실행되는 것을 방지하는 기술을 사용하면 문제를 조금 복잡하게 만들 수 있지만 이것조차도 완벽한 것은 아닙니다.따라서 정직한 사용자가 지불하는 것을 잊지 않을 만큼 어렵게 만들어야 합니다.또한 귀하의 계획이 유료 사용자에게 방해가 되지 않도록 매우 주의하십시오. 유료 고객이 지불한 것을 사용할 수 없게 되는 것보다 일부 복사본을 복사하는 것이 더 낫습니다.

또 다른 옵션은 온라인 확인을 하는 것입니다. 사용자에게 고유 ID를 제공하고 해당 ID가 어떤 기능을 가져야 하는지 온라인으로 확인하고 일정 기간 동안 캐시하면 됩니다.하지만 동일한 주의 사항이 적용됩니다. 사람들은 이와 같은 문제를 겪을 수 있습니다.

키 등을 잊어버린 사용자를 처리하는 데 드는 지원 비용도 고려하세요.

편집하다:덧붙이고 싶은 것은 이것에 너무 많은 시간을 투자하지 말고 어떻게든 당신의 복잡한 계획이 다르고 깨지지 않을 것이라고 생각하지 말라는 것입니다.사람들이 프로그램이 실행되는 하드웨어와 OS를 제어하는 ​​한 그럴 수 없으며 그럴 수도 없습니다.개발자들은 이를 위해 자신만의 시스템을 개발하면 해당 시스템이 자신에게만 알려지고 따라서 '더 안전'해질 것이라고 생각하면서 더욱 복잡한 계획을 고안하려고 노력해 왔습니다.그러나 이는 실제로 영구 운동 기계를 구축하려는 프로그래밍과 동일합니다.:-)

다른 팁

당신은 누구를 신뢰합니까?

나는 항상이 영역이 응용 프로그램의 런타임 보안을 관리하기 위해 제 3자를 신뢰하기에는 너무 중요하다고 생각했습니다. 하나의 응용 프로그램에 대해 해당 구성 요소가 갈라지면 모든 응용 프로그램에 대해 금이가됩니다. 그것은 일어났다 신중합니다 5 분 안에 그들은 타사 라이센스 솔루션을 사용하여 3ds Max 몇 년 전 ... 좋은 시간!

진지하게, 알고리즘을 완전히 제어 할 수 있도록 자신만의 롤을 고려하십시오. 그렇게한다면, 라인을 따라 키에 구성 요소를 사용하는 것을 고려하십시오.

  • 라이센스 이름 - 라이센스가있는 클라이언트 이름 (있는 경우). 회사 배포 관리에 유용합니다 - 제공하는 라이센스 정보에 "개인화 된"이름을 갖는 것이 특별하다고 느끼게합니다.
  • 라이센스 만료 날짜
  • 동일한 라이센스에 따라 실행할 사용자 수입니다. 이것은 당신이 사이트에서 실행중인 인스턴스를 서버-디스크 방식으로 추적하는 방법이 있다고 가정합니다.
  • 기능 코드 - 여러 기능 및 여러 제품에서 동일한 라이센스 시스템을 사용할 수 있습니다. 물론 하나의 제품에 금이 가면 모두가 금이 간다.

그런 다음 지옥에서 체크섬을 벗고 원하는 (가역 가능한) 암호화를 추가하여 갈라지기가 더 어려워집니다.

평가판 라이센스 키를 만들려면 단순히 "시험 모드"로 변환되는 위의 값에 대한 값을 설정하십시오.

그리고 이것은 아마도 당신의 응용 프로그램/회사에서 가장 중요한 코드 일 것입니다. 오버러스 화 대신, 해독 루틴을 기본 DLL 파일에 넣는 것을 고려하십시오. p/호출 그것에.

내가 근무한 몇몇 회사들은이를 위해 일반화 된 접근 방식을 채택하여 큰 성공을 거두었습니다. 아니면 제품이 갈라질 가치가 없었을 수도 있습니다.)

Windows 제품 키와 같이 입력 할 수있는 키에 대해 묻는 경우 일부 점검을 기반으로합니다. 페이스트를 복사 해야하는 키에 대해 이야기하는 경우 디지털 서명 (개인 키 암호화)을 기반으로합니다.

간단한 제품 키 논리는 제품 키가 4 개의 5 자리 그룹으로 구성되어 있다고 말하는 것입니다. abcde-fghij-kljmo-pqrst, 그런 다음 계속해서 F+K+P와 같은 내부 관계를 지정하려면 A와 동일해야합니다. 즉, 2, 3 및 4 그룹의 첫 번째 자리는 총계입니다. 이것은 8xxxx-2xxxx-4xxxx-2xxxx가 유효하므로 8xxxx-1xxxx-0xxxx-7xxxx를 의미합니다. 물론, 첫 번째 그룹의 두 번째 숫자가 이상하다면 마지막 그룹의 마지막 숫자도 이상해야합니다. 이러한 방식으로 제품 키를위한 생성기가 있으며 제품 키를 확인하면 모든 규칙과 일치하는지 확인합니다.

암호화는 일반적으로 개인 키 (== 디지털 서명)를 사용하여 암호화 된 라이센스에 대한 일련의 정보입니다. 베이스 64. 공개 키는 응용 프로그램과 함께 배포됩니다. Base64 문자열이 도착하면 공개 키에 의해 확인 (== 암호 해독)이 확인되며 유효한 경우 제품이 활성화됩니다.

그것이 사소하거나 깨지기 어려운지에 관계없이 그것이 실제로 많은 차이를 만들어 낸다고 확신하지 못합니다.

앱이 갈라질 가능성은 제품 키 처리의 강점보다는 유용성에 훨씬 더 비례합니다.

개인적으로, 나는 두 가지 클래스의 사용자가 있다고 생각합니다. 지불하는 사람들. 그렇지 않은 사람들. 가장 사소한 보호를 받으면 그렇게 할 것입니다. 균열을 기다리지 않거나 다른 곳을 바라 보는 사람들. 어느 쪽이든, 그것은 더 이상 돈을 얻지 못할 것입니다.

나는 내가 다소 미쳤다는 것을 인정해야한다.

  1. CPU 병목 현상을 찾아서 a로 추출하십시오 p/호출 가능 DLL 파일.
  2. 게시물 빌드 조치로서 DLL 파일의 일부를 XOR 암호화 키로 암호화하십시오.
  3. 공개/개인 키 구성표 선택, DLL 파일에 공개 키 포함
  4. 제품 키를 해독하고 두 반쪽을 함께 Xoring하면 DLL의 암호화 키가 발생하도록 배열하십시오.
  5. dll의 dllmain 코드에서 보호 (page_execute_readwrite)를 비활성화하고 키로 해독합니다.
  6. 라이센스 키 및 매개 변수를 정신적으로 점검 한 다음 LicenSeckeck () 메소드를 작성한 다음 전체 DLL 파일을 확인하여 라이센스 위반을 던지십시오. 아, 그리고 여기서 다른 초기화를하십시오.

그들이 Licensecheck을 찾고 제거하면 DLL이 시작될 때 어떤 재미가 따라갈 것인지 세분화 결함.

옵션이 있습니다 Microsoft 소프트웨어 라이센스 및 보호 (SLP) 서비스도 있습니다. 그것에 대해 읽은 후에 나는 그것을 사용할 수 있기를 정말로 원합니다.

라이센스를 기반으로 코드의 일부를 차단한다는 아이디어가 정말 마음에 듭니다. 뜨거운 물건, .NET에 가장 안전합니다. 당신이 그것을 사용하지 않더라도 흥미로운 읽기!

Microsoft® Software Licensing and Protection (SLP) 서비스는 독립적 인 소프트웨어 공급 업체 (ISVS)가 고객에게 유연한 라이센스 용어를 채택 할 수있는 소프트웨어 활성화 서비스입니다. Microsoft SLP Services는 애플리케이션 및 라이센스 정보를 보호하는 데 도움이되는 고유 한 보호 방법을 사용하여 고객 규정 준수를 늘리면서 더 빠르게 시장에 출시 할 수 있습니다.

참고 : 이것은 민감한 코드 (예 : 귀중한 알고리즘)로 제품을 출시하는 유일한 방법입니다.

일련 번호를 작성하고 확인하기 위해 간단한 솔루션을 원한다면 시도하십시오. 타원. 타원 곡선 암호화를 사용하고 "만료 날짜"기능이 있으므로 평가판 베리슨 또는 시간 제한 등록 키를 만들 수 있습니다.

제품 키 및 활성화를위한 또 다른 좋은 저렴한 도구는 InstallKey라는 제품입니다. 보세요 www.lomacons.com

간단한 방법 중 하나는 사용하는 것입니다 전 세계적으로 고유 한 식별자 (안내서). 안내는 일반적으로 128 비트 값으로 저장되며 일반적으로 하이픈으로 분리 된 그룹과 함께 32 개의 16 진수 숫자로 표시됩니다. {21EC2020-3AEA-4069-A2DD-08002B30309D}.

c#에서 다음 코드를 사용하십시오 System.Guid.NewGuid().

getKey = System.Guid.NewGuid().ToString().Substring(0, 8).ToUpper(); //Will generate a random 8 digit hexadecimal string.

_key = Convert.ToString(Regex.Replace(getKey, ".{4}", "$0/")); // And use this to separate every four digits with a "/".

도움이되기를 바랍니다.

트릭은 당신만이 알고있는 알고리즘을 갖는 것입니다 (다른 쪽 끝에서 해독 될 수 있음).

"소수를 선택하고 마법 번호를 추가"와 같은 간단한 것들이 있습니다.

이진 데이터 세트의 비대칭 암호화 (고유 식별자, 버전 번호 등을 포함 할 수 있음)의 비대칭 암호화 사용과 같은보다 복잡한 옵션은 암호화 된 데이터를 키로 배포합니다.

응답을 읽을 가치가있을 수도 있습니다 이 질문 또한

몇 가지 도구와 API가 있습니다. 그러나 나는 당신이 당신이 무료로 찾을 것이라고 생각하지 않습니다;)

예를 들어 olicense 스위트가 있습니다.http://www.olicense.de/index.php?lang=en

당신은 확인할 수 있습니다 라이센스 스팟. 그것은 제공합니다 :

  • 무료 라이센스 구성 요소
  • 온라인 활성화
  • API는 앱과 온라인 상점을 통합합니다
  • 일련 번호 생성
  • 취소 라이센스
  • 구독 관리

나는 @Frankodwyer의 위대한 답변에서 약간의 피기 백을 가고 온라인 기반 라이센스에 대해 조금 더 깊이 파고들 것입니다. 나는 창립자입니다 keygen, 개발자를 위해 구축 된 라이센스 REST API.

응용 프로그램에 대한 2 개의 "유형"라이센스, 즉 "정식 버전"및 "시험판"을 원한다고 언급 했으므로이를 단순화하고 사용할 수 있습니다. 기능 라이센스 모델 응용 프로그램의 특정 기능을 라이센스하는 경우 (이 경우 "전체"기능 세트 및 "시험"기능 세트가 있습니다).

시작하기 위해 2를 만들 수 있습니다 라이센스 유형 (라고 불리는 정책 KeyGen) 및 사용자가 계정을 등록 할 때마다 "시험"라이센스를 시작할 수 있습니다 ( "시험"라이센스 구현 "시험"기능 정책), 앱 내에서 다양한 검사를 수행하는 데 사용할 수있는 예를 들어 사용자 사용이 가능합니다. 시험-기능- 그리고 시험 혈관 -B.

그리고 사용자가있을 때마다 그에 대한 구축 앱을 구매합니다 (PayPal, Stripe 등을 사용하든) "전체"기능 정책을 구현하는 라이센스를 생성하고 사용자와 연결할 수 있습니다. 계정. 이제 앱 내에서 사용자에게 "전체"라이센스가 있는지 확인할 수 있습니다. Pro-Feature-X 그리고 프로파이트 (같은 일을함으로써 user.HasLicenseFor(FEATURE_POLICY_ID)).

사용자가 생성 할 수 있도록 언급했습니다 사용자 계정- 그게 무슨 뜻입니까? 나는 이것에 대해 자세히 들어갔다 다른 몇 가지 답변, 그러나 이것이 왜 이것이 사용자를 인증하고 식별하는 우수한 방법이라고 생각하는지에 대한 빠른 요약입니다.

  1. 사용자 계정을 사용하면 연결할 수 있습니다 여러 라이센스 그리고 여러 기계 a 단일 사용자, 고객의 행동에 대한 통찰력을 제공합니다 그리고 "인앱 구매"를 자극하기 위해 즉, "전체"버전 (모바일 앱과 유사한 종류)을 구매합니다.
  2. 우리는 고객이 긴 라이센스 키를 입력 할 것을 요구하지 않아야합니다. 그리고 추적하기 어렵습니다 즉 그들은 쉽게 길을 잃습니다. (트위터에서 "잃어버린 라이센스 키"를 검색해보십시오!)
  3. 고객은입니다 이메일/비밀번호 사용에 익숙합니다; 우수한 사용자 경험 (UX)을 제공 할 수 있도록 사람들이하는 일을해야한다고 생각합니다.

물론 그렇지 않다면 원하다 사용자 계정과 귀하를 처리합니다 원하다 라이센스 키를 입력하는 사용자는 완전히 괜찮습니다 (및 keygen 그렇게하는 것도 지원합니다). 나는 라이센스의 해당 측면을 처리 할 수있는 또 다른 방법을 제공하고 고객에게 좋은 UX를 제공하기를 바랍니다.

마지막 으로이 라이센스를 매년 업데이트하려고한다고 언급 한 이후로 지속 "전체"라이센스가 1 년 후에 만료되도록 정책에 따라, "시험"라이센스는 지난 2 주 동안 말하면서 사용자가 만료 후 새 라이센스를 구매해야합니다.

더 많은 것을 파헤쳐 서 머신을 사용자 및 그와 비슷한 것들과 연결할 수는 있지만이 답변을 짧게 유지하고 단순히 사용자에게 라이센스 기능에 집중하려고 노력했다고 생각했습니다.

이 답변을 확인하십시오 : https://stackoverflow.com/a/38598174/1275924

아이디어는 사용하는 것입니다 크립토 렌스 라이센스 서버로. 여기에 있습니다 단계별 예 (C# 및 vb.net에서). 또한 아래 (C#) 아래의 키 확인을위한 코드 스 니펫을 첨부했습니다.

var licenseKey = "GEBNC-WZZJD-VJIHG-GCMVD";
var RSAPubKey = "{enter the RSA Public key here}";

var auth = "{access token with permission to access the activate method}";
var result = Key.Activate(token: auth, parameters: new ActivateModel()
{
    Key = licenseKey,
    ProductId = 3349,
    Sign = true,
    MachineCode = Helpers.GetMachineCode()
});

if (result == null || result.Result == ResultType.Error ||
    !result.LicenseKey.HasValidSignature(RSAPubKey).IsValid())
{
    // an error occurred or the key is invalid or it cannot be activated
    // (eg. the limit of activated devices was achieved)
    Console.WriteLine("The license does not work.");
}
else
{
    // everything went fine if we are here!
    Console.WriteLine("The license is valid!");
}

Console.ReadLine();
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top