소프트웨어 라이센스 키는 어떻게 생성됩니까?


361

라이센스 키는 불법 복제 방지 수단으로 사실상 표준입니다. 솔직히 말해서, 이것은 나에게로 파업 을 통해 축구화 (의) 보안을 정말 라이센스 키가 생성되는 방법을 아무 생각이 없지만,. 라이센스 키 생성의 좋은 (보안) 예는 무엇입니까? 어떤 암호화 기본 요소 (있는 경우)를 사용하고 있습니까? 메시지 요약입니까? 그렇다면 어떤 데이터를 해싱합니까? 크래커가 자체 키 생성기를 구축하기 어렵게하기 위해 개발자는 어떤 방법을 사용합니까? 키 생성기는 어떻게 만들어 집니까?


8
+1 재미있는 질문, 아마도 답변자가이 주제에 대한 추가 자료를 볼 수있는 좋은 자료에 대한 링크를 게시 할 수 있습니까? : :
Jacob

44
프로그램을 실행하는 데 필요한 모든 코드와 데이터가 사용자에게 제공 되었기 때문에 모든 DRM 체계는 본질적으로 모호한 체계입니다. 이 체계는 패치를 어렵게 만들기 위해 임의로 난독화할 수 있지만, 검사를 피하기 위해 코드를 패치 할 수 있다는 것은 확실합니다.
caf

5
CD 키는 실제로 모호함을 통한 보안입니다. 그것들을 빌드하는 방법에는 여러 가지가 있지만 모두 키를 확인하는 데 필요한 비밀을 프로그램에 포함시키는 데 의존해야합니다.
Nick Johnson

4
이를 사용하는 대부분의 소프트웨어는 CD보다 온라인으로 제공 될 가능성이 높으므로 지금 은 제품 키 또는 라이센스 키라고합니다.
Joel Coehoorn

4
언젠가는 어린 시절의 꿈에 대해 걱정해야 할 앱을 만들고 싶습니다. 웹 응용 프로그램은 그것을 자르지 않습니다.
Znarkus

답변:


268

구식 CD 키의 경우, CD 키 (모든 문자열 일 수 있음)를 쉽게 생성하고 확인할 수있는 알고리즘을 구성하는 것이었지만 유효 CD 키와 유효하지 않은 CD의 비율 -키는 너무 작아서 무작위로 CD 키를 추측해도 올바른 키를 얻지 못할 수 있습니다.

IT를 수행하는 방법이 잘못되었습니다 :

스타 크래프트반감기는 모두 같은 체크섬을 사용했습니다. 13 자리는 첫 12 자리를 확인했습니다. 따라서 첫 12 자리에는 아무 것도 입력 할 수없고 13 자리 (10 개의 가능성 만 있음)를 추측하면 악명 높은1234-56789-1234

확인 알고리즘은 공개이며 다음과 같습니다.

x = 3;
for(int i = 0; i < 12; i++)
{
    x += (2 * x) ^ digit[i];
}
lastDigit = x % 10;

IT를 수행하는 올바른 방법

Windows XP 는 많은 정보를 가져 와서 암호화 한 다음 문자 / 숫자 인코딩을 스티커에 넣습니다. 이를 통해 MS는 키를 확인 하고 동시에 제품 유형 (Home, Professional 등)을 얻을 수있었습니다. 또한 온라인 활성화가 필요합니다.
전체 알고리즘은 다소 복잡하지만 독일에서 출판 된 이 문서 (완전히 합법적입니다!) 에 잘 요약 되어 있습니다.

물론, 온라인 서비스 ( World of Warcraft 와 같은)를 제공하지 않는 한, 사용자가 무엇을 하든지 , 모든 유형의 복제 방지는 실속에 빠질 수 있습니다. ) CD 키 알고리즘 및 기타 모든 저작권 보호.

실제 올바른 방법 :

온라인 서비스의 경우 바이너리 파일을 사용하더라도 서버를 사용하여 서버를 인증해야 (예 : WoW 계정) 수명이 조금 더 단순 해집니다. 예를 들어 플레이 타임 카드를 구매할 때 사용되는 World of Warcraft의 CD 키 알고리즘은 다음과 같습니다.

  1. 매우 큰 암호로 안전한 난수를 생성하십시오.
  2. 데이터베이스에 저장하고 카드에 인쇄하십시오.

    그런 다음 누군가가 재생 시간 카드 번호를 입력하면 데이터베이스에 있는지 확인하고, 해당 번호 인 경우 해당 번호를 현재 사용자와 연결하여 다시 사용할 수 없도록합니다.

온라인 서비스의 경우 위의 체계를 사용 하지 않을 이유가 없습니다 . 다른 것을 사용 하면 문제가 발생할있습니다 .


47
Mathematica는 흥미로운 과정을 가지고 있습니다. 제품에는 고유 키가 제공되며 설치 파일은 두 번째 고유 키 (하드웨어 기반)를 생성합니다. 이 두 키는 모두 이름과 등록 정보가 포함 된 온라인 양식으로 입력 한 다음 소프트웨어를 실제로 잠금 해제하는 두 키를 기반으로 실제 키를 보내지 만 해당 특정 제품 키와 특정 하드웨어에 대해서만 해당 키를 보냅니다.
Dan

18
허, 1234-56789-1234스타 크래프트 키 는 알지 못했지만 키패드를 으깨고 다시 시도하여 검증기를 "강제로"만드는 데 5 분 밖에 걸리지 않았다는 것을 기억합니다.
fmark

18
또한 111-1111111을 유효한 cdkey (Visual Studio 6.0)로 사용할 수있게했던 과거의 일부 Microsoft 제품도 기억합니다.
hannson

25
1234-56789-1234에 대해 전혀 몰랐습니다. 대신, 우리는 열세 살을 사용했습니다! 3333333333333
ErikTJ

33
온라인 활성화의 문제점은 게시자가 업무를 중단 할 때 모두 망친다는 것입니다. 이러지 마십시오. 이런 일이 일어나고 언젠가는 심지어 마이크로 소프트에도 일어날 수 있습니다.
브래드

56

원래이 답변을 썼을 때 라이센스 키의 '오프라인'유효성 검사에 관한 문제라는 가정하에있었습니다. 대부분의 다른 답변은 온라인 확인을 처리하므로 처리하기가 훨씬 쉽습니다 (대부분의 로직은 서버 측에서 수행 할 수 있음).

오프라인 확인을 사용하면 가장 어려운 점은 수많은 고유 라이센스 키를 생성하고 쉽게 확인되지 않는 강력한 알고리즘 (예 : 간단한 확인 숫자)을 유지할 수 있다는 것입니다.

나는 수학에 정통하지는 않지만 이것을하는 한 가지 방법 은 그래프를 그리는 수학 함수 를 사용하는 것입니다.

플롯 된 선은 (충분한 주파수를 사용하는 경우) 수천 개의 고유 한 점을 가질 수 있으므로 해당 그래프에서 임의의 점을 선택하고 어떤 방식 으로든 값을 인코딩하여 키를 생성 할 수 있습니다

여기에 이미지 설명을 입력하십시오

예를 들어이 그래프를 플로팅하고 4 개의 점을 선택하고 "0, -500; 100, -300; 200, -100; 100,600"과 같은 문자열로 인코딩합니다.

우리는 알려진 고정 키로 문자열을 암호화하고 (거의 약하지만 목적을 제공합니다) Base32 를 통해 결과 바이트를 변환 하여 최종 키를 생성합니다

그런 다음 응용 프로그램은이 프로세스 (base32를 실수로 해독, 해독, 포인트 디코딩)를 취소 한 다음 각 포인트가 비밀 그래프에 있는지 확인할 수 있습니다.

상당히 많은 양의 고유하고 유효한 키를 생성 할 수있는 상당히 적은 양의 코드

그러나 모호한 보안은 매우 안전합니다. 코드를 분해하는 데 시간을 내면 누구나 그래프 기능과 암호화 키를 찾은 다음 키 생성기를 조롱 할 수 있지만, 불법 복제를 늦추는 데 매우 유용 할 것입니다.


6
아니, 에릭 X는 정수이고 Y는 함수의 바닥입니다.
Joshua

이전 GPS 이전 위성 탐색 방식과는 다릅니다. youtube.com/watch?v=BBOsQBuCJfs
브래드

34

다음 요구 사항을 다루는 부분 키 확인 에 대한 tis 기사를 확인하십시오 .

  • 라이센스 키는 입력하기에 충분히 쉬워야합니다.

  • 지불 거절 또는 도난당한 신용 카드로 구매할 경우 라이센스 키를 블랙리스트에 올릴 수 있어야합니다.

  • 키를 테스트 할“집에 전화”가 없습니다. 이 관행이 점점 더 널리 보급되고 있지만, 여전히 사용자로서 그것을 높이 평가하지 않으므로, 사용자들에게이를 따라달라고 요구하지 않을 것입니다.

  • 크래커가 출시 된 애플리케이션을 분해하고 작동하는 "키겐"을 생성하는 것은 불가능합니다. 이는 애플리케이션이 확인을위한 키를 완전히 테스트하지 않음을 의미합니다. 키 중 일부만 테스트해야합니다. 또한 응용 프로그램의 각 릴리스는 키의 다른 부분을 테스트해야합니다. 따라서 이전 릴리스를 기반으로 한 가짜 키는 이후 버전의 소프트웨어에서는 작동하지 않습니다.

  • 중요 : 합법적 인 사용자가 실수로 작동하는 것처럼 보이지만 인쇄상의 오류로 인해 향후 버전에서 실패하는 잘못된 키를 입력 할 수는 없습니다.


21

사람들이 실제로 CD 키를 생성하는 작업에 대한 경험이 없지만 온라인 활성화의 길을 가고 싶지 않다고 가정하면 키를 만들 수있는 몇 가지 방법이 있습니다.

  • 숫자는 (17)로 나눌 수 있어야합니다. 많은 키에 액세스 할 수 있지만 대부분의 잠재적 인 문자열은 유효하지 않을 것입니다. 마찬가지로 키의 체크섬이 알려진 값과 일치해야합니다.

  • 키의 전반부는 알려진 값으로 연결될 때 키의 후반까지 해시해야합니다. 그러나 프로그램에는 여전히 키를 생성하고 유효성을 검증하는 데 필요한 모든 정보가 포함되어 있습니다.

  • 알려진 값 + nonce를 (개인 키로) 암호화하여 키를 생성하십시오. 이는 해당 공개 키를 사용하여 해독하고 알려진 값을 확인하여 확인할 수 있습니다. 이제 프로그램에는 키를 생성하지 않고도 키를 확인할 수있는 충분한 정보가 있습니다.

이것들은 여전히 ​​공격에 열려 있습니다 : 프로그램은 여전히 ​​존재하며 검사를 우회하도록 패치 할 수 있습니다. Cleverer는 프로그램에 값을 저장하는 대신 세 번째 방법에서 알려진 값을 사용하여 프로그램의 일부를 암호화 할 수 있습니다. 그렇게하면 프로그램의 암호를 해독하기 전에 키의 사본을 찾아야하지만 암호를 한 번 복사하면 한 사람이 합법적 인 사본을 가져 와서 다른 사람이 소프트웨어에 액세스 할 수 있도록하는 데 여전히 취약합니다.


9
정말 주어진 것은 이름으로 논스을 선택하지었던 '한 번 사용 된 숫자'을 마련했다 누구든지 할 에헴의 날 누군가가 하나의 암호화 제안 할 때마다 킥킥하게 부정의 함축.
Ed James

2
공격자가 일반 텍스트에서 테스트를 리버스 엔지니어링하고 통과하는 것을 생성 한 다음 (알려진) 키와 (알려진) 사이퍼로 암호화 할 수 있기 때문에 세 번째 옵션은 대칭 키 사이퍼에서는 작동하지 않습니다. 직접 추출 할 수 있다면 NSA에서 일자리를 구해야하기 때문에자가 추출 암호를 사용하는 것은 해결책이 아닙니다.
BCS

@ BCS : 죄송합니다. 공개 키 암호화 사용에 대해 더 명확해야합니다.
Andrew Aylett

공개 키 버전의 암호화 체계가 아닌 서명 체계를 사용하십시오. (RSA 서명은 "공개 키를 사용한 암호화"와 비슷하지만 완전히 동일하지는 않습니다. DSA와 같은 관련 암호화 체계가없는 다른 서명 체계가 있습니다.
Paŭlo Ebermann

공개 키 암호화의 문제는 키 (및 일련 번호)가 길어야한다는 것입니다. 512 비트 RSA 키 쌍은 요즘 깨지기 어렵지 않습니다. 엔트로피는 128 비트에 불과하지만 여전히 입력하기
어려운

17

CD 키는 네트워크에 연결되지 않은 제품에 대한 보안 수준이 높지 않으므로 기술적으로 안전하게 생성 할 필요가 없습니다. .net을 사용하는 경우 Guid.NewGuid ()를 거의 사용할 수 있습니다.

오늘날 주된 용도는 서버가 CD 키를 확인할 수있는 멀티 플레이어 구성 요소입니다. 따라서 "전달 된 내용을 조회하고 다른 사람이 이미 사용 중인지 확인"으로 귀결 될 때 얼마나 안전하게 생성되었는지는 중요하지 않습니다.

즉, 두 가지 목표를 달성하기 위해 알고리즘을 사용할 수 있습니다.

  • 일종의 체크섬이 있습니다. 이는 오타를 탐지하는 것만으로 설치 프로그램에 "키가 유효하지 않은 것 같습니다"라는 메시지를 표시 할 수있게합니다 (설치 프로그램에 이러한 검사를 추가하면 실제로 해커가 필요한 모든 코드를 가지고 있으므로 키 생성기를 작성하는 것은 쉽지 않습니다. 서버 측 유효성 검사를 확인하고 전적으로 의존하면 서버가 오타를 알지 못하기 때문에 서버가 CD 키를 수락하지 않는 이유를 이해하지 못하는 합법적 고객을 귀찮게 할 위험이 있음)
  • 제한된 문자 하위 집합으로 작업하십시오. CD 키를 입력하려고 시도하고 "이것은 8 또는 B입니까? 1 또는 I입니까? Q 또는 O입니까 또는 0입니까?" -모호하지 않은 문자 / 숫자의 하위 집합을 사용하면 혼동을 제거 할 수 있습니다.

즉, 해커가 유효한 키 (데이터베이스에서는 유효하지만 여전히 상점 선반의 상자에 있음)를 추측하고 해당 상자를 구매하는 합법적 인 고객을 괴롭히는 것을 피하기 위해 대규모 배포 및 임의성이 필요합니다. .


좋은 고객 서비스로 쉽게 해결-Box shot + 구매 증명 = 불법 사용자 잠금, 두 번째 사용자 액세스 제공.
alexanderpas 2016 년

1
다음은 CD 키에 대한 몇 가지 추가 고려 사항 codinghorror.com/blog/2007/12/software-registration-keys.html
Richard Chambers

10

특히 키 길이에 관심이 없다면 공개 및 개인 키 암호화를 사용하는 것이 좋습니다.

본질적으로 어떤 종류의 nonce와 고정 서명이 있습니다.

예를 들면 다음과 같습니다. 0001-123456789

0001은 nonce이고 123456789는 고정 서명입니다.

그런 다음 개인 키를 사용하여이를 암호화하여 다음과 같은 CD 키를 얻으십시오. ABCDEF9876543210

그런 다음 응용 프로그램과 함께 공개 키를 배포하십시오. 공개 키를 사용하여 CD 키 "ABCDEF9876543210"을 해독 한 다음 고정 서명 부분을 확인할 수 있습니다.

그러면 개인 키가 없기 때문에 nonce 0002에 대한 CD 키가 무엇인지 추측 할 수 없습니다.

유일한 주요 단점은 1024 비트 크기의 개인 / 공개 키를 사용할 때 CD 키가 상당히 길다는 것입니다. 또한 사소한 양의 정보를 암호화하지 않도록 충분히 긴 nonce를 선택해야합니다.

단점은이 방법이 "활성화"없이 작동하며 이메일 주소 또는 라이센스 사용자 이름과 같은 것을 nonce로 사용할 수 있다는 것입니다.


1
내 예제는 키의 길이를 크게 과소 평가한다는 점에 유의하십시오. 이러한 체계에는 일반적으로 base64 인코딩 및 복사 / 붙여 넣기 배포가 필요하지만 컴퓨터에 연결되어 있지 않고 활성화가 필요하지 않은 키를 추측하는 것은 거의 불가능합니다 (여러 유형의 고객에게 매우 중요한 두 가지)
userx

3
RSA를 사용하는 대신 타원 곡선을 사용할 수 있습니다. 짧은 키를 사용하며 블록 길이가 더 작습니다. Wiki를 읽으면 256 비트 ECC가 AES 128만큼 안전 할 것 같습니다.
xanatos

디지털 서명과 "개인 키로 암호화"는 동일하지 않습니다. RSA에서는 서로 다른 패딩 체계로 인해 유사하지 않지만 다른 서명 체계에는 해당 암호화 체계가 없습니다.
Paŭlo Ebermann

@xanatos, 256 비트는 여전히 너무 길어서 직접 입력 할 수 없습니다. WinXP에서 사용하는 25 자 키는 128 비트 엔트로피 만 있습니다.
finnw

1
@Mark-서명은 일반적으로 암호화 된 해시입니다. 암호화 또는 서명을 사용할 수 있으며 내 방법은 동일하게 작동합니다. 개인 키없이 쉽게 생성 할 수없고 공개 키로 확인할 수있는 라이센스 키를 만들려고합니다. 이것은 전체 메시지가 암호화되어 있고 (그 내용의 일부가 마법과 일치하는지 확인) 서명 된 메시지 일 수 있습니다 (서명이 유효한지 확인). 그것은 당신의 구현에 달려 있습니다.
userx

9

키 시스템에는 몇 가지 속성이 있어야합니다.

  • 매우 적은 키가 유효해야합니다
  • 사용자가 가진 모든 것을 가지고 있어도 유효한 키를 도출 할 수 없어야합니다.
  • 한 시스템의 유효한 키는 다른 시스템의 유효한 키가 아닙니다.
  • 다른 사람

이를 제공해야하는 한 가지 해결책은 공개 키 서명 체계 를 사용하는 것 입니다. "시스템 해시"로 시작하십시오 (예 : NIC의 맥, 정렬 및 CPU-ID 정보 및 기타 다른 것들을 가져 와서 모두 함께 연결하고 결과의 MD5를 가져옵니다 (실제로 원하지는 않습니다) ( 필요하지 않은 경우 개인 식별 정보 처리 ) CD의 일련 번호를 추가하고 일부 레지스트리 키 (또는 일부 데이터 파일)에 blob에 대한 유효한 서명이없는 경우 부팅을 거부합니다. 사용자는 Blob을 배송하여 프로그램을 활성화하고 서명을 다시 배송합니다.

잠재적 인 문제에는 실제로 어떤 것에 서명하라는 제안이 포함되어 있으므로 누군가가 선택한 일반 텍스트 및 / 또는 선택한 암호문 공격 을 실행한다고 가정해야합니다 . 제공된 일련 번호를 확인하고 유효하지 않은 요청을 처리하는 것을 거부하고 주어진 s / n에서 주어진 수보다 많은 쿼리를 일정한 간격으로 처리하지 않으면 (연간 2 개)이를 완화 할 수 있습니다.

몇 가지 사항을 지적해야합니다. 첫째, 숙련되고 결정적인 공격자는 제한없이 액세스 할 수있는 부분 ( 예 : CD의 모든 항목)의 모든 보안을 우회 할 수 있습니다. 합법적 인 접근보다 불법적 인 접근을 어렵게합니다. 둘째, 저는 전문가가 아니므로이 제안 된 계획에 심각한 결함이있을 수 있습니다.


1

프로세스에 여러 단계를 통합하는 DRM 동작도 있습니다. 가장 잘 알려진 예 중 하나는 Creative Suite 설치를 확인하는 Adobe의 방법 중 하나입니다. 여기에 설명 된 기존 CD 키 방법이 사용 된 다음 Adobe 지원 라인이 호출됩니다. CD 키는 Adobe 담당자에게 제공되며 사용자가 사용할 활성화 번호를 제공합니다.

그러나, 단계들로 나뉘어 졌음에도 불구하고, 이것은 일반적인 프로세스에 사용 된 것과 동일한 크래킹 방법에 속한다. 원본 CD 키와 비교하여 확인되는 활성화 키를 만드는 데 사용 된 프로세스가 신속하게 발견되었으며 두 키를 모두 포함하는 생성기가 만들어졌습니다.

그러나이 방법은 인터넷에 연결되지 않은 사용자가 제품을 확인하는 방법으로 여전히 존재합니다. 앞으로는 인터넷 액세스가 보편적으로 사용되면서 이러한 방법이 어떻게 제거 될지 쉽게 알 수 있습니다.


1

모든 CD는 복제 방지 알고리즘 만 정직한 사용자에게 위배되며 불법 ​​복제에 대한 보호는 제공하지 않습니다.

"해적"은 합법적 인 CD 한 장과 그 액세스 코드에만 액세스하면되며 사본을 만들어 배포 할 수 있습니다.

암호화를 통해 코드를 안전하게 보호하는 것은 중요하지 않습니다. CD를 일반 텍스트로 제공해야합니다. 그렇지 않으면 합법적 인 사용자가 소프트웨어를 활성화 할 수 없습니다.

대부분의 보안 체계에는 소프트웨어를 제공 할 컴퓨터의 세부 정보 (cpu 일련 번호, mac 주소, IP 주소 등)를 소프트웨어 공급 업체에 제공하거나 공급 업체 웹 사이트 및 그 대가로 활성화 토큰을받습니다. 첫 번째 옵션은 많은 수동 관리가 필요하며 매우 가치가 높은 소프트웨어에만 가치가 있습니다. 두 번째 옵션은 스푸핑 될 수 있으며 네트워크 액세스가 제한되어 있거나 방화벽 뒤에 갇혀 있으면 절대적으로 분노합니다.

전체적으로 고객과의 신뢰 관계를 구축하는 것이 훨씬 쉽습니다!


0

소프트웨어 프로젝트에서이를 사용하여 ( https://www.nuget.org/packages/SystemSoulLicense/ ) Secure Licensing API를 매우 쉽게 사용하고 구현할 수 있습니다 ( https : / 에서 보안 라이센스를 만들려면 데스크톱 응용 프로그램을 다운로드해야 함) . /www.systemsoulsoftwares.com/ ) 1. 시스템 하드웨어 (CPU, 마더 보드, 하드 드라이브)를 기반으로 클라이언트 소프트웨어를위한 고유 한 UID를 생성합니다 (UID는 고유 한 시스템의 개인 키 역할을합니다) 2. 암호화 된 라이센스 문자열을 클라이언트 시스템에 매우 쉽게 보낼 수 있습니다. 이 방법을 사용하면 소프트웨어 개발자 또는 회사가 소프트웨어 / 개발자 / 배포자 서비스 / 기능 / 클라이언트에 대한 자세한 정보를 저장할 수 있습니다. 4. 클라이언트 소프트웨어 기능을 잠금 및 잠금 해제하여 개발자의 시간을 절약합니다. 기능 변경으로 동일한 소프트웨어에 대한 더 많은 버전 만들기 5. 며칠 동안 평가판 버전도 필요로합니다. 6. 등록하는 동안 DateTime을 온라인으로 확인하여 라이센스 타임 라인을 보호합니다. 7. 모든 하드웨어 정보를 개발자에게 잠금 해제합니다. 8.더 복잡한 보안 코드를 만들기 위해 모든 라이선싱 프로세스에서 개발자가 액세스 할 수있는 모든 사전 빌드 및 사용자 정의 기능이 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.