2

Matlab 컴파일러를 사용하여 소프트웨어를 가격에 배포하는 것이 좋습니다. 나는 (매우) 간단한 방법을 조사하고있다. 은 성가신 사용자가 아닌의 재배포를 막는다. 어떤 추천?Matlab 컴파일러 : 설치 중 소프트웨어의 재배치 보호

한 가지 생각은 사용자에게 라이센스 키를 전자 메일로 보내고 설치 프로세스 중에 라이센스 서버에서이를 확인하도록하는 것입니다. 키가 서버에있는 것과 일치하면 설치가 평소와 같이 진행되고 그렇지 않으면 경고 메시지가 표시되어 사용자에게 다른 라이센스를 구입할 것을 알립니다. 그러나이 방법을 사용하려면 지정된 기능이 설치 프로세스 중에 만 실행되어야하며 이후에는 실행되지 않아야합니다 (사용자를 괴롭히지 않도록). Matlab 컴파일러를 사용하거나 가능합니까?

프로그램이 시작될 때 프로그램이 검색 할 파일을 만들 수 있다고 가정합니다 (존재하는 경우 처음 실행되지는 않습니다). 그러나 사용자가 전체 디렉토리를 복사하면 파일도 복사됩니다.

+0

한 가지 방법은 컴파일 된 재배포 가능 패키지에서 사용자의 시스템 UID를 하드 코딩하는 것일 수 있습니다. 가능한 경우 각 클라이언트에 대해 te 컴파일해야합니다. 이는 사용자 기반의 규모에 달려 있습니다. 많은 사용자들에게 FlexLM과 같은 실제 라이센스 솔루션을 기대합니다. 그 중 자유로운 것이 있는지 확실하지 않습니다. –

+0

고유 한 ID를 얻는 방법은 다음과 같습니다. https://stackoverflow.com/a/820549/7328782 –

+1

[Matlab 컴파일러로 생성 된 .exe에 라이센스/키 추가 방법] (https : // uk. mathworks.com/matlabcentral/answers/285159-how-to-add-license-key-to-exe-generated-with-matlab- 컴파일러)를 참조하십시오. – am304

답변

1

효과적인 라이센스 시스템을 만들려면 사용자 시스템의 하나 이상의 속성 (MAC 주소, OS ID, 하드 디스크 일련 번호, CPU 일련 번호 등)에 링크해야합니다.

이 작업을 수행하지 않으면 한 사용자에서 다른 사용자로 이전 할 수있는 라이센스를 릴리스하게됩니다. 한 사용자가 자신의 라이센스 파일을 전 세계적으로 배포하기로 결정하면 모든 사용자가 해당 라이센스 파일을 가져 와서 응용 프로그램의 잠금을 해제 할 수 있기 때문에 운명에 처하게됩니다.

하지만 당신은 사용자 시스템의 하나 개 이상의 속성에 라이센스 파일을 링크하는 경우 위에서 언급 한 바와 같이, 이러한 속성을 얻을 수 중 하나 여야

  1. 사용자가 응용 프로그램을 구입하기로 결정하기 전에; 사용자가 라이센스를 활성화하면
  2. 입니다.

첫 번째 시나리오

당신은 재판으로 소프트웨어를 놓습니다. 처음 시작될 때 레지스트리 또는 어딘가에 숨겨진 파일에 만료 날짜를 설정합니다. 응용 프로그램이 시작될 때 만료 날짜를 확인하고 오류가 발생하면 더 이상 응용 프로그램과 함께 사용한 재생을 허용하지 않습니다.

응용 프로그램 내에서 어딘가에 Register Now 단추를 만듭니다. 이 버튼을 클릭하면 응용 프로그램이 시스템 속성을 검색하여 사용자가 지불을 수행 할 수 있도록 열리는 웹 페이지/양식으로 전달합니다. 해당 페이지는 기계 특성을 검증하고 지불을 받고, 마지막으로 이러한 특성을 기반으로 유효한 라이센스 코드를 전달하는 책임이 있습니다.

응용 프로그램 내에서 응용 프로그램이 시작될 때마다 코드 자체의 유효성을 검사하기 위해 사용해야하므로 양식에서 라이센스 코드를 만들 수있는 동일한 논리를 구현해야합니다. 의사 코드 예제 :

이것은 가장 간단한 경로입니다. 그러나 사용자 컴퓨터의 하나 이상의 속성이 변경되면 (장치를 변경하거나 OS를 다시 설치하기 때문에) 라이센스가 무효화되므로 이러한 종류의 상황을 처리하는 고객 지원 서비스를 제공해야합니다 .

두 번째 시나리오

이 사람은 훨씬 어렵습니다. 사용자의 기계 속성을 미리 알 수 없습니다. 라이센스 시스템은 2 단계로 작동합니다. 중고 응용 프로그램을 구입할 때 고유 한 코드 (예 : LID)를 릴리스합니다. 그런 다음 사용자가이를 응용 프로그램에 삽입하면 응용 프로그램이 기계 특성과 함 2이를 다시 보내야합니다. 그런 다음 최종 키 (예 : LKey)가 계산되어 사용자에게 다시 전송됩니다.

mp1 = GetMachineProperty1(); 
mp2 = GetMachineProperty2(); 
mp3 = GetMachineProperty3(); 
lkey = GetLicenseKey(); 

if (~strcmp(sha1([mp1 mp2 mp3]),lkey)) 
    errordlg('Invalid license code!'); 
    return; 
end 

컴퓨터 속성 첫 번째 솔루션은 댓글을 통해 사용자에게 제공하고있다

: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography 키 레지스트리에있는 MachineGuid 값. 그것은 꽤 견고합니다. 그러나 그것은 Windows 컴퓨터에서만 작동합니다. winqueryreg을 사용하여 레지스트리에 액세스하십시오.

또 다른 좋은 대안은 컴퓨터 고유의 고유 식별자 인 Window Domain Controller Security ID입니다. 당신은 matlab에 내 Java 코드를 사용하여 검색 할 수 있습니다

wdc_sid = com.sun.security.auth.module.NTSystem.getDomainSID(); 

또는 HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\GroupMembership 키 윈도우 레지스트리를 통해. 오래된 Matlab과의 역 호환성을 유지하기를 원한다면 레지스트리 접근 방식을 사용해야한다. 아쉽게도 Window Domain Controller Security ID은 Windows에서 실행되는 시스템에서만 사용할 수있는 또 다른 식별자입니다.

모든 가능한 OS 및 환경에 라이센스 시스템을 적용하려면 보편적으로 액세스 할 수있는 하드웨어 속성 (MAC 주소, 하드 디스크 일련 번호 등)을 기반으로보다 일반적인 접근 방식을 사용해야합니다. 내가 아는 한, 가장 신뢰할 수있는 속성은 MAC 주소입니다. 그 고유성은 거의 알려지지 않았기 때문에 거의 확실하며 네트워크 어댑터를 변경하는 것은 매우 드문 경우입니다. 실제로 하드 디스크를 손상시킬 가능성이 더 큽니다. 다음 Java 코드를 사용하여 컴퓨터 네트워크 어댑터의 MAC adresses 검색 :

mac_addrs = ''; 
net_int = java.net.NetworkInterface.getNetworkInterfaces(); 

while (net_int.hasMoreElements) 
    mac_addr = net_int.nextElement.getHardwareAddress(); 

    if (~isempty(mac_addr)) 
     mac_addrs = [mac_addrs, '-', sprintf('%.2X',typecast(mac_addr,'uint8'))]; 
    end 
end 

mac_addrs = mac_addrs(2:end); 

상기 계산 시스템에있는 모든 MAC 어드레스의 연결의 결과를 나타내는 문자 배열을 생성한다. 다시 말하지만, 호환성 문제로 인해 이전 Matlab 릴리스에서는 작동하지 않을 수 있으므로 더 복잡한 접근 방법을 사용해야합니다 (here).

[편집]

쉽게 될 수있는 기본 OS를 기반으로 MAC 주소 검색이 방식 :

switch computer('arch') 
    case {'maci','maci64'} 
     [~,a]=system('ifconfig'); 
     c=strfind(a,'en0');if ~isempty(c),a=a(c:end);end 
     c=strfind(a,'en1');if ~isempty(c),a=a(1:c-1);end 
     % find the mac address 
     b=strfind(a,'ether'); 
     mac_add=a(1,b(1)+6:b(1)+22); 
    case {'win32','win64'} 
     [~,a]=system('getmac');b=strfind(a,'='); 
     mac_add=a(b(end)+1:b(end)+19); 
    case {'glnx86','glnxa64'} 
     [~,a]=system('ifconfig');b=strfind(a,'Ether'); 
     mac_add=a(1,b(1)+17:b(1)+33); 
    otherwise,mac_add=[]; 
end 

내가 this article의 코멘트에 그것을 발견한다.

+0

고마워요. @TommasoBelluzzo,'~ strcmp (sha1 ([mp1 mp2 mp3]))의'sha1'은 무엇입니까? 나는 Matlab의 문서에서 그것을 발견 할 수 없었다. 아니면 뭔가 의사 코드입니까? – user46688

+1

의사 코드입니다. 실제로'sha1'은 해싱 알고리즘입니다. 이것은 일반적으로 문자열 형식으로 사용됩니다. 그래서 다양한 기계 속성 중 sha1과 잠재적 인 키를 비교합니다. Matlab에서 계산하기 위해서는 Java 코드를 사용해야한다고 생각합니다. Google에서 검색하면 몇 가지 결과가 나타납니다. –