오케이, 답변없이 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을 취할 수 있습니다.
적용하는 이러한 제한 및 하위 구분이 많을수록 각 유형의 키를 생성하는 데 더 오래 걸립니다.
악성 사용자가 배포 바이너리를 편집하여 검사를 완전히 건너 뛰지 않도록 방지하려면 어떻게합니까? –
그 질문에 대한 간단한 대답이 있다면 기본적으로 상업용 소프트웨어의 모든 부분에 균열이 없을 것입니다. – Ozzah
그건 제가 지적합니다. 형식 끝, GPG 서명 된 JSON 문서와 같이 사소한 것으로 들어가서 패치 된 바이너리를 발견하여 바람직하지 않은 용도로 사용하기 위해 리버스 엔지니어가 아닌 조치에 노력을 집중하는 것이 좋습니다. (즉각적인 실패로 이어지는 수표를 추적하는 것이 상대적으로 쉽기 때문에 수표가 런타임에 제대로 나타나지 않을 때 메모리가 손상되는 것은 훨씬 더 의미가 있습니다. 그러나 내가 꽤 오랫동안 참여하지 못했던 cat-and-mouse 게임이다.) –