소프트웨어 라이센스 키는 어떻게 생성됩니까?
라이센스 키는 불법 복제 방지 수단으로 사실상 표준입니다. 솔직히 말해서, 이것은 나에게로 파업 을 통해 축구화 (의) 보안을 정말 라이센스 키가 생성되는 방법을 아무 생각이 없지만,. 라이센스 키 생성의 좋은 (보안) 예는 무엇입니까? 어떤 암호화 기본 요소 (있는 경우)를 사용하고 있습니까? 메시지 요약입니까? 그렇다면 어떤 데이터를 해싱합니까? 크래커가 자체 키 생성기를 구축하기 어렵게하기 위해 개발자는 어떤 방법을 사용합니까? 키 생성기는 어떻게 만들어 집니까?
구식 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 등)을 얻을 수있었습니다. 또한 온라인 활성화가 필요합니다.
전체 알고리즘은 다소 복잡하지만 독일에서 출판 된 이 문서 (완전히 합법적입니다!) 에 잘 요약 되어 있습니다.
물론, 더 당신이 (같은 온라인 서비스를 제공하지 않는 한 당신이 무슨 상관 월드 오브 워크래프트 는 어떤 게임 가치 값이 있다면 불행하게도, 사람이 깰 것), 복사 방지의 모든 유형은 실속없는 우회하기 적어도 (또는 ) CD 키 알고리즘 및 기타 모든 저작권 보호.
실제 올바른 방법 :
온라인 서비스의 경우 바이너리 파일을 사용하더라도 서버를 사용하여 서버를 인증해야 (예 : WoW 계정) 수명이 조금 더 단순 해집니다. 예를 들어 플레이 타임 카드를 구입할 때 사용되는 월드 오브 워크래프트의 CD 키 알고리즘은 다음과 같습니다.
- 매우 큰 암호로 안전한 난수를 생성하십시오.
- 데이터베이스에 저장하고 카드에 인쇄하십시오.
그런 다음 누군가가 재생 시간 카드 번호를 입력하면 데이터베이스에 있는지 확인하고,있는 경우 해당 번호를 현재 사용자와 연결하여 다시 사용할 수 없도록합니다.
온라인 서비스의 경우 위의 체계를 사용 하지 않을 이유가 없습니다 . 다른 것을 사용 하면 문제가 발생할 수 있습니다 .
원래이 답변을 썼을 때 라이센스 키의 '오프라인'유효성 검사에 관한 문제라는 가정하에있었습니다. 대부분의 다른 답변은 온라인 확인을 처리하므로 처리하기가 훨씬 쉽습니다 (대부분의 로직은 서버 측에서 수행 할 수 있음).
오프라인 확인을 사용하면 가장 어려운 점은 수많은 고유 라이센스 키를 생성하고 쉽게 확인되지 않는 강력한 알고리즘 (예 : 간단한 확인 숫자)을 유지할 수 있다는 것입니다.
나는 수학에 정통하지는 않지만 이것을하는 한 가지 방법 은 그래프를 그리는 수학 함수 를 사용하는 것입니다.
플롯 된 선은 (충분한 주파수를 사용하는 경우) 수천 개의 고유 한 점을 가질 수 있으므로 해당 그래프에서 임의의 점을 선택하고 어떤 방식 으로든 값을 인코딩하여 키를 생성 할 수 있습니다
예를 들어,이 그래프를 플롯하고 4 개의 점을 선택하고 "0, -500; 100, -300; 200, -100; 100,600"과 같은 문자열로 인코딩합니다.
우리는 알려진 고정 키로 문자열을 암호화하고 (거의 약하지만 목적을 제공합니다) Base32 를 통해 결과 바이트를 변환 하여 최종 키를 생성합니다
그런 다음 응용 프로그램은이 프로세스 (base32를 실수로 해독, 해독, 포인트 디코딩)를 취소 한 다음 각 포인트가 비밀 그래프에 있는지 확인할 수 있습니다.
상당히 많은 양의 고유하고 유효한 키를 생성 할 수있는 상당히 적은 양의 코드
그러나 모호한 보안은 매우 안전합니다. 코드를 분해하는 데 시간이 걸리는 사람은 그래프 기능과 암호화 키를 찾은 다음 키 생성기를 조롱 할 수 있지만 우연한 불법 복제를 늦추는 데 매우 유용 할 것입니다.
다음 요구 사항을 다루는 부분 키 확인 에 대한 tis 기사를 확인하십시오 .
라이센스 키는 입력하기에 충분히 쉬워야합니다.
지불 거절 또는 도난당한 신용 카드로 구매할 경우 라이센스 키를 블랙리스트에 올릴 수 있어야합니다.
키를 테스트 할“집에 전화”가 없습니다. 이 관행이 점점 더 널리 보급되고 있지만, 여전히 사용자로서 그것을 높이 평가하지 않으므로, 사용자들에게이를 따라달라고 요구하지 않을 것입니다.
크래커가 출시 된 애플리케이션을 분해하고 작동하는 "키겐"을 생성하는 것은 불가능합니다. 이는 애플리케이션이 확인을위한 키를 완전히 테스트하지 않음을 의미합니다. 키 중 일부만 테스트해야합니다. 또한 응용 프로그램의 각 릴리스는 키의 다른 부분을 테스트해야합니다. 따라서 이전 릴리스를 기반으로 한 가짜 키는 이후 릴리스의 소프트웨어에서는 작동하지 않습니다.
중요 : 합법적 인 사용자가 실수로 작동하는 것처럼 보이지만 인쇄상의 오류로 인해 향후 버전에서 실패하는 잘못된 키를 입력 할 수는 없습니다.
사람들이 실제로 CD 키를 생성하는 작업에 대한 경험이 없지만 온라인 활성화의 길을 가고 싶지 않다고 가정하면 키를 만들 수있는 몇 가지 방법이 있습니다.
숫자는 (17)로 나눌 수 있어야합니다. 많은 키에 액세스 할 수 있지만 대부분의 잠재적 인 문자열은 유효하지 않은 것으로 추측하기 쉽습니다. 마찬가지로 키의 체크섬이 알려진 값과 일치해야합니다.
키의 전반부는 알려진 값으로 연결될 때 키의 후반까지 해시해야합니다. 그러나 프로그램에는 여전히 키를 생성하고 유효성을 검증하는 데 필요한 모든 정보가 포함되어 있습니다.
알려진 값 + nonce를 (개인 키로) 암호화하여 키를 생성하십시오. 이는 해당 공개 키를 사용하여 해독하고 알려진 값을 확인하여 확인할 수 있습니다. 프로그램은 이제 키를 생성하지 않고 키를 검증하기에 충분한 정보를 가지고 있습니다.
이것들은 여전히 공격에 열려 있습니다 : 프로그램은 여전히 존재하며 검사를 우회하도록 패치 할 수 있습니다. Cleverer는 프로그램에 값을 저장하지 않고 세 번째 방법에서 알려진 값을 사용하여 프로그램의 일부를 암호화 할 수 있습니다. 이렇게하면 프로그램의 암호를 해독하기 전에 키의 사본을 찾아야하지만 암호를 한 번 복사하면 한 사람이 합법적 인 사본을 가져 와서 다른 사람이 소프트웨어에 액세스 할 수 있도록하는 데 여전히 취약합니다.
CD 키는 네트워크에 연결되지 않은 제품에 대한 보안 수준이 높지 않으므로 기술적으로 안전하게 생성 할 필요가 없습니다. .net을 사용하는 경우 Guid.NewGuid ()를 거의 사용할 수 있습니다.
오늘날 주된 용도는 서버가 CD 키를 확인할 수있는 멀티 플레이어 구성 요소입니다. 따라서 "전달 된 내용을 조회하고 다른 사람이 이미 사용 중인지 확인"으로 귀결 될 때 얼마나 안전하게 생성되었는지는 중요하지 않습니다.
즉, 두 가지 목표를 달성하기 위해 알고리즘을 사용할 수 있습니다.
- 일종의 체크섬이 있습니다. 이는 오타를 탐지하는 것만으로 설치 프로그램에 "키가 유효하지 않은 것 같습니다"라는 메시지를 표시 할 수있게합니다 (설치 프로그램에 이러한 검사를 추가하면 실제로 해커가 필요한 모든 코드를 가지고 있기 때문에 키 생성기를 작성하는 것이 쉽지 않습니다. 서버 측 유효성 검사를 확인하고 전적으로 의존하면 서버가 오타를 알지 못해 CD 키를 수락하지 않는 이유를 이해하지 못하는 합법적 고객을 성가 시게 할 위험이 있습니다.)
- 제한된 문자 하위 집합으로 작업하십시오. CD 키를 입력하려고 시도하고 "이것은 8 또는 B입니까? 1 또는 I입니까? Q 또는 O입니까 또는 0입니까?" -모호하지 않은 문자 / 숫자의 하위 집합을 사용하면 혼동을 제거 할 수 있습니다.
즉, 해커가 단순히 유효한 키 (데이터베이스에서는 유효하지만 여전히 상점 선반의 상자에 있음)를 추측하고 해당 상자를 구매하는 합법적 인 고객을 괴롭히는 것을 피하기 위해 대규모 배포 및 임의성이 필요합니다. .
특히 키 길이에 관심이 없다면 공개 및 개인 키 암호화를 사용하는 것이 좋습니다.
본질적으로 어떤 종류의 nonce와 고정 서명이 있습니다.
예를 들면 다음과 같습니다. 0001-123456789
0001은 nonce이고 123456789는 고정 서명입니다.
그런 다음 개인 키를 사용하여이를 암호화하여 다음과 같은 CD 키를 얻으십시오. ABCDEF9876543210
그런 다음 응용 프로그램과 함께 공개 키를 배포하십시오. 공개 키를 사용하여 CD 키 "ABCDEF9876543210"의 암호를 해독 한 다음 고정 서명 부분을 확인할 수 있습니다.
그러면 개인 키가 없기 때문에 nonce 0002에 대한 CD 키가 무엇인지 추측 할 수 없습니다.
유일한 주요 단점은 1024 비트 크기의 개인 / 공개 키를 사용할 때 CD 키가 상당히 길다는 것입니다. 또한 사소한 정보를 암호화하지 않도록 충분히 긴 nonce를 선택해야합니다.
단점은이 방법이 "활성화"없이 작동하며 이메일 주소 또는 라이센스 사용자 이름과 같은 것을 nonce로 사용할 수 있다는 것입니다.
키 시스템에는 몇 가지 속성이 있어야합니다.
- 매우 적은 키가 유효해야합니다
- 사용자가 가진 모든 것을 가지고 있어도 유효한 키를 도출 할 수 없어야합니다.
- 한 시스템의 유효한 키는 다른 시스템의 유효한 키가 아닙니다.
- 다른 사람
이를 제공해야하는 한 가지 해결책은 공개 키 서명 체계 를 사용하는 것 입니다. "시스템 해시"로 시작하십시오 (예 : NIC의 맥, 정렬 및 CPU-ID 정보 및 기타 다른 것들을 가져 와서 모두 함께 연결하고 결과의 MD5를 가져옵니다 (정말 원치 않습니다) ( 필요하지 않은 경우 개인 식별 정보 처리 ) CD의 일련 번호를 추가하고 일부 레지스트리 키 (또는 일부 데이터 파일)에 blob에 대한 유효한 서명이없는 경우 부팅을 거부합니다. 사용자는 Blob을 배송하여 프로그램을 활성화하고 서명을 다시 배송합니다.
잠재적 인 문제에는 실질적으로 모든 것에 서명하도록 제안하는 것이 포함되어 있으므로 누군가가 선택한 일반 텍스트 및 / 또는 선택된 암호문 공격 을 실행한다고 가정해야합니다 . 제공된 일련 번호를 확인하고 유효하지 않은 요청을 처리하는 것을 거부하고 주어진 s / n에서 주어진 수보다 많은 쿼리를 일정한 간격으로 처리하는 것을 거부함으로써 완화 할 수 있습니다 (연간 2 개).
몇 가지 사항을 지적해야합니다. 첫째, 숙련되고 결정적인 공격자는 제한없이 액세스 할 수있는 부분 ( 예 : CD의 모든 항목)의 모든 보안을 우회 할 수 있습니다. 해당 계정에서 수행 할 수있는 최선의 방법은 합법적 인 접근보다 불법적 인 접근을 어렵게합니다. 둘째, 저는 전문가가 아니므로이 제안 된 계획에 심각한 결함이있을 수 있습니다.
프로세스에 여러 단계를 통합하는 DRM 동작도 있습니다. 가장 잘 알려진 예 중 하나는 Creative Suite의 설치를 확인하는 Adobe의 방법 중 하나입니다. 여기에 설명 된 기존 CD 키 방법이 사용 된 다음 Adobe 지원 라인이 호출됩니다. CD 키는 Adobe 담당자에게 제공되며 사용자가 사용할 활성화 번호를 제공합니다.
그러나, 단계들로 나뉘어 졌음에도 불구하고, 이것은 일반적인 프로세스에 사용 된 것과 동일한 크래킹 방법에 속한다. 원본 CD 키와 비교하여 확인되는 활성화 키를 만드는 데 사용 된 프로세스가 빠르게 발견되었으며 두 키를 모두 포함하는 생성기가 만들어졌습니다.
그러나이 방법은 인터넷에 연결되어 있지 않은 사용자가 제품을 확인하는 방법으로 여전히 존재합니다. 앞으로 인터넷 액세스가 보편적으로됨에 따라 이러한 방법이 어떻게 제거되는지 쉽게 알 수 있습니다.
모든 CD는 복제 방지 알고리즘 만 사용하여 정직한 사용자를 위태롭게하며 불법 복제를 방지하지는 않습니다.
"해적"은 하나의 합법적 인 CD와 그 액세스 코드에만 액세스하면되고, 사본을 만들어 배포 할 수 있습니다.
암호화를 통해 코드를 안전하게 보호하는 것은 중요하지 않습니다. CD를 일반 텍스트로 제공해야합니다. 그렇지 않으면 합법적 인 사용자가 소프트웨어를 활성화 할 수 없습니다.
대부분의 보안 체계에는 소프트웨어를 제공 할 컴퓨터의 세부 정보 (cpu 일련 번호, mac 주소, IP 주소 등)를 소프트웨어 공급 업체에 제공하거나 공급 업체 웹 사이트 및 그 대가로 활성화 토큰을받습니다. 첫 번째 옵션은 많은 수동 관리가 필요하며 매우 가치가 높은 소프트웨어에만 가치가 있습니다. 두 번째 옵션은 스푸핑 될 수 있으며 네트워크 액세스가 제한되어 있거나 방화벽 뒤에 갇혀 있으면 절대적으로 분노합니다.
전체적으로 고객과의 신뢰 관계를 구축하는 것이 훨씬 쉽습니다!
참고 URL : https://stackoverflow.com/questions/3002067/how-are-software-license-keys-generated
'development' 카테고리의 다른 글
PHP : 임의의 고유 한 영숫자 문자열을 생성하는 방법은 무엇입니까? (0) | 2020.03.01 |
---|---|
신속하게 x 값을 소수점 이하 자릿수로 반올림 (0) | 2020.03.01 |
Firebase apiKey를 공개하는 것이 안전합니까? (0) | 2020.03.01 |
null 검사가없는 경우에도 캐스트 대신 "as"를 사용하는 것이 합리적입니까? (0) | 2020.03.01 |
비동기 및 비 차단 (0) | 2020.03.01 |