소프트웨어 라이센스 키를 생성하고 확인하는 방법은 무엇입니까?
현재 무료로 다운로드 할 수 있지만 매우 제한된 버전의 제품 (C #으로 개발)을 개발하고 있습니다. 사용자가 라이센스 비용을 지불하고 키를 받아야하는 모든 기능에 액세스하려면. 그런 다음이 키는 응용 프로그램에 입력되어 정식 버전을 "잠금 해제"합니다.
그런 라이센스 키를 사용하는 것이 평범한 것 같습니다.
- 보통 어떻게 해결 되나요?
- 키를 어떻게 생성하고 응용 프로그램에서 키를 어떻게 확인할 수 있습니까?
- 인터넷에 키가 게시되지 않고 라이센스를 지불하지 않은 다른 사람 (기본적으로 "자신의 키"가 아닌 키)이 키를 사용하지 않도록하려면 어떻게해야합니까?
어떻게 든 키를 응용 프로그램 버전에 연결해야 기능 버전의 새 키를 청구 할 수 있습니다.
이 시나리오에서 고려해야 할 다른 것이 있습니까?
주의 사항 : 사용자가 불법 복제하는 것을 막을 수는 없지만 정직한 사용자가 올바른 일을 더 쉽게 할 수 있습니다.
각 사용자에 대해 특별 빌드를 원하지 않는다고 가정하면 다음을 수행하십시오.
- 제품의 비밀 키 생성
- 사용자의 이름을
- SHA1을 사용하여 사용자 이름과 비밀 키 및 해시 연결
- SHA1 해시를 영숫자 문자열로 압축 해제하십시오. 이것은 개별 사용자의 "제품 키"입니다
- 프로그램 내에서 동일한 해시를 수행하고 제품 키와 비교하십시오. 같으면 OK.
그러나 나는 반복한다 : 이것은 불법 복제를 막지 않을 것이다
나는 최근에이 접근법이 암호 적으로 그리 건전하지 않다는 것을 읽었습니다. 그러나이 솔루션은 이미 약합니다 ( 소프트웨어 자체에는 어딘가에 비밀 키가 포함되어야 함 ).이 발견으로 인해 솔루션이 무효화되는 것으로 생각하지 않습니다.
그래도 내가 이것을 언급해야한다고 생각했습니다. 이것으로부터 다른 것을 파생시킬 계획이라면 조심하십시오.
라이센스 키를 생성하는 방법은 여러 가지가 있지만 실제로는 거의 안전하지 않습니다. 기업에게는 라이센스 키가 실제 현금과 거의 같은 가치를 가지기 때문에 유감입니다.
라이센스 키에 다음과 같은 속성이있는 것이 이상적입니다.
누군가가 귀하의 제품을 완전히 리버스 엔지니어링하더라도 (귀하의 경험으로 말하면) 회사 만이 귀하의 제품에 대한 라이센스 키를 생성 할 수 있어야합니다. 라이센싱 제어가 진지한 경우 알고리즘을 난독 처리하거나 소프트웨어 내에 암호화 키를 숨기는 것은 실제로 문제가되지 않습니다. 귀하의 제품이 성공하면 누군가는 출시 후 며칠 안에 키 생성기를 만들 것입니다.
라이센스 키는 한 대의 컴퓨터에서만 사용할 수 있어야합니다 (또는 최소한이 키를 매우 엄격하게 제어 할 수 있어야합니다).
라이센스 키는 짧고 전화를 통해 입력하거나 지시 할 수 있어야합니다. 키에 "l"또는 "1"이 포함되어 있는지 이해하지 못하기 때문에 모든 고객이 기술 지원 부서에 전화하는 것을 원하지 않습니다. 지원 부서에서이 점에 대해 감사 드리며이 분야에서 비용이 절감됩니다.
그렇다면 이러한 과제를 어떻게 해결합니까?
대답은 간단하지만 기술적으로 까다 롭습니다. 공개 키 암호화를 사용하는 디지털 서명. 라이센스 키에는 실제로 회사의 개인 키로 서명 된 유용한 데이터가 포함 된 "문서"에 서명해야합니다. 서명은 라이센스 키의 일부 여야합니다. 제품은 해당 공개 키로 라이센스 키의 유효성을 검사해야합니다. 이렇게하면 누군가 제품의 논리에 완전히 액세스 할 수 있어도 개인 키가 없기 때문에 라이센스 키를 생성 할 수 없습니다. 라이센스 키는 다음과 같습니다. BASE32 (CONCAT (DATA, PRIVATE_KEY_ENCRYPTED (HASH (DATA)))) 여기서 가장 큰 문제는 클래식 공개 키 알고리즘의 서명 크기가 크다는 것입니다. RSA512에는 1024 비트 서명이 있습니다. 라이센스 키에 수백 자의 문자를 포함시키지 않기를 바랍니다. 가장 강력한 접근 방법 중 하나는 타원 곡선 암호화를 사용하는 것입니다 (기존 특허를 피하기 위해 신중하게 구현). ECC 키는 동일한 강도를 위해 RSA 키보다 6 배 짧습니다. Schnorr 디지털 서명 알고리즘 (2008 년에 만료 된 특허 : 양호)과 같은 알고리즘을 사용하여 서명 크기를 추가로 줄일 수 있습니다.
제품 정품 인증을 통해 얻을 수 있습니다 (Windows가 좋은 예입니다). 기본적으로 유효한 라이센스 키가있는 고객의 경우 컴퓨터의 하드웨어 ID를 서명 된 데이터로 포함하는 서명 된 메시지 인 "활성화 데이터"를 생성해야합니다. 이 작업은 일반적으로 인터넷을 통해 이루어 지지만 ONCE에만 해당됩니다. 제품은 라이센스 키와 컴퓨터 하드웨어 ID를 활성화 서버로 보내고 활성화 서버는 서명 된 메시지를 다시 보냅니다 (이 메시지는 짧고 쉽게 지시 할 수 있음). 전화). 그때부터 제품은 시작시 라이센스 키를 확인하지 않지만 정품 확인 데이터를 확인하려면 컴퓨터가 동일해야합니다 (그렇지 않으면 DATA가 다르고 디지털 서명이 확인되지 않음).
키에서 "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이 하드 드라이브 일련 번호에 액세스 할 수 있다고 생각합니다.
당신은 프로그램이 당신에게 그와 다른 것들을 보낼 수 있습니다 (사용자 이름과 nic의 mac 주소와 같은)
이를 기반으로 코드를 계산하고 키를 이메일로 보냅니다.
그들은 열쇠를 가진 후에 기계를 전환하지 못하게 할 것입니다.
저는 Cryptolens 소프트웨어 라이센싱 플랫폼 의 개발자 중 한 명이며 14 세 이후 라이센싱 시스템에서 일해 왔습니다.이 답변에는 몇 년 동안 얻은 경험을 바탕으로 몇 가지 팁이 포함되어 있습니다.
이를 해결하는 가장 좋은 방법은 라이센스 키를 확인하기 위해 애플리케이션의 각 인스턴스가 호출 할 라이센스 키 서버를 설정하는 것입니다.
라이센스 키 서버의 장점
라이센스 키 서버의 장점은 다음과 같습니다.
- 라이센스 키를 항상 즉시 업데이트하거나 차단할 수 있습니다.
- 각 라이센스 키는 특정 수의 컴퓨터에 고정 될 수 있습니다 (이는 사용자가 다른 사용자가 사용할 수 있도록 라이센스 키를 온라인으로 게시하지 못하게합니다).
고려 사항
온라인으로 라이센스를 확인하면 응용 프로그램의 각 인스턴스를보다 강력하게 제어 할 수 있지만 인터넷 연결이 항상 존재하는 것은 아니며 (특히 대기업을 대상으로하는 경우) 라이센스 키 확인을 수행하는 다른 방법이 필요합니다.
해결 방법은 항상 RSA 또는 ECC와 같은 공개 키 암호화 시스템을 사용하여 서버에서 라이센스 키 응답에 서명하는 것입니다 (내장 시스템에서 실행하려는 경우 더 좋을 수 있음). 애플리케이션 에는 라이센스 키 응답을 확인하기 위한 공개 키만 있어야합니다 .
따라서 인터넷에 연결되어 있지 않으면 이전 라이센스 키 응답을 대신 사용할 수 있습니다. 응답에 날짜 와 컴퓨터 식별자 를 모두 저장 하고 너무 오래되지 않았는지 (예 : 사용자가 최대 30 일 동안 오프라인 상태가되도록 허용) 라이센스 키 응답이 올바른 장치에 속하는지 확인하십시오.
참고 이 여전히 수행해야합니다 (인터넷에 연결되어있는 경우에도 당신은 항상 서버를 왼쪽 이후 변경되지 않았는지 확인하기 위해), 라이센스 키 응답의 인증서를 확인해야합니다 경우에도 귀하의 API 라이센스 키 서버는 https를 사용합니다)
비밀 알고리즘 보호
대부분의 .NET 응용 프로그램은 매우 쉽게 리버스 엔지니어링 될 수 있습니다 (IL 코드를 얻기 위해 Microsoft에서 제공하는 디 어셈블러가 있으며 일부 상용 제품은 소스 코드를 C #과 같이 검색 할 수도 있음). 물론 코드를 항상 난독 처리 할 수 있지만 100 % 안전하지는 않습니다.
대부분의 경우, 모든 소프트웨어 라이센싱 솔루션의 목적은 정직한 사람들이 정직하도록 도와주는 것입니다 (즉, 지불하고자하는 정직한 사용자는 평가판이 만료 된 후에 지불하는 것을 잊지 마십시오).
그러나 여전히 대중에게 유출하고 싶지 않은 코드 (예 : 주가 예측 알고리즘 등)가있을 수 있습니다. 이 경우 갈 수있는 유일한 방법 은 메소드를 실행할 때마다 애플리케이션이 호출 할 API 엔드 포인트 를 작성하는 것입니다. 인터넷 연결이 필요하지만 클라이언트 컴퓨터가 비밀 코드를 실행하지 않도록합니다.
이행
당신이 모든 것을 직접 구현하지 않으려면, 내가 한 번 봐 걸릴 추천 이 튜토리얼을 (의 일부 Cryptolens )
요청한 모든 작업을 수행 할 수있는 유일한 방법은 인터넷 액세스 및 서버 확인이 필요합니다. 응용 프로그램은 키를 사용하여 서버에 로그인 한 다음 IP 주소와 같은 세션 세부 정보를 저장해야합니다. 이렇게하면 여러 다른 컴퓨터에서 키를 사용할 수 없습니다. 이것은 일반적으로 응용 프로그램 사용자에게 인기가 없으며 매우 비싸고 복잡한 응용 프로그램이 아니라면 가치가 없습니다.
응용 프로그램에 대한 라이센스 키를 보유한 다음 키가 양호하면 클라이언트 쪽을 확인할 수 있지만이 키를 다른 사용자에게 쉽게 배포 할 수 있으며 디 컴파일러를 사용하여 새 키를 생성 할 수 있습니다.
서버의 데이터베이스에 저장된 라이센스를 나타내는 라이센스 키가 필요한 회사 소프트웨어 (C # .net)에서 인터넷 기반 일회성 활성화를 구현했습니다. 소프트웨어는 키를 사용하여 서버에 도달 한 후 클라이언트 컴퓨터에서 일부 변수 (CPUID와 자주 변경되지 않는 다른 항목의 조합)에서 생성 된 RSA 키를 사용하여 로컬로 암호화 된 라이센스 정보를 제공 받아 저장합니다. 레지스트리
서버 측 코딩이 필요하지만 실제로 잘 작동했으며 브라우저 기반 소프트웨어로 확장했을 때 동일한 시스템을 사용할 수있었습니다. 또한 영업 사원에게 소프트웨어를 사용하는 사람, 장소 및 시간에 대한 훌륭한 정보를 제공합니다. 로컬로만 처리되는 모든 라이센싱 시스템은 특히 .NET에 반영되어 악용 될 수 있습니다. 그러나 다른 사람들이 말했듯이 시스템이 완전히 안전한 것은 아닙니다.
제 생각에는 웹 기반 라이센스를 사용하지 않는다면 소프트웨어를 전혀 보호 할 필요가 없습니다. DRM으로 인해 발생할 수있는 두통 때문에 실제로 비용을 지불 한 사용자에게는 불공평합니다.
라이센스 생성에 필요한 필수 정보를 소스 코드에 포함 할 필요가 없기 때문에 공개 키 암호화 기반 라이센스 시스템 만 올바른 접근 방식이라고 생각합니다.
과거에는 Treek의 Licensing Library를 여러 번 사용 했습니다.이 요구 사항을 충족하고 정말 좋은 가격을 제공하기 때문입니다. 최종 사용자와 그 자체에 대해 동일한 라이센스 보호 기능을 사용하며 지금까지 아무도이를 해독하지 못했습니다. 불법 복제 및 크래킹을 피하기 위해 웹 사이트에서 유용한 팁을 찾을 수도 있습니다.
언급 한 몇 가지 다른처럼, 나는 거대한 해요 상대 라이센스 산업은 악명 것을 기본 무언가에 의해 고객에게 적대적되는. 따라서 귀하의 문제에 대한 우수한 솔루션을 확장 하여 우수한 고객 UX를 제공 할 것 입니다.
우선, 추가 기능을 위해 고객을 "업그레이드"로 전환하는 데 사용하는 "제한된"버전의 소프트웨어가 있다고 언급했습니다. 따라서 찾고있는 것은 제품의 기능 라이센스 입니다. 예를 들어 고객은 feature-X 또는 feature-Y 라이센스를 구입할 수 있습니다 .
이러한 유형의 라이센스를 염두에두고 Keygen 을 구축했습니다 . Keygen은 사용자 계정, 라이센스를 관리하고 시스템 사용 / 연결을 추적 할 수있는 라이센스 REST API입니다.
내가 할 것은 2 가지 라이센스 유형 ( Keygen 내의 정책 )을 설정하는 것입니다. 하나는 제한된 무료 버전에 대한 기본 정책이고 다른 하나는 유료 버전에 대한 정책입니다.
결제에 무엇을 사용하고 있는지 잘 모르겠지만 webhook 을 제공하는 Stripe (현재는 표준)와 같은 것을 사용한다고 가정 해 봅시다 . Keygen에는 webhook도 있습니다 (사용 여부에 관계없이이 모든 것이 여전히 적용 가능함). Keygen을 통합하여 양쪽에서 웹 후크를 사용하여 지불 제공 업체와 대화 할 수 있습니다 (생각 : customer.created
-> 고객을위한 기본 라이센스 생성, license.created
-> 고객에게 새로운 라이센스를 청구).
따라서 웹 후크를 활용하여 신규 고객을위한 라이센스 생성을 자동화 할 수 있습니다. 그렇다면 애플리케이션 자체의 라이센스 유효성 검사는 어떻습니까? 이는 다양한 방법으로 수행 할 수 있지만 가장 보편적 인 방법은 고객이 입력 필드에 긴 라이센스 키를 입력하여 검증 할 수 있도록하는 것입니다. 이것이 응용 프로그램에서 라이센스 유효성 검사를 처리 하는 끔찍한 방법 이라고 생각 합니다.
왜 그렇게 생각합니까? 우선, 고객은 기계 소비를위한 엄청나게 긴 라이센스 키를 입력 해야 하고, 둘째 로 귀하와 고객이 엄청나게 긴 라이센스 키를 추적하도록 요구해야합니다 .
좋아, 대안은 무엇입니까? 최선의 대안은 모든 고객이 익숙한 작업을 수행하는 것입니다. 고객이 이메일 / 비밀번호를 사용하여 제품 계정을 만들 수 있도록 허용합니다 . 그런 다음 모든 라이센스 와 해당 머신 을 해당 계정에 연결할 수 있습니다 . 이제 라이센스 키를 입력하는 대신 자격 증명을 사용하여 간단히 로그인 할 수 있습니다.
그것이 당신에게 어떤 이점을 제공합니까? 첫째, 라이센스 키를 추적해야 할 필요성이 사라집니다. 라이센스 키 는 모두 사용자 계정 내부에서 뒤에서 처리 되며 가장 중요하게 는 고객에게 셀프 서비스 라이센스 및 시스템을 제공 할 수 있기 때문입니다. 활성화! 즉, 모든 라이센스 및 컴퓨터가 사용자 계정과 연결되어 있기 때문에 인식되지 않은 컴퓨터에서 응용 프로그램을 실행할 때 라이센스를 구매하라는 메시지를 표시 할 수 있습니다.
이제 라이센스 유효성 검사 : 고객이 이메일 / 암호를 사용하여 애플리케이션에 로그인 할 때마다 고객이 자신의 라이센스에 대해 사용자 계정을 쿼리하여 feature-X 또는 feature-Y를 사용할 수 있는지 여부를 결정할 수 있습니다 . 이제 응용 프로그램이 셀프 서비스 이기 때문에 고객이 응용 프로그램 내에서 직접 추가 기능을 구입할 수 있습니다!
우리가 도입했습니다 그래서 t 우리의 라이센스 시스템에 자동화를, 우리는 각각의 라이센스 수있는 기능 (풀 버전 대 제한 즉), 우리는 제공 한 멋진 우리의 고객을위한 UX를 우리는 또한 가장 큰 이유 중 하나 완화했습니다 지원 요청 : 라이센스 키 복구.
어쨌든, 이것은 길었지만 희망적으로 누군가를 돕습니다!
소프트웨어 불법 복제를 완전히 막을 수는 없습니다. 불법 복제를 방지 할 수 있으며 이것이 모든 라이센싱 솔루션이하는 일입니다.
라이센스 키 재사용을 방지하려면 노드 (시스템) 잠금 라이센스가 가장 좋습니다. 저는 현재 약 1 년 동안 내 소프트웨어에 Cryptlex 를 사용 하고 있습니다. 그것은이 무료로 계획을 당신이 무료로 사용할 수 있습니다 너무 많은 고객을 기대하지 않는다, 그래서 만약,도.
무료 타사 솔루션을 사용하여 Quantum-Key.Net과 같이이를 처리 할 수 있습니다. 무료이며 웹을 통해 생성되는 웹 판매 페이지를 통해 페이팔을 통해 지불을 처리하고, 이메일을 통해 키를 발행하고 특정 컴퓨터에 대한 키 사용을 잠급니다. 불법 복제 방지
또한 코드를 난독 처리 / 암호화해야하며 De4dot 및 .NetReflector와 같은 소프트웨어를 사용하여 쉽게 리버스 엔지니어링 할 수 있습니다. 좋은 무료 코드 난독 화기는 ConfuserEx로 빠르고 사용하기 쉽고 값 비싼 대안보다 효과적입니다.
완성 된 소프트웨어를 De4Dot 및 .NetReflector를 통해 실행하여 리버스 엔지니어링하고 크래커가 동일한 작업을 수행했는지 확인하고 중요한 코드가 노출되거나 위장되지 않은 상태로 두지 않도록해야합니다.
소프트웨어는 여전히 크랙킹이 가능하지만 일반적인 크래커의 경우 소프트웨어를 해제하기에 충분할 수 있으며 이러한 간단한 단계는 코드 추출 및 재사용을 방해합니다.
https://github.com/0xd4d/de4dot
https://www.red-gate.com/dynamic/products/dotnet-development/reflector/download
참고 URL : https://stackoverflow.com/questions/599837/how-to-generate-and-validate-a-software-license-key
'IT story' 카테고리의 다른 글
PyCharm :“연쇄 비교 단순화” (0) | 2020.04.24 |
---|---|
다른 디렉토리에서 Maven을 실행하는 방법 (프로젝트 디렉토리에 cd없이)? (0) | 2020.04.24 |
SHA512 대 복어 및 Bcrypt [폐쇄] (0) | 2020.04.24 |
Vagrant '기본'컴퓨터 이름을 변경하는 방법? (0) | 2020.04.24 |
동네 짱 항아리는 무엇입니까? (0) | 2020.04.24 |