2011-04-06 2 views
4

프로그램을 작성하여 사람들에게 배포하려고한다고 가정 해 봅시다. 설치 중에 사용자에게 일련 번호를 요청하여 라이센스가 부여 된 소프트웨어 복사본이 있는지 확인합니다. 또한 일련 번호에 액세스 할 수있는 소프트웨어 버전과 라이센스 만료일을 저장해야합니다.소프트웨어 일련 번호 구현

  1. 는 사용자가 소프트웨어를 구입 서버의 시리얼을 생성하고 그들에게 이메일을 보내 :

    이 작업을 수행하기 위해 내가 생각할 수있는 적어도 두 개념 방법이 있습니다. 소프트웨어가 설치 중에 서버에 연결되어 제품을 활성화합니다. 서버는 라이센스 특권과 만기를 리턴합니다. 시리얼에는 특정 형식/수학적 규칙이 없으며 단순히 서버의 데이터베이스에 대해 확인됩니다.

  2. 고객 용 시리얼을 생성하여 이메일로 보내십시오. 시리얼에는 프로그램이 유효한지, 어떤 라이센스에 해당하는지, 만료 될 때를 확인할 수있는 몇 가지 특별한 수학적 속성이 있습니다.

저는 주로 두 번째 방법에 관심이 있습니다. 이 정보를 일련 번호로 인코딩하는 데 어떤 기술이 사용됩니까? 당신이 위대한 것이라고 간단한 개요를 줄 수 있다면. 그렇지 않으면, 좋은 책이나 이것을 토론하는 웹 사이트를 추천 할 수 있습니까?

필자는 지난 몇 년 동안 코딩을 해왔지만 실제로 이러한 기술의 구현이나 설명을 본 적이 전혀 없다는 것을 알게되었습니다.

답변

1

오케이, 답변없이 2 주. 기본 방법을 사용하여 상대적으로 안전하고 확장 성이 뛰어난 일련 번호를 생성하는 데 매우 간단한 방법으로 대답하겠습니다.

수학자로서 모든 종류의 정보를 일련 번호에 저장하는 몇 가지 고급 기술이 있음을 확신하지만 저는 주로 빠르고 흙에 관심이 있습니다.

여기 순진, 비 수학, 무차별 기술은 고려의 :

사용하려는 문자를 포함하는 byte[] 배열을 만듭니다. 16 진수 만 사용할 수는 있지만 제한 할 이유는 없습니다. 영숫자 범위에서 '0'/ 'O', '1'/ 'I'(분명한 이유로)를 사용하지 않는 것이 좋습니다.

byte[] genRandomSerial(int length, byte[] characters, Random r) 
{ 
    var sn = new byte[length]; 

    for (int i = 0; i < length; i++) 
    sn[i] = characters[r.Next(0, characters.Length)]; 

    return sn; 
} 

이 당신에게 우리가 모르는 임의 일련 번호를 줄 것이다 유효 여부를 다음과 같이

다음, 함수를 작성 (예 : C#을)입니다.

다음 :

int sum(byte[] sn, MD5 md5) 
{ 
    val = 0; 

    foreach (byte b in md5.ComputeHash(sn)) 
    val += (int)b; 

    return val; 
} 

하고

bool validate(byte[] sn, uint radix, uint expected, MD5 md5) 
{ 
    return (sum(sn, md5) % radix == expected); 
} 

는 우리가 지금있는 것은 MD5의 16 바이트 출력을 함께 합산 해싱 함수 및 평가 방법은 합산 모듈 여부 n은 일부 x과 같습니다.

이제, 얼마나 많은 일련 번호를 만들고 싶은지 결정하십시오. 일련 번호가 많을수록 누군가가 임의로 올바른 조합을 추측하게됩니다.

임의의 일련 번호를 블록으로 분할합니다.

이 일련 번호 중 5 개 배열을 만들기 ABCD-EFGH-IJKL - MNOP-QRST :의 양식에 20 개 문자를주고, 5 개 블록 4의 가정 해 봅시다

{A, B, C, D} {E, F, G, H}, {I, J, K, L}, {M, N, O, P} 및 {Q, R, S, T}

2로 기수를 설정하면
if (validate(block1, radix, expected, md5)) 
    // This block is valid. 

가 다음 블록이 유효 할 것이라는 확률이 1/2이 : 당신의 5 개 배열은 다음과 같이 검증 경우

시험을 볼 수 있습니다. 기수를 10으로 설정하면 블록이 유효 할 확률이 1/10입니다. 5 개의 블럭이 있고 radits를 각각 10으로 설정하면 전체 일련 번호가 유효 할 확률은 0.1^5 = 0.00001입니다. (즉, 모든 100000 건의 랜덤 시리얼이 유효합니다. 즉, 영숫자 범위에서 '0'/ 'O', '1'/ 'I'을 사용하면 (8 + 24)^n * 연속 길이가 20 인 경우 0.00001 = ~ 1.2 * 10^19 개의 유효한 키입니다. 많은 경우입니다.하지만 어쨌든 모든 키를 찾을 수는 없습니다. 기수가 높을수록 일련 번호가 안전하고, 그러나 생성하는 데 더 오래 걸립니다).

'예상'은 0과 기수 -1 사이 여야합니다..

이제는 특정 일련 번호를 유효하게 확인하는 방법이 있지만 어떤 종류의 시리얼을 저장합니까? 사실, 우리는 이미 그것을 할 방법이 있습니다. 당신이 더 많은 키를 생성로

int licenseType = sum(sn, md5) % 4; // Where 4 is the number of licenses you want to have 

if (licenseType == 0) 
{ 
    // Evaluation 
} 
else if (licenseType == 1) 
{ 
    // Standard 
} 
else if (licenseType == 2) 
{ 
    // Full 
} 
else // licenseType == 3 
{ 
    // Unrestricted 
} 

라이센스의 각 유형의 수는 점차 평평합니다 : 전체 랜덤 (그러나 검증) 시리얼 'SN'을 복용합니다.

키에 추가 정보 (예 : 만료 날짜)를 저장하려면 비슷한 방법을 사용할 수 있습니다. 예를 들어, 12를 모듈로 12로 나누는 홀수 문자의 합계를 취하고, 만료일을 지정하기 위해 짝수 문자의 합계 31을 취할 수 있습니다.

적용하는 이러한 제한 및 하위 구분이 많을수록 각 유형의 키를 생성하는 데 더 오래 걸립니다.

+0

악성 사용자가 배포 바이너리를 편집하여 검사를 완전히 건너 뛰지 않도록 방지하려면 어떻게합니까? –

+0

그 질문에 대한 간단한 대답이 있다면 기본적으로 상업용 소프트웨어의 모든 부분에 균열이 없을 것입니다. – Ozzah

+1

그건 제가 지적합니다. 형식 끝, GPG 서명 된 JSON 문서와 같이 사소한 것으로 들어가서 패치 된 바이너리를 발견하여 바람직하지 않은 용도로 사용하기 위해 리버스 엔지니어가 아닌 조치에 노력을 집중하는 것이 좋습니다. (즉각적인 실패로 이어지는 수표를 추적하는 것이 상대적으로 쉽기 때문에 수표가 런타임에 제대로 나타나지 않을 때 메모리가 손상되는 것은 훨씬 더 의미가 있습니다. 그러나 내가 꽤 오랫동안 참여하지 못했던 cat-and-mouse 게임이다.) –

3

기본적으로 자신의 라이선스 모듈을 만드는 것이 좋습니다. 아무 문제가 없으며, 자신의 롤을 돌리면 무료입니다 (코드를 작성하고 디버깅 할 시간). 그러나 엄청나게 간단 해 지므로 어떤 종류의 라이센스 컴플라이언스 (예 : 복사 방지)를 얻기 위해이 작업을 수행하는 경우 귀찮게하지 않을 것입니다.

어떤 식 으로든 물리적 시스템에 바인드 하시겠습니까? 한 가지 방법은 CPU 일련 번호, HD 일련 번호, MAC 주소 등 또는 위의 일부 조합을 해시 한 다음 해시를 사용하여 라이센스가 유효한지 확인하기 위해 해시를 사용하는 것입니다. 물론 사용자가 아무 것도 변경하지 않으면 검사가 실패하고 유효한 라이센스가 있어도 소프트웨어가 더 이상 실행되지 않을 염려가 있습니다.

불법 복제 또는 사용에 대한 보호를 위해이 작업을 수행하는 경우 제안하는 스키마는 일반적으로 매우 간단합니다. 크래커는 올바른 라이센스를 확인하고 asm 코드를 패치 할 위치를 찾습니다. 그 주변에 가지를 세우거나 항상 긍정적 인 것을 되돌려 라.앱이. NET이면 소스 코드로 되돌리고 라이센스 확인 부분을 제거 할 수 있습니다.

면책 조항 : 저는 라이센스 관리/복사 방지 도구 회사 ([Wibu-Systems]) 1에서 일하고 있습니다. 이것은 대부분 우리가하는 일이므로 대부분의 시스템을 얼마나 쉽게 상쇄 할 수 있는지 알고 있습니다.

나는 세 가지 방법 중 하나를 권 해드립니다 :

  1. 이 보호되지 않은 앱에두고 비율이 합리적이다 해적판에 판매를 희망합니다.
  2. 간단한 시스템을 굴리십시오. 그러나 S/W에 가치가 있다면 누군가가 그것을 빠르고 쉽게 해독 할 것입니다. 약간의 복잡한 코딩과 유지 보수를 준비하여 반 정도만 수행하십시오.
  3. CodeMeter, HASP 또는 KeyLok과 같은 상용 품질의 보호 시스템을 구입하십시오. 일부는 다른 것보다 낫습니다 (우리는 우리가 자연적으로 최고라고 생각합니다). 그러나 아무 것도 자유롭지는 않습니다.