내 C # 애플리케이션에 대한 제품 키를 생성하려면 어떻게해야합니까?
매년 업데이트하는 제품 (또는 라이선스) 키를 만들어야합니다. 또한 평가판 용으로 생성해야합니다.
관련 :
내 C # 애플리케이션에 대한 제품 키를 생성하려면 어떻게해야합니까?
매년 업데이트하는 제품 (또는 라이선스) 키를 만들어야합니다. 또한 평가판 용으로 생성해야합니다.
관련 :
답변:
애플리케이션에 인증하려는 데이터가 포함 된 레코드를 만드는 것과 같은 작업을 수행 할 수 있습니다. 여기에는 활성화 할 프로그램 기능, 만료 날짜, 사용자 이름 (사용자에게 바인딩하려는 경우) 등 원하는 모든 것이 포함될 수 있습니다. 그런 다음 고정 키로 암호화 알고리즘을 사용하여 암호화하거나 해시하십시오. 그런 다음 프로그램 내에서 확인하면됩니다. 라이센스 파일을 배포하는 한 가지 방법 (Windows)은 레지스트리를 업데이트하는 파일로 제공하는 것입니다 (사용자가 입력하지 않아도 됨).
그러나 잘못된 보안 감각에주의하십시오. 조만간 누군가가 프로그램을 패치하여 해당 검사를 건너 뛰고 패치 된 버전을 배포 할 것입니다. 또는, 그들은 모든 검사를 통과하고 그것을 배포하는 키를 알아 내거나, 시계를 뒤로 넘깁니다. 당신이 당신의 계획을 얼마나 복잡하게 만드는지는 중요하지 않습니다. 당신이 이것을 위해하는 모든 일은 궁극적으로 모호함을 통한 보안이 될 것이며 항상 이것을 할 수 있습니다. 누군가가 할 수 없더라도 해킹 된 버전을 배포 할 것입니다. 동글을 제공하더라도 동일하게 적용됩니다. 누군가가 원할 경우 수표를 패치 할 수도 있습니다. 코드에 디지털 서명을하는 것은 도움이되지 않으며 해당 서명을 제거하거나 사임 할 수 있습니다.
프로그램이 디버거 등에서 실행되는 것을 방지하는 기술을 사용하여 문제를 약간 복잡하게 만들 수 있지만, 이것조차도 방탄이 아닙니다. 따라서 정직한 사용자가 지불하는 것을 잊지 않도록 충분히 어렵게 만들어야합니다. 또한 귀하의 계획이 유료 사용자에게 방해가되지 않도록 매우주의하십시오. 유료 고객이 지불 한 것을 사용할 수없는 것보다 일부를 뜯어내는 것이 좋습니다.
또 다른 옵션은 온라인 확인을하는 것입니다. 사용자에게 고유 ID를 제공하고 ID가 가져야하는 기능에 대해 온라인으로 확인하고 일정 기간 동안 캐시합니다. 하지만 모든 동일한주의 사항이 적용됩니다. 사람들은 이와 같은 것을 얻을 수 있습니다.
키를 잊어 버린 사용자를 처리해야하는 지원 비용 등도 고려하십시오.
편집 : 나는 단지 추가하고 싶고, 이것에 너무 많은 시간을 투자하거나 어떻게 든 당신의 복잡한 계획이 다르고 깨지지 않을 것이라고 생각하지 마십시오. 프로그램이 실행되는 하드웨어와 OS를 사람들이 제어하는 한 그렇게 할 수 없으며 그럴 수도 없습니다. 개발자들은이를 위해 자신의 시스템을 개발하면 자신에게만 알려 지므로 '더 안전하다'고 생각하면서 더욱 복잡한 계획을 세우려고 노력해 왔습니다. 그러나 그것은 실제로 영구 운동 기계를 만드는 것과 같은 프로그래밍입니다. :-)
당신은 누구를 신뢰합니까?
저는 항상이 영역이 애플리케이션의 런타임 보안을 관리하기 위해 타사를 신뢰하기에는 너무 중요하다고 생각했습니다. 해당 구성 요소가 하나의 애플리케이션에 대해 크랙되면 모든 애플리케이션에 대해 크랙됩니다. 몇 년 전 3ds Max 용 타사 라이센스 솔루션을 사용하고 나서 5 분 만 에 Discreet 에 발생했습니다 . 좋은 시간입니다!
진지하게, 알고리즘을 완전히 제어하기 위해 자신의 롤링을 고려하십시오. 그렇다면 다음 행을 따라 키의 구성 요소를 사용하는 것이 좋습니다.
그런 다음 지옥을 체크섬하고 원하는 (가역 가능한) 암호화를 추가하여 크래킹을 더 어렵게 만드십시오.
평가판 라이센스 키를 만들려면 "평가판 모드"로 번역되는 위의 값에 대한 값을 설정하기 만하면됩니다.
그리고 이것은 아마도 응용 프로그램 / 회사에서 가장 중요한 코드 일 것이므로 난독 화 대신에 해독 루틴을 네이티브 DLL 파일에 넣고 간단히 P / Invoke 하는 것을 고려하십시오.
제가 함께 일한 여러 회사는이를 위해 일반화 된 접근 방식을 채택하여 큰 성공을 거두었습니다. 아니면 제품이 깨질 가치가 없었을 수도 있습니다.)
Windows 제품 키와 같이 입력 할 수있는 키에 대해 묻는 경우 몇 가지 검사를 기반으로합니다. 복사하여 붙여 넣어야하는 키에 대해 이야기하는 경우 해당 키는 디지털 서명 (개인 키 암호화)을 기반으로합니다.
간단한 제품 키 논리는 제품 키가와 같은 4 개의 5 자리 그룹으로 구성되어 있다고 말한 abcde-fghij-kljmo-pqrst
다음 계속해서 f + k + p와 같은 내부 관계를 지정하여 2의 첫 번째 숫자를 의미하는 것입니다. , 3, 4 그룹은 총 1 명이어야합니다. 즉, 8xxxx-2xxxx-4xxxx-2xxxx가 유효하므로 8xxxx-1xxxx-0xxxx-7xxxx도 유효합니다. 물론, 첫 번째 그룹의 두 번째 숫자가 홀수이면 마지막 그룹의 마지막 숫자도 홀수 여야하는 복잡한 관계를 포함하여 다른 관계도있을 것입니다. 이렇게하면 제품 키에 대한 생성기가 있고 제품 키 확인은 모든 규칙과 일치하는지 간단히 확인합니다.
암호화는 일반적으로 개인 키 (== 디지털 서명)를 사용하여 암호화되고 Base64 로 변환 된 라이선스에 대한 정보 문자열입니다 . 공개 키는 애플리케이션과 함께 배포됩니다. Base64 문자열이 도착하면 공개 키로 확인 (== 해독)되고 유효한 것으로 확인되면 제품이 활성화됩니다.
내가 미친 짓을 할 거라는 걸 인정해야 겠어.
그들이 LicenseCheck를 찾아서 제거 할 때 DLL이 세그멘테이션 오류를 시작하면 어떤 재미가 따라 올까요 ?
옵션이 Microsoft 소프트웨어 라이센스 및 보호 (SLP) 서비스뿐만 아니라이. 그것에 대해 읽은 후에 나는 그것을 정말로 사용할 수 있기를 바랍니다.
라이센스에 따라 코드의 일부를 차단한다는 생각이 정말 마음에 듭니다. .NET에 가장 안전하고 인기있는 제품입니다. 사용하지 않아도 재미있는 읽기!
Microsoft® 소프트웨어 라이선스 및 보호 (SLP) 서비스는 ISV (독립 소프트웨어 공급 업체)가 고객에게 유연한 라이선스 조건을 채택 할 수 있도록하는 소프트웨어 활성화 서비스입니다. Microsoft SLP 서비스는 응용 프로그램 및 라이선스 정보를 보호하는 고유 한 보호 방법을 사용하여 고객 규정 준수를 향상시키면서 시장에 더 빨리 진출 할 수 있습니다.
참고 : 이것이 중요한 알고리즘과 같은 민감한 코드가있는 제품을 출시하는 유일한 방법입니다.
제품 키 및 활성화를위한 또 다른 저렴한 도구는 InstallKey라는 제품입니다. www.lomacons.com을 살펴보십시오.
한 가지 간단한 방법은 GUID ( Globally Unique Identifier )를 사용하는 것 입니다. GUID는 일반적으로 128 비트 값으로 저장되며 일반적으로 .NET과 같이 하이픈으로 구분 된 그룹이있는 32 개의 16 진수로 표시됩니다 {21EC2020-3AEA-4069-A2DD-08002B30309D}
.
.NET의 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
LicenseSpot 을 확인할 수 있습니다 . 다음을 제공합니다.
@frankodwyer의 훌륭한 답변에 대해 약간 피기 백하고 온라인 기반 라이선스에 대해 좀 더 자세히 살펴 보겠습니다. 저는 Keygen 의 창립자입니다. 개발자를 위해 구축 된 라이선싱 REST API .
애플리케이션에 대해 두 가지 "유형"라이선스, 즉 "정식 버전"과 "평가판"을 원한다고 언급 했으므로이를 단순화하고 애플리케이션의 특정 기능에 라이선스를 부여 하는 기능 라이선스 모델을 사용할 수 있습니다 (이 경우, "전체"기능 세트와 "평가판"기능 세트가 있습니다.)
시작하려면 두 가지 라이선스 유형 ( Keygen 에서는 정책 이라고 함)을 만들 수 있으며 사용자가 계정을 등록 할 때마다 시작할 수있는 "평가판"라이센스를 생성 할 수 있습니다 ( "평가판"라이센스 는 "평가판"기능 정책을 구현 함 ). , 앱 내에서 다양한 검사를 수행하는 데 사용할 수 있습니다. 예를 들어 사용자가 Trial-Feature-A 및 Trial-Feature-B를 사용할 수 있습니다. 있습니다.
이를 바탕으로 사용자가 앱을 구매할 때마다 (PayPal, Stripe 등을 사용하는지 여부에 관계없이) '전체'기능 정책을 구현하는 라이선스를 생성하고이를 사용자 계정 과 연결할 수 있습니다 . 이제 앱 내에서 사용자에게 Pro-Feature-X 및 Pro-Feature-Y 를 수행 할 수있는 "전체"라이선스가 있는지 확인할 수 있습니다 (예 :) user.HasLicenseFor(FEATURE_POLICY_ID)
.
사용자가 사용자 계정 을 만들 수 있도록 허용했다고 언급했습니다. 그게 무슨 뜻입니까? 몇 가지 다른 답변 에서 자세히 설명 했지만 이것이 사용자를 인증하고 식별하는 데 탁월한 방법이라고 생각하는 이유에 대한 간단한 요약입니다.
당신이하지 않으면 물론, 원하는 사용자 계정을 처리하기 위해 당신이 원하는 좋은 완전히의 입력 라이센스 키에 사용자가 (그리고 Keygen은의 지원뿐만 아니라 것으로하고 ). 저는 라이선스의 해당 측면을 처리하는 또 다른 방법을 제공하고 고객에게 멋진 UX를 제공하기를 바랍니다.
마지막으로 이러한 라이선스를 매년 업데이트하겠다고 언급 했으므로 "정식"라이선스가 1 년 후에 만료되고 "평가판"라이선스가 2 주 후에 만료되도록 정책 기간 을 설정할 수 있으므로 사용자가 새 라이선스를 구매해야합니다. 만료 후 라이센스.
더 많은 것을 파헤쳐 서 기계를 사용자와 그와 같은 것들과 연관시키는 것에 대해 알아볼 수 있었지만,이 대답을 짧게 유지하고 단순히 사용자에게 기능을 라이선싱하는 데 집중하려고 노력할 것이라고 생각했습니다.
이 답변을 확인하십시오 : https://stackoverflow.com/a/38598174/1275924
아이디어는 Cryptolens 를 라이센스 서버로 사용하는 것입니다 . 다음은 단계별 예제 (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();