내 C # 애플리케이션에 대한 제품 키를 생성하려면 어떻게해야합니까?


91

내 C # 애플리케이션에 대한 제품 키를 생성하려면 어떻게해야합니까?

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

관련 :



J3r3myK가 ... 자신의 질문을 게시 한 후 @stukelly을 게시 한
Dozer789

답변:


83

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

그러나 잘못된 보안 감각에주의하십시오. 조만간 누군가가 프로그램을 패치하여 해당 검사를 건너 뛰고 패치 된 버전을 배포 할 것입니다. 또는, 그들은 모든 검사를 통과하고 그것을 배포하는 키를 알아 내거나, 시계를 뒤로 넘깁니다. 당신이 당신의 계획을 얼마나 복잡하게 만드는지는 중요하지 않습니다. 당신이 이것을 위해하는 모든 일은 궁극적으로 모호함을 통한 보안이 될 것이며 항상 이것을 할 수 있습니다. 누군가가 할 수 없더라도 해킹 된 버전을 배포 할 것입니다. 동글을 제공하더라도 동일하게 적용됩니다. 누군가가 원할 경우 수표를 패치 할 수도 있습니다. 코드에 디지털 서명을하는 것은 도움이되지 않으며 해당 서명을 제거하거나 사임 할 수 있습니다.

프로그램이 디버거 등에서 실행되는 것을 방지하는 기술을 사용하여 문제를 약간 복잡하게 만들 수 있지만, 이것조차도 방탄이 아닙니다. 따라서 정직한 사용자가 지불하는 것을 잊지 않도록 충분히 어렵게 만들어야합니다. 또한 귀하의 계획이 유료 사용자에게 방해가되지 않도록 매우주의하십시오. 유료 고객이 지불 한 것을 사용할 수없는 것보다 일부를 뜯어내는 것이 좋습니다.

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

키를 잊어 버린 사용자를 처리해야하는 지원 비용 등도 고려하십시오.

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


1
좋은 요약입니다. CheatEngine 검색을 우회하는 것이 간단하다고 생각하지 않는 사람은 프로그래머가 아닌 사람도 쉽게 할 수 있습니다. 이 레이어를 단순하게 만드는 것이 가장 좋습니다.
Kelly

나는 같은 문제가 있는데, 만료 날짜와 마지막으로 기록 된 날짜를 확인을 위해 내 앱에 대한 라이선스 키를 만들었지 만 문제는 마지막 기록 된 날짜를 업데이트하기 위해 파일을 편집하기 위해 개인 키를 추가해야한다는 것입니다. 코드에 키를 넣는 현명한 방법이 아닙니다. 어떤 충고 ?
Doicare

16

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

저는 항상이 영역이 애플리케이션의 런타임 보안을 관리하기 위해 타사를 신뢰하기에는 너무 중요하다고 생각했습니다. 해당 구성 요소가 하나의 애플리케이션에 대해 크랙되면 모든 애플리케이션에 대해 크랙됩니다. 몇 년 전 3ds Max 용 타사 라이센스 솔루션을 사용하고 나서 5 분 만 에 Discreet 에 발생했습니다 . 좋은 시간입니다!

진지하게, 알고리즘을 완전히 제어하기 위해 자신의 롤링을 고려하십시오. 그렇다면 다음 행을 따라 키의 구성 요소를 사용하는 것이 좋습니다.

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

그런 다음 지옥을 체크섬하고 원하는 (가역 가능한) 암호화를 추가하여 크래킹을 더 어렵게 만드십시오.

평가판 라이센스 키를 만들려면 "평가판 모드"로 번역되는 위의 값에 대한 값을 설정하기 만하면됩니다.

그리고 이것은 아마도 응용 프로그램 / 회사에서 가장 중요한 코드 일 것이므로 난독 화 대신에 해독 루틴을 네이티브 DLL 파일에 넣고 간단히 P / Invoke 하는 것을 고려하십시오.

제가 함께 일한 여러 회사는이를 위해 일반화 된 접근 방식을 채택하여 큰 성공을 거두었습니다. 아니면 제품이 깨질 가치가 없었을 수도 있습니다.)


3
참고로 암호화는 항상 되돌릴 수 있으며 암호화 된 것을 읽을 수없는 것은 쓸모가 없습니다. 해싱은 당신이 생각할 수있는 '암호화'한 가지 방법입니다.
Samuel

Bruce Scheier (확실하지 않음)에서 나온 "자신의 암호 체계를 사용하지 마십시오"가 갈 길입니다. : 당신은이 답변을 살펴 있어야 할 수 있습니다 security.stackexchange.com/questions/2202/...
Shadok

"..P / Invoke to it"에 대해 자세히 설명해 주시겠습니까? 내가 링크 된 페이지에서 보았다하지만 내 어떤 현명한을하지 않았다 : - /
MrCalvin

11

Windows 제품 키와 같이 입력 할 수있는 키에 대해 묻는 경우 몇 가지 검사를 기반으로합니다. 복사하여 붙여 넣어야하는 키에 대해 이야기하는 경우 해당 키는 디지털 서명 (개인 키 암호화)을 기반으로합니다.

간단한 제품 키 논리는 제품 키가와 같은 4 개의 5 자리 그룹으로 구성되어 있다고 말한 abcde-fghij-kljmo-pqrst다음 계속해서 f + k + p와 같은 내부 관계를 지정하여 2의 첫 번째 숫자를 의미하는 것입니다. , 3, 4 그룹은 총 1 명이어야합니다. 즉, 8xxxx-2xxxx-4xxxx-2xxxx가 유효하므로 8xxxx-1xxxx-0xxxx-7xxxx도 유효합니다. 물론, 첫 번째 그룹의 두 번째 숫자가 홀수이면 마지막 그룹의 마지막 숫자도 홀수 여야하는 복잡한 관계를 포함하여 다른 관계도있을 것입니다. 이렇게하면 제품 키에 대한 생성기가 있고 제품 ​​키 확인은 모든 규칙과 일치하는지 간단히 확인합니다.

암호화는 일반적으로 개인 키 (== 디지털 서명)를 사용하여 암호화되고 Base64 로 변환 된 라이선스에 대한 정보 문자열입니다 . 공개 키는 애플리케이션과 함께 배포됩니다. Base64 문자열이 도착하면 공개 키로 확인 (== 해독)되고 유효한 것으로 확인되면 제품이 활성화됩니다.


9

사소한 것이 든 크래킹하기 어려운 것이 든, 그것이 정말로 큰 차이를 만드는지 확신하지 못합니다.

앱이 크랙 될 가능성은 제품 키 처리의 강도보다는 유용성에 훨씬 더 비례합니다.

개인적으로 두 종류의 사용자가 있다고 생각합니다. 지불하는 사람들. 그렇지 않은 사람들. 그렇게하는 사람들은 가장 사소한 보호로도 그렇게 할 것입니다. 크랙을 기다리거나 다른 곳을 보지 않는 사람들. 어느 쪽이든 더 이상 돈을 벌 수 없습니다.


6

내가 미친 짓을 할 거라는 걸 인정해야 겠어.

  1. CPU 병목 현상을 찾아 P / Invokeable DLL 파일로 추출 합니다.
  2. 빌드 후 작업으로 XOR 암호화 키를 사용하여 DLL 파일의 일부를 암호화합니다.
  3. 공개 / 개인 키 체계를 선택하고 DLL 파일에 공개 키를 포함합니다.
  4. 제품 키를 해독하고 두 절반을 함께 XOR하면 DLL에 대한 암호화 키가 생성되도록 배열하십시오.
  5. DLL의 DllMain 코드에서 보호 (PAGE_EXECUTE_READWRITE)를 비활성화하고 키로 해독합니다.
  6. 라이센스 키와 매개 변수의 온 전성 검사를 수행하는 LicenseCheck () 메서드를 만든 다음 전체 DLL 파일을 체크섬하여 둘 중 하나에 라이센스 위반을 발생시킵니다. 아, 여기에서 다른 초기화를 수행하십시오.

그들이 LicenseCheck를 찾아서 제거 할 때 DLL이 세그멘테이션 오류를 시작하면 어떤 재미가 따라 올까요 ?


그러면 DEP를 비활성화 할 필요가 없습니까?
Rowland Shaw

아니요. PAGE_EXECUTE_READWRITE 설정은 자체 수정 코드를 작성하는 문서화 된 올바른 방법이며 해당 페이지에서만 NX 비트를 지 웁니다.
Joshua

8
이 일반적인 기술은 80 년대 후반에 매우 인기가있었습니다. 약점은 "비밀"코드가 RAM으로 해독되어 실행중인 소프트웨어 사본에서 쉽게 훔쳐 갈 수 있다는 점입니다.
Ray Burns

5

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

라이센스에 따라 코드의 일부를 차단한다는 생각이 정말 마음에 듭니다. .NET에 가장 안전하고 인기있는 제품입니다. 사용하지 않아도 재미있는 읽기!

Microsoft® 소프트웨어 라이선스 및 보호 (SLP) 서비스는 ISV (독립 소프트웨어 공급 업체)가 고객에게 유연한 라이선스 조건을 채택 할 수 있도록하는 소프트웨어 활성화 서비스입니다. Microsoft SLP 서비스는 응용 프로그램 및 라이선스 정보를 보호하는 고유 한 보호 방법을 사용하여 고객 규정 준수를 향상시키면서 시장에 더 빨리 진출 할 수 있습니다.

참고 : 이것이 중요한 알고리즘과 같은 민감한 코드가있는 제품을 출시하는 유일한 방법입니다.


취소 된 것으로 기억하는 사람들을 위해 : SLP가 다시 시작되었습니다
Michael Olesen

5

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


2

제품 키 및 활성화를위한 또 다른 저렴한 도구는 InstallKey라는 제품입니다. www.lomacons.com을 살펴보십시오.


2

한 가지 간단한 방법은 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 "/".

도움이되기를 바랍니다.


1

비결은 당신 만이 아는 알고리즘을 갖는 것입니다 (다른 쪽 끝에서 디코딩 될 수 있도록).

"소수를 골라서 매직 넘버를 추가"와 같은 간단한 것들이 있습니다.

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

이 질문에 대한 답변도 읽을 가치가 있습니다.


6
"비결은 오직 당신 만이 아는 알고리즘을 갖는 것입니다"-이것은 거의 모호한 보안에 대한 정의이며 정말 나쁜 생각입니다.
Nick Johnson

3
모든 라이선스는 비밀을 포함하는 알고리즘에 의해 이루어집니다. 라이센스는 종종 "깨지지 않는"열쇠
Rowland Shaw

법적 수단을 통한 라이선스 집행에 관한 의견 +1
Rob

예, DRM과 마찬가지로 모든 라이선스가 약합니다. 하지만 비밀 알고리즘에 의존하는 것은 분명히 더 약 합니다.
Nick Johnson

1
나는 당신에게 좋은 대답을 위해 +1을했고, 당신에게도 반대표에 반대하는 또 다른 하나를 주었으면합니다. 슬프게도 세상에는 아주 미성숙 한 작은 아기들이 있습니다.
ProfK 2011-12-29


0

LicenseSpot 을 확인할 수 있습니다 . 다음을 제공합니다.

  • 무료 라이선스 구성 요소
  • 온라인 활성화
  • 앱과 온라인 스토어를 통합하는 API
  • 일련 번호 생성
  • 라이선스 취소
  • 구독 관리

1
"무료"는 실제로 무료가 아닙니다. 앱에 라이선스 구성 요소를 무료로 포함 할 수 있습니다. 앱이 실제로 라이선스 구성 요소를 사용 하는 것은 무료가 아닙니다 . 10 회 활성화를 초과하면 매월 요금을 지불해야합니다. 활성화 당 백분율이 아닙니다. 저용량 저비용 .NET 앱의 경우이 가격 모델은 단점이 될 것입니다. .NET 앱용 Apple AppStore와는 다릅니다.
Cheeso

0

@frankodwyer의 훌륭한 답변에 대해 약간 피기 백하고 온라인 기반 라이선스에 대해 좀 더 자세히 살펴 보겠습니다. 저는 Keygen 의 창립자입니다. 개발자를 위해 구축 된 라이선싱 REST API .

애플리케이션에 대해 두 가지 "유형"라이선스, 즉 "정식 버전"과 "평가판"을 원한다고 언급 했으므로이를 단순화하고 애플리케이션의 특정 기능에 라이선스를 부여 하는 기능 라이선스 모델을 사용할 수 있습니다 (이 경우, "전체"기능 세트와 "평가판"기능 세트가 있습니다.)

시작하려면 두 가지 라이선스 유형 ( Keygen 에서는 정책 이라고 함)을 만들 수 있으며 사용자가 계정을 등록 할 때마다 시작할 수있는 "평가판"라이센스를 생성 할 수 있습니다 ( "평가판"라이센스 "평가판"기능 정책을 구현 함 ). , 앱 내에서 다양한 검사를 수행하는 데 사용할 수 있습니다. 예를 들어 사용자가 Trial-Feature-ATrial-Feature-B를 사용할 수 있습니다. 있습니다.

이를 바탕으로 사용자가 앱을 구매할 때마다 (PayPal, Stripe 등을 사용하는지 여부에 관계없이) '전체'기능 정책을 구현하는 라이선스를 생성하고이를 사용자 계정 과 연결할 수 있습니다 . 이제 앱 내에서 사용자에게 Pro-Feature-XPro-Feature-Y 를 수행 할 수있는 "전체"라이선스가 있는지 확인할 수 있습니다 (예 :) user.HasLicenseFor(FEATURE_POLICY_ID).

사용자가 사용자 계정 을 만들 수 있도록 허용했다고 언급했습니다. 그게 무슨 뜻입니까? 몇 가지 다른 답변 에서 자세히 설명 했지만 이것이 사용자를 인증하고 식별하는 데 탁월한 방법이라고 생각하는 이유에 대한 간단한 요약입니다.

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

당신이하지 않으면 물론, 원하는 사용자 계정을 처리하기 위해 당신이 원하는 좋은 완전히의 입력 라이센스 키에 사용자가 (그리고 Keygen은의 지원뿐만 아니라 것으로하고 ). 저는 라이선스의 해당 측면을 처리하는 또 다른 방법을 제공하고 고객에게 멋진 UX를 제공하기를 바랍니다.

마지막으로 이러한 라이선스를 매년 업데이트하겠다고 언급 했으므로 "정식"라이선스가 1 년 후에 만료되고 "평가판"라이선스가 2 주 후에 만료되도록 정책 기간 을 설정할 수 있으므로 사용자가 새 라이선스를 구매해야합니다. 만료 후 라이센스.

더 많은 것을 파헤쳐 서 기계를 사용자와 그와 같은 것들과 연관시키는 것에 대해 알아볼 수 있었지만,이 대답을 짧게 유지하고 단순히 사용자에게 기능을 라이선싱하는 데 집중하려고 노력할 것이라고 생각했습니다.


0

이 답변을 확인하십시오 : 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();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.