를 생성하는 방법과 유효성을 검증할 수 있는 소프트웨어 라이선스 키가?

StackOverflow https://stackoverflow.com/questions/599837

  •  11-09-2019
  •  | 
  •  

문제

나는 현재 개발에 관련된 제품(에서 개발 C#)을 사용할 수 있 다운로드 및 설치에 대한 무료이지만 매우 제한된 버전입니다.액세스하려면 모든 기능 사용자가를 지불한 라이센스 비용을 받는 핵심입니다.는 키될 것입은 응용 프로그램에 입력하여""잠금을 해제합니다.

를 사용하는 것으로 라이선스 키를 좋아하는 일이요 궁금:

  1. 그것은 어떻게 일반적으로 해결?
  2. 할 수 있는 방법을 생성하는 키와 어떻게 그것을 검증하여 응용 프로그램?
  3. 할 수 있는 방법도 하지 않는 키 점점 인터넷에 게시하고 사용하지 않은 사람이 지불 라이센스(키는 기본적으로지"그들의").

나 또한 넥타이를 키 응용 프로그램을 어떻게든 그것을 가능하여 책임에 대한 새로운 키에 기능 버전이 있습니다.

아무거나 다른 나는에 대해 생각해야에서 이 시나리오?

도움이 되었습니까?

해결책

경고 : 사용자가 해적을 막는 것을 막을 수는 없지만 정직한 사용자가 올바른 일을 더 쉽게 할 수 있습니다.

각 사용자에 대해 특별 빌드를하고 싶지 않다고 가정하면 :

  • 제품의 비밀 키를 생성하십시오
  • 사용자의 이름을 가져 가십시오
  • 사용자 이름과 비밀 키와 해시 (예 : SHA1)
  • SHA1 해시를 영숫자 문자열로 포장하십시오. 이것은 개별 사용자의 "제품 키"입니다.
  • 프로그램 내에서 동일한 해시를 수행하고 제품 키와 비교하십시오. 동일하다면 OK.

그러나 나는 반복한다 : 이것은 불법 복제를 예방하지 않습니다


나는 최근 에이 접근법이 암호화 적으로 건전하지 않다는 것을 읽었습니다. 그러나이 솔루션은 이미 약합니다 (소프트웨어 자체가 비밀 키를 어딘가에 포함시켜야하므로), 그래서 나는이 발견이 솔루션을 무효화한다고 생각하지 않습니다.

그래도 나는 이것을 정말로 언급해야한다고 생각했다. 이것에서 다른 것을 도출 할 계획이라면주의하십시오.

다른 팁

라이센스 키를 생성하는 방법에는 여러 가지가 있지만 이러한 방법 중 거의 안전한 방법은 거의 없습니다. 회사의 경우 라이센스 키는 실제 현금과 거의 같은 가치를 가지기 때문에 유감입니다.

이상적으로는 라이센스 키가 다음 속성을 갖기를 원합니다.

  1. 누군가가 제품에 대한 라이센스 키를 생성 할 수 있어야합니다. 누군가가 귀하의 제품을 완전히 리버스 엔지니어링하더라도 (발생할 것입니다. 라이센스 제어에 대해 진지한 경우 알고리즘을 난독 화하거나 소프트웨어 내에서 암호화 키를 숨기는 것은 실제로 문제가되지 않습니다. 제품이 성공하면 누군가 릴리스 후 며칠 만에 키 생성기를 만들 것입니다.

  2. 라이센스 키는 하나의 컴퓨터에서만 사용할 수 있어야합니다 (또는 적어도이를 매우 단단히 제어 할 수 있어야합니다).

  3. 라이센스 키는 짧고 전화기를 입력하거나 지시하기가 쉽습니다. 키에 "L"또는 "1"이 포함되어 있는지 이해하지 못하기 때문에 모든 고객이 기술 지원을 호출하는 것을 원하지 않습니다. 귀하의 지원 부서는 이에 대해 감사 할 것이며이 분야에서 비용이 낮아질 것입니다.

그렇다면 이러한 도전을 어떻게 해결합니까?

  1. 대답은 간단하지만 기술적으로 도전적입니다. 공개 키 암호화를 사용하는 디지털 서명. 라이센스 키는 실제로 회사의 개인 키에 서명 된 유용한 데이터가 포함 된 "문서"에 서명해야합니다. 서명은 라이센스 키의 일부 여야합니다. 제품은 해당 공개 키로 라이센스 키를 검증해야합니다. 이런 식으로 누군가가 제품의 논리에 완전히 액세스 할 수 있더라도 개인 키가 없기 때문에 라이센스 키를 생성 할 수 없습니다. 라이센스 키는 다음과 같습니다. base32 (data, private_key_encrypted (hash (data))) 여기서 가장 큰 과제는 클래식 공개 키 알고리즘의 시그니처 크기가 크다는 것입니다. RSA512에는 1024 비트 서명이 있습니다. 라이센스 키가 수백 개의 문자를 갖기를 원하지 않습니다. 가장 강력한 접근법 중 하나는 타원 곡선 암호화를 사용하는 것입니다 (기존 특허를 피하기 위해 신중한 구현과 함께). ECC 키는 같은 강도를 위해 RSA 키보다 6 배 짧습니다. Schnorr Digital Signature 알고리즘과 같은 알고리즘을 사용하여 서명 크기를 더 줄일 수 있습니다 (2008 년에 만료 된 특허 - 좋은 :)).

  2. 이것은 제품 활성화에 의해 달성 될 수 있습니다 (Windows는 좋은 예입니다). 기본적으로 유효한 라이센스 키가있는 고객의 경우 컴퓨터의 하드웨어 ID를 서명 된 데이터로 포함시키는 서명 된 메시지 인 "활성화 데이터"를 생성해야합니다. 이는 일반적으로 인터넷을 통해 수행되지만 한 번만 수행됩니다. 제품은 라이센스 키와 컴퓨터 하드웨어 ID를 활성화 서버로 보내고 Activation Server는 서명 된 메시지를 다시 보냅니다 (이를 통해 짧고 쉽게 지시 할 수 있습니다. 핸드폰). 그 순간부터 제품은 스타트 업에서 라이센스 키를 확인하지 않지만 활성화 데이터는 유효성을 유지하기 위해 컴퓨터가 동일 해야하는 활성화 데이터 (데이터가 다르고 디지털 서명이 검증되지 않습니다). 활성화 데이터 검사는 인터넷을 통해 확인이 필요하지 않습니다. 제품에 이미 포함 된 공개 키를 사용하여 활성화 데이터의 디지털 서명을 확인하는 것으로 충분합니다.

  3. 키에서 "1", "l", "0", "o"와 같은 중복 문자를 제거하십시오. 라이센스 키 문자열을 문자 그룹으로 나눕니다.

간단한 답변 - 어떤 체계를 사용하든 상관없이 금이 갈 수 있습니다.

해커가 해커를 막기위한 시스템으로 정직한 고객을 처벌하지 마십시오.

이메일이나 이와 유사한 간단한 해시 코드는 아마도 충분할 것입니다. 하드웨어 기반 ID는 사람들이 하드웨어를 다시 설치하거나 업데이트해야 할 때 항상 문제가됩니다.

문제에 대한 좋은 스레드 :http://discuss.joelonsoftware.com/default.asp?biz.5.82298.34

키를 생성 할 때 해시를 계산하는 문자열에 버전을 연결하고 숫자를 빌드하는 것을 잊지 마십시오. 그렇게하면 출시 한 모든 내용을 잠금 해제하는 단일 키가 없습니다.

키나 패치가 떠 다니는 후에 astalavista.box.sk 누군가가 누군가가 금이 갈 수있을만큼 인기있는 것을 만드는 데 성공했다는 것을 알게 될 것입니다. 기쁘게 하다!

이미 언급 된 것 외에 ....

중간 언어 문제로 인해 .NET 애플리케이션을 사용하는 것은 본질적으로 깨질 수 있습니다. .NET 코드의 간단한 분해는 누구에게나 제품을 열게됩니다. 해당 시점에서 라이센스 코드를 쉽게 우회 할 수 있습니다.

하드웨어 값을 사용하여 더 이상 키를 만들 수 없습니다. 가상 머신을 사용하면 누군가가 '라이센스가있는'기계의 이미지를 만들어 선택한 플랫폼에서 실행할 수 있습니다.

비싼 소프트웨어라면 다른 솔루션이 있습니다. 그렇지 않다면 캐주얼 해커에게 충분히 어렵게 만듭니다. 그리고 결국에는 무면허 사본이있을 것이라는 사실을 받아들이십시오.

제품이 복잡한 경우 고유 한 지원 문제는 귀하를 위해 약간의 보호를 제공합니다.

라이센스 키 생성에 사용하는 C# / .NET 엔진은 이제 오픈 소스로 유지됩니다.

https://github.com/appsoftware/.net-licence-key-generator.

"부분 키 검증"시스템을 기반으로합니다.이 시스템은 키를 생성하는 데 사용하는 키의 하위 집합 만 분산 가능하게 컴파일해야합니다. 당신은 당신의 자체 키를 생성하므로 라이센스 구현은 소프트웨어에 고유합니다.

위에서 언급 한 바와 같이, 코드를 소환 할 수 있다면 대부분의 라이센스 시스템을 우회하는 것은 비교적 쉽습니다.

나는 사용했다 CRYPKEY 과거에. 사용 가능한 많은 것 중 하나입니다.

라이센스 체계를 통해 소프트웨어를 최대 수준으로 만 보호 할 수 있습니다.

당신이 얼마나 정교하게되고 싶은지 모르겠습니다

그러나 .NET은 하드 드라이브 일련 번호에 액세스 할 수 있다고 생각합니다.

당신은 프로그램이 당신에게 당신에게 그것을 보내 주실 수 있습니다.

그에 따라 코드를 계산하고 키를 다시 이메일로 보냅니다.

그들은 열쇠가있는 후에 기계를 스위칭하는 것을 막을 것입니다.

나는 뒤에있는 개발자 중 하나입니다 크립토 렌스 소프트웨어 라이센스 플랫폼 및 14 세부터 라이센스 시스템에서 작업 해 왔습니다.이 답변에는 수년 동안 획득 한 경험을 기반으로 한 팁이 포함되어 있습니다.

이를 해결하는 가장 좋은 방법은 라이센스 키를 확인하기 위해 응용 프로그램의 각 인스턴스가 호출하는 라이센스 키 서버를 설정하는 것입니다.

라이센스 키 서버의 이점

라이센스 키 서버의 장점은 다음과 같습니다.

  1. 즉시 라이센스 키를 업데이트하거나 차단할 수 있습니다.
  2. 각 라이센스 키는 특정 수의 기계에 잠겨있을 수 있습니다 (이는 사용자가 다른 사람이 사용할 수 있도록 라이센스 키를 온라인으로 게시하는 것을 방지하는 데 도움이됩니다).

고려 사항

온라인으로 라이센스를 확인하면 응용 프로그램의 각 인스턴스를 더 잘 제어 할 수 있지만 인터넷 연결이 항상 존재하는 것은 아니기 때문에 (특히 대기업을 대상으로하는 경우) 라이센스 키 확인을 수행하는 다른 방법이 필요합니다.

솔루션은 RSA 또는 ECC와 같은 공개 키 암호화 시스템을 사용하여 서버의 라이센스 키 응답에 항상 서명하는 것입니다 (임베디드 시스템에서 실행하려는 경우 더 나은 경우). 귀하의 응용 프로그램에는 만 있어야합니다 공개 키 라이센스 키 응답을 확인합니다.

따라서 인터넷 연결이없는 경우 대신 이전 라이센스 키 응답을 사용할 수 있습니다. 두 가지를 모두 저장하십시오 데이트 그리고 기계 식별자 응답에서 너무 오래되지 않았는지 확인하고 (예 : 사용자가 최대 30 일에 오프라인 상태가 될 수 있음) 라이센스 키 응답은 올바른 장치에 속하는지 확인합니다.

메모 인터넷에 연결되어 있어도 라이센스 증명서 키 응답을 항상 확인해야합니다. 인터넷에 연결되어 있음)는 서버를 떠난 이후로 변경되지 않았는지 확인해야합니다 (API가 라이센스에 대한 API에도 완료해야합니다. 키 서버 사용 https)

비밀 알고리즘 보호

대부분의 .NET 애플리케이션은 리버스 엔지니어링을 아주 쉽게 엔지니어링 할 수 있습니다 (IL 코드를 얻기 위해 Microsoft가 제공하는 Diassembler가 모두 있으며 일부 상용 제품은 예를 들어 C#에서 소스 코드를 검색 할 수도 있습니다). 물론, 항상 코드를 난독 화 할 수는 있지만 결코 100% 보안이 아닙니다.

대부분의 경우 소프트웨어 라이센스 솔루션의 목적은 정직한 사람들이 정직한 사람들을 돕는 것입니다 (즉, 기꺼이 지불하는 정직한 사용자는 시험 만료 후에 지불하는 것을 잊지 않습니다).

그러나 여전히 귀하가 결코 대중에게 유출하려는 코드가있을 수 있습니다 (예 : 주가 예측 알고리즘 등). 이 경우, 갈 수있는 유일한 방법은 API 엔드 포인트 방법을 실행해야 할 때마다 응용 프로그램이 호출됩니다. 인터넷 연결이 필요하지만 클라이언트 시스템에서 비밀 코드를 실행하지 않도록합니다.

구현

모든 것을 직접 구현하고 싶지 않다면, 나는 이 튜토리얼 (부분의 크립토 렌스)

요청한 모든 것을 수행하는 유일한 방법은 서버를 사용하여 인터넷 액세스 및 확인을 요구하는 것입니다. 응용 프로그램은 키가있는 서버에 로그인해야하며 IP 주소와 같은 세션 세부 사항을 저장해야합니다. 이렇게하면 여러 다른 기계에서 키가 사용되지 않습니다. 이것은 일반적으로 응용 프로그램 사용자에게 인기가 없으며, 매우 비싸고 복잡한 응용 프로그램이 아니라면 그만한 가치가 없습니다.

응용 프로그램에 대한 라이센스 키 만 있으면 키가 양호한 경우 클라이언트 쪽을 확인할 수 있지만이 키를 다른 사용자에게 쉽게 배포 할 수 있으며 디 컴파일러를 사용하면 새 키를 생성 할 수 있습니다.

서버의 데이터베이스에 저장된 라이센스를 나타내는 라이센스 키가 필요한 회사 소프트웨어 (C# .NET)에서 인터넷 기반의 일회성 활성화를 구현했습니다. 이 소프트웨어는 키로 서버에 부딪히고 클라이언트 컴퓨터에서 일부 변수 (자주 변경되지 않는 CPUID 및 자주 변경되지 않는 다른 제품의 조합)에서 생성 된 RSA 키를 사용하여 로컬로 암호화 된 라이센스 정보가 제공됩니다. 레지스트리.

서버 측 코딩이 필요하지만 실제로 잘 작동했으며 브라우저 기반 소프트웨어로 확장했을 때 동일한 시스템을 사용할 수있었습니다. 또한 영업 사원에게 소프트웨어를 어디에서, 언제 사용하고 있는지에 대한 훌륭한 정보를 제공합니다. 로컬로만 처리되는 라이센스 시스템은 착취에 완전히 취약합니다. 특히 .NET에 반사됩니다. 그러나 다른 사람들이 말했듯이 시스템은 전적으로 안전하지 않습니다.

내 생각에, 웹 기반 라이센스를 사용하지 않는다면 소프트웨어를 전혀 보호 할 실제 사항이 없습니다. DRM이 유발할 수있는 두통으로 인해 실제로 고통 받기 위해 지불 한 사용자에게는 공평하지 않습니다.

공개 키 암호화 기반 라이센스 시스템만이 여기에서 올바른 접근법이라고 생각합니다. 라이센스 생성에 필요한 필수 정보를 Sourcecode에 포함시킬 필요가 없기 때문입니다.

과거에는 사용했습니다 Treek의 라이센스 라이브러리 여러 번, 그것은이 요구 사항을 충족시키고 정말 좋은 가격을 제공하기 때문에 여러 번. 그것은 최종 사용자와 자체에 동일한 라이센스 보호를 사용하며 지금까지 아무도 금이 간다. 불법 복제와 크래킹을 피하기 위해 웹 사이트에서 좋은 팁을 찾을 수도 있습니다.

과 같은 몇 가지 다른 사람을 언급,나는 거 상대 의 적대적인 고객에게 기본으로는 뭔가 라이센스 산업 악명이 높다.그래서 나는 것에 확장 좋은 당신의 문제에 대한 해결책을 또한 좋은 고객 UX.

시작하려면,당신이 언급되는"제한된"버전의 소프트웨어를 사용하려고 하는 고객으로 변환"업그레이드"추가 기능입니다.그래서 무엇을 찾고 계신가 기능 라이선스 귀하의 제품에 대한 예고객이 구입할 수 있는 라이센스에 대한 기능 X기능 Y.

내장 Keygen 이러한 유형의 라이선스에서는 마음입니다.Keygen 라이센스 REST API 할 수 있는 사용자 계정을 관리,라이센스 및 또한 트랙 기계 사용법/협회.

내가 무엇을 할 것이라는 설정 2 허 유형 (a 정책 내 Keygen)하나은 기본 정책을 무료로 제한된 버전이고,다른 정책을 위한 유료 버전입니다.

나는 확실하지 않다 당신이 무엇을 위해 사용하고 지불,하지만 가정하자 너 같은 것을 사용하는 스트라이프(표준 요즘)을 제공하는 webhook.Keygen 또한 webhook(당신이 그것을 사용하거나하지 않습니다,모든 이것은 여전히 적용 가능).통합할 수 있습니다 Keygen 이야기하기로 결제서비스 공급자를 사용하여 webhook 에서 양측(생각: customer.created->만들기 기본 라이센스에 대한 고객 license.created->료는 고객에 대한 새로운 라이선스).

그래서를 이용하여 webhook,우리는 우리를 자동화할 수 있습니다 라이선스 창출에 대한 새로운 고객에게 제공됩니다.그래서 어떤 면허 유효성 검사에서 응용 프로그램 자체가?이 작업을 수행할 수 있습니다 다양한 방법으로,하지만 가장 인기 있는 방법을 요구함으로써 고객이를 입력해 긴 라이센스 키를 입력 필드에 입력할 수 있는 검증;이 끔찍한 을 처리하는 방법이 라이센스 검증에서 당신의 응용 프로그램입니다.

왜 나는 생각하십니까?아 첫째,당신이 요구하는 고객을 입력하는 지루하게 긴 라이센스 키를 의미하는 기계에 대한 소비,그리고 두 번째 귀하의 필요 당신과 당신의 고객의 추적을 유지했 지루하게 긴 라이센스 키가.

그럼 무엇이 있는 다른 방법이있다.내가 생각하는 가장 좋은 대안은 뭔가를 모든 고객에게는 사용: 할 수 있는 계정을 만들의 제품을 사용하여 이메일/비밀번호.과 연결할 수 있습의 모든 라이센스 그리고 그들의 기계 와 함께하는 계정이다.그래서 지금 대신 라이센스 키를 입력하에,그들은 단순히 사용하여 로그인이 그들의 자격 증명입니다.

어떤 장점은 당신에게? 첫째로,그것의 제거를 위해 필요 당신과 당신의 고객의 추적을 유지 라이센스 키, 이후 그것은 모두 처리하면 내부의 사용자 계정 그리고 가장 중요한 것은: 을 제공할 수 있습의 고객은 셀프 서비스 라이센스 및 기계 활성화! 즉이후로 모든 라이센스 및 기계와 관련 된 사용자 계정할 수 있습 프롬프트를 그들에게 라이센스를 구매할 때 불에서 응용 프로그램을 인식할 수 없는 기계입니다.

지금에 라이센스 검증:때마다 당신의 고객 로그 응용 프로그램으로 자신의 이메일/비밀번호를 쿼리할 수 있습니다 그들의 사용자 계정을 위한 라이센스는 그들은 자신의 결정을 사용할 수 있는 경우 기능 X기능 Y.그리고 이후 이제 응용 프로그램 셀프 서비스, 할 수 있도록 허용할 수 있습 귀하의 고객이 구매하는 추가적인 기능 내에서 직접 응용 프로그램!

그래서 우리는 소개 ton 자동화하는 우리의 라이센스 시스템,우리가 할 수 있는 라이센스는 개별 특징 (i.e제한된 대전체 버전),우리가 제공하는 멋진 UX 에 대한 우리의 고객을하고 또한 우리는 완화된 가장 큰 이유 중 하나에 대한 요청을 지원: 라이센스 키를 복구합니다.

어쨌든,이 가지고 오지만 그것은 사람!

소프트웨어 불법 복제를 완전히 막을 수는 없습니다. 캐주얼 불법 복제를 방지 할 수 있으며 모든 라이센스 솔루션이 수행하는 것입니다.

라이센스 키 재사용을 방지하려면 노드 (기계) 잠긴 라이센스가 가장 좋습니다. 나는 사용하고있다 cryptlex 내 소프트웨어를 위해 약 1 년 동안. 그것은 있습니다 자유 계획 또한 너무 많은 고객을 기대하지 않으면 무료로 사용할 수 있습니다.

Quantum-Key.net과 같은 무료 타사 솔루션을 사용하여 무료이며 무료이며 귀하를 위해 생성하는 웹 판매 페이지를 통해 PayPal을 통해 지불을 처리하고, 이메일을 통해 발행하고, 특정 컴퓨터에 키 사용을 잠그십시오. 불법 복제를 방지하십시오.

또한 코드를 난독 화/암호화하거나 De4DOT 및 .NETReflector와 같은 소프트웨어를 사용하여 쉽게 리버스 엔지니어링 할 수 있습니다. 좋은 무료 코드 Oppuscator는 confuserex wich는 빠르고 사용하기가 간단하며 고가의 대안보다 효과적입니다.

De4Dot 및 .NETReflector를 통해 완성 된 소프트웨어를 실행하여 리버스 엔지니어링을 수행하고 크래커가 동일한 작업을 수행했는지 확인하고 중요한 코드가 노출되거나 규정되지 않은 상태로 남아 있지 않도록해야합니다.

귀하의 소프트웨어는 여전히 금이 갈 수 있지만 캐주얼 크래커의 경우이를 해제하기에 충분할 수 있으며 이러한 간단한 단계로 인해 코드가 추출 및 재사용되지 않습니다.

https://quantum-key.net

confuserex를 사용하는 방법?

https://github.com/0xd4d/de4dot

https://www.red-gate.com/dynamic/products/dotnet-development/reflector/download

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