[C#] 소프트웨어 라이센스 키를 생성하고 확인하는 방법은 무엇입니까?

현재 무료로 다운로드 할 수 있지만 매우 제한된 버전의 제품 (C #으로 개발)을 개발하고 있습니다. 사용자가 라이센스 비용을 지불하고 키를 받아야하는 모든 기능에 액세스하려면. 그런 다음이 키는 응용 프로그램에 입력되어 정식 버전을 “잠금 해제”합니다.

그런 라이센스 키를 사용하는 것이 평범한 것 같습니다.

  1. 보통 어떻게 해결 되나요?
  2. 키를 어떻게 생성하고 응용 프로그램에서 키를 어떻게 확인할 수 있습니까?
  3. 인터넷에 키가 게시되지 않고 라이센스를 지불하지 않은 다른 사람 (기본적으로 “자신의 키”가 아닌 키)이 키를 사용하지 않도록하려면 어떻게해야합니까?

어쨌든 키를 응용 프로그램 버전에 연결해야 기능 버전의 새 키를 청구 할 수 있습니다.

이 시나리오에서 고려해야 할 다른 것이 있습니까?



답변

주의 사항 : 사용자가 불법 복제하는 것을 막을 수는 없지만 정직한 사용자가 올바른 일을 더 쉽게 수행 할 수 있습니다.

각 사용자에 대해 특수 빌드를 원하지 않는다고 가정하면 다음을 수행하십시오.

  • 제품의 비밀 키 생성
  • 사용자의 이름을
  • SHA1을 사용하여 사용자 이름과 비밀 키 및 해시 연결
  • SHA1 해시를 영숫자 문자열로 압축 해제하십시오. 이것은 개별 사용자의 “제품 키”입니다
  • 프로그램 내에서 동일한 해시를 수행하고 제품 키와 비교하십시오. 같으면 OK.

그러나 나는 반복한다. 이것은 불법 복제를 막지 못한다.


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

그래도 내가 이것을 언급해야한다고 생각했습니다. 이것으로부터 다른 것을 파생시킬 계획이라면 조심하십시오.


답변

라이센스 키를 생성하는 방법은 여러 가지가 있지만 실제로는 거의 안전하지 않습니다. 기업에게는 라이센스 키가 실제 현금과 거의 같은 가치를 가지기 때문에 유감입니다.

이상적으로 라이센스 키에 다음 속성이 있어야합니다.

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

  2. 라이센스 키는 한 대의 컴퓨터에서만 사용할 수 있어야합니다 (또는 최소한이 키를 매우 엄격하게 제어 할 수 있어야합니다).

  3. 라이센스 키는 짧고 전화를 통해 입력하거나 지시 할 수 있어야합니다. 키에 “l”또는 “1”이 포함되어 있는지 이해하지 못하기 때문에 모든 고객이 기술 지원 부서에 전화하는 것을 원하지 않습니다. 지원 부서가 이에 대해 감사 드리며이 분야에서 비용이 절감됩니다.

그렇다면 이러한 과제를 어떻게 해결합니까?

  1. 대답은 간단하지만 기술적으로 까다 롭습니다. 공개 키 암호화를 사용하는 디지털 서명. 라이센스 키에는 실제로 회사의 개인 키로 서명 된 유용한 데이터가 포함 된 “문서”에 서명해야합니다. 서명은 라이센스 키의 일부 여야합니다. 제품은 해당 공개 키로 라이센스 키의 유효성을 검사해야합니다. 이렇게하면 누군가 제품의 논리에 완전히 액세스 할 수 있어도 개인 키가 없기 때문에 라이센스 키를 생성 할 수 없습니다. 라이센스 키는 다음과 같습니다. BASE32 (CONCAT (DATA, PRIVATE_KEY_ENCRYPTED (HASH (DATA)))) 여기서 가장 큰 문제는 기존 공개 키 알고리즘의 서명 크기가 큰 것입니다. RSA512에는 1024 비트 서명이 있습니다. 라이센스 키에 수백 자의 문자를 사용하지 않으려는 경우 가장 강력한 접근 방법 중 하나는 타원 곡선 암호화를 사용하는 것입니다 (기존 특허를 피하기 위해 신중하게 구현). ECC 키는 동일한 강도를 위해 RSA 키보다 6 배 짧습니다. Schnorr 디지털 서명 알고리즘 (2008 년에 만료 된 특허-양호)과 같은 알고리즘을 사용하여 서명 크기를 추가로 줄일 수 있습니다.

  2. 제품 정품 인증을 통해 얻을 수 있습니다 (Windows가 좋은 예입니다). 기본적으로 유효한 라이센스 키가있는 고객의 경우 컴퓨터의 하드웨어 ID를 서명 된 데이터로 포함하는 서명 된 메시지 인 “활성화 데이터”를 생성해야합니다. 이것은 일반적으로 인터넷을 통해 이루어 지지만 ONCE에만 해당됩니다. 제품은 라이센스 키와 컴퓨터 하드웨어 ID를 활성화 서버로 보내고 활성화 서버는 서명 된 메시지를 다시 보냅니다. 전화). 그 순간부터 제품은 시작시 라이센스 키를 확인하지 않지만 정품 확인 데이터를 확인하려면 컴퓨터가 동일해야합니다 (그렇지 않으면 DATA가 다르고 디지털 서명이 확인되지 않음).

  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 .

키를 생성하는 데 사용하는 키의 하위 집합 만 배포 가능 파일로 컴파일해야한다는 “부분 키 확인”시스템을 기반으로합니다. 자체적으로 키를 생성하므로 라이센스 구현이 소프트웨어에 고유합니다.

위에서 언급했듯이 코드를 디 컴파일 할 수 있으면 대부분의 라이센싱 시스템을 우회하는 것이 상대적으로 쉽습니다.


답변

저는 Cryptolens 소프트웨어 라이센싱 플랫폼 의 개발자 중 한 명이며 14 세 이후 라이센싱 시스템에서 일해 왔습니다.

이를 해결하는 가장 좋은 방법은 라이센스 키를 확인하기 위해 애플리케이션의 각 인스턴스가 호출 할 라이센스 키 서버를 설정하는 것입니다.

라이센스 키 서버의 장점

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

  1. 라이센스 키를 항상 즉시 업데이트하거나 차단할 수 있습니다.
  2. 각 라이센스 키는 특정 수의 컴퓨터에 고정 될 수 있습니다 (이는 사용자가 다른 사용자가 사용할 수 있도록 라이센스 키를 온라인으로 게시하지 못하게합니다).

고려 사항

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

해결책은 항상 RSA 또는 ECC와 같은 공개 키 암호화 시스템을 사용하여 서버에서 라이센스 키 응답에 서명하는 것입니다 (내장 시스템에서 실행하려는 경우 더 좋을 수 있음). 애플리케이션 에는 라이센스 키 응답을 확인할 수있는 공개 키만 있어야합니다 .

따라서 인터넷에 연결되어 있지 않으면 이전 라이센스 키 응답을 대신 사용할 수 있습니다. 응답에 날짜컴퓨터 식별자 를 모두 저장 하고 너무 오래되지 않았는지 (예 : 사용자가 최대 30 일 동안 오프라인 상태가되도록 허용) 라이센스 키 응답이 올바른 장치에 속하는지 확인하십시오.

참고 이 여전히 수행해야합니다 (인터넷에 연결되어있는 경우에도 당신은 항상 서버를 왼쪽 이후 변경되지 않았는지 확인하기 위해), 라이센스 키 응답의 인증서를 확인해야합니다 경우에도 귀하의 API 라이센스 키 서버는 https를 사용합니다)

비밀 알고리즘 보호

대부분의 .NET 응용 프로그램은 매우 쉽게 리버스 엔지니어링 될 수 있습니다 (IL 코드를 얻기 위해 Microsoft에서 제공하는 디 어셈블러가 있으며 일부 상용 제품은 소스 코드 (예 : C #)를 검색 할 수도 있음). 물론 코드를 항상 난독 처리 할 수 ​​있지만 100 % 안전하지는 않습니다.

대부분의 경우, 모든 소프트웨어 라이센싱 솔루션의 목적은 정직한 사람들이 정직하도록 도와주는 것입니다 (즉, 지불하고자하는 정직한 사용자는 평가판이 만료 된 후에 지불하는 것을 잊지 마십시오).

그러나 여전히 대중에게 유출하고 싶지 않은 코드 (예 : 주가 예측 알고리즘 등)가있을 수 있습니다. 이 경우 갈 수있는 유일한 방법 은 메소드를 실행할 때마다 애플리케이션이 호출 할 API 엔드 포인트 를 작성하는 것입니다. 인터넷 연결이 필요하지만 클라이언트 시스템에서 비밀 코드를 실행하지 않도록합니다.

이행

당신이 모든 것을 직접 구현하지 않으려면, 내가 한 번 봐 걸릴 추천 이 튜토리얼을 (의 일부 Cryptolens )