Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    502

    [Java] Proteggere applicativo con password

    Il mio capo mi ha chiesto di rendere il programma, che faticosamente sto cercando di terminare, utilizzabile solo su un determinato PC, nel senso che lo forniamo al cliente, e lui deve digitare un codice di attivazione specifico per quel PC.
    Ora, sono riuscito a leggere il numero seriale dello HD e della scheda madre e pensavo di utilizzarli per creare un codice di attivazione.
    Ma come?
    Voi avete fatto qualcosa di simile? Potete darmi qualche suggerimento ben gradito?
    Grazie.
    al volante son nervoso

  2. #2
    Utente di HTML.it L'avatar di morphy79
    Registrato dal
    Jun 2004
    Messaggi
    1,568
    si io ho fatto un programmino che leggeva il seriale della macchina dal registro, lo criptava e l'utente mi forniva il codice criptato..

    io a mano criptavo una seconda volta il codice e lo fornivo al cliente che lo inseriva in un file di configurazione..
    il programma all'avvio controllava che nel file di configurazione fosse presente il seriale della macchina criptato prima con un metodo e poi con l'altro..

    se i codici corrispondevano il programma si avviava..

    non son sicuro di essermi spiegato bene..
    odio chi parla di politica..
    anzi vorrei fondare un partito contro tutto ciò

  3. #3
    Utente di HTML.it L'avatar di morphy79
    Registrato dal
    Jun 2004
    Messaggi
    1,568
    un po' di codice :

    così leggevo l'id di windows ci vuole una libreria apposta (jRegistryKey.dll)
    ma tu cmq l'id della macchina ce l'hai già

    codice:
    winID = controlloAccesso.letturaID("SOFTWARE\\Microsoft\\Windows\\CurrentVersion","ProductId");
    
    winIDCrypt = controlloAccesso.encode(winID);
    lo criptavo in un modo banale

    codice:
    	// FUNZIONE PER ENCODE DI UNA STRINGA
    	public String encode(String stringToEncode){
    		String returnValue = "";
    		BASE64Encoder encrypt = new BASE64Encoder();
    		try{
    			String codedString = encrypt.encode(stringToEncode.getBytes());
    			returnValue = codedString;
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return returnValue;
    	}
    il cliente mi diceva che siccome il programma non era registrato gli compariva il codice a video (quello appena criptato)

    io gli generavo una chiave da quel codice con una funzione come questa e gliela fornivo

    codice:
    	public String createKeyById(String cryptID){
    		
    		String returnKey = "";
    		String singleChar;
    		int number = 0;
    		int somma = 0;
    		boolean sommaNumeri = false;
    		
    		String winID = decode(cryptID);
    		
    		// CONTROLLO LUNGHEZZA DEVE ESSERE PARI
    		if (winID.length() % 2 == 0){
    		}else{
    			winID = winID + "0";
    		}
    		
    		// CICLO PER LA COSTRUZIONE DELLA KEY
    		for(int i=0;i<winID.length();i++){
    			
    			// RECUPERO CARATTERE
    			singleChar = String.valueOf(winID.charAt(i));
    			
    			// CONTROLLO / CONVERSIONE IN NUMERO 
    			try{
    				number = Integer.parseInt(singleChar);
    			}catch(Exception e){
    				number = 0;
    			}
    			
    			// SOMMA DEI NUMERI
    			if(sommaNumeri==false){
    				somma = number;
    				sommaNumeri = true;
    			}else{
    				somma = somma + number;
    				returnKey = returnKey + String.valueOf(somma);
    				sommaNumeri = false;
    			}
    			
    		}
    		
    		// CRYPT DELLA CHIAVE DI RITORNO
    		if(returnKey.equalsIgnoreCase("")){
    		}else{
    			returnKey = encode(returnKey);
    		}
    		return returnKey;
    		
    	}
    il cliente la inseriva (dove decidi tu, io lo mettevo in un file di configurazione)

    ad ogni avvio il programma fa la stessa operazione che ho fatto io a mano e confronta se il codice del file di configurazione coincide.. se tutto ok prosegue..
    odio chi parla di politica..
    anzi vorrei fondare un partito contro tutto ciò

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    502
    Originariamente inviato da morphy79
    si io ho fatto un programmino che leggeva il seriale della macchina dal registro, lo criptava e l'utente mi forniva il codice criptato..

    io a mano criptavo una seconda volta il codice e lo fornivo al cliente che lo inseriva in un file di configurazione..
    il programma all'avvio controllava che nel file di configurazione fosse presente il seriale della macchina criptato prima con un metodo e poi con l'altro..

    se i codici corrispondevano il programma si avviava..

    non son sicuro di essermi spiegato bene..
    Per seriale della macchina cosa intendi?

    Io ho trovato due metodi per il numero seriale dell'HD e della scheda madre.
    E pensavo da questo numero, magari trasformandolo prima in binario e poi con uno shift e poi di nuovo in decimale, di ottenere un codice univoco.
    Il cliente mette dentro il codice che gli dico io, l'applicativo genera lo stesso codice che ho fornito io e se coincidono scrive una proprietà nel registro di windows dicendo che il programma è attivato.
    E' corretto così?
    al volante son nervoso

  5. #5
    potresti leggere la chieve di registro relativo all' HKEY di win e criptarla,
    poi crei un'altra chiave nel registro relativa al tuo programma con la chiave precedentemente criptata.

    all'avvio il programma legge la chiave di win la cripta e la confronta con quella relativa al tuo programma già criptata in precedenza.

    se il programma viene spostato su un'altra macchina e anche nel caso che la tua chiave di registro venga copiata , essi saranno sempre diverse perche il codice HKEY di win (almeno credo) dovrebbe essere sempre diverso , anche se istalli la stessa versione di win su più macchine.

    poi se vuoi fare il pignolo crei un key generator per creare la chiave del tuo programma.

    credo di essere stato chiaro e di aiuto!

    ciaoooo

  6. #6
    Utente di HTML.it L'avatar di morphy79
    Registrato dal
    Jun 2004
    Messaggi
    1,568
    Originariamente inviato da fcorsa
    potresti leggere la chieve di registro relativo all' HKEY di win e criptarla,
    poi crei un'altra chiave nel registro relativa al tuo programma con la chiave precedentemente criptata.

    all'avvio il programma legge la chiave di win la cripta e la confronta con quella relativa al tuo programma già criptata in precedenza.

    se il programma viene spostato su un'altra macchina e anche nel caso che la tua chiave di registro venga copiata , essi saranno sempre diverse perche il codice HKEY di win (almeno credo) dovrebbe essere sempre diverso , anche se istalli la stessa versione di win su più macchine.

    poi se vuoi fare il pignolo crei un key generator per creare la chiave del tuo programma.

    credo di essere stato chiaro e di aiuto!

    ciaoooo
    esatto, ti serve la dll che ti ho detto prima inclusa nella dir principale del tuo progetto java + jRegistryKey.jar incluso nel classpath e questo codice che legge il registro di windows

    codice:
    	// FUNZIONE PER LA LETTURA DEL REGISTRO DI CONFIGURAZIONE
    	public String letturaID(String path , String nameValue){
    		String winID = "";
    		try{
    			RegistryKey r = new RegistryKey(RootKey.HKEY_LOCAL_MACHINE, path);
    			if (r.exists()==true){
    				if(r.hasValue(nameValue)){
    				   RegistryValue v = r.getValue(nameValue);
    				   winID=v.toString();
    				   winID=winID.replaceAll(nameValue+":REG_SZ:","");
    				}
    			}
    		}catch(Exception e){
    			winID = "";	
    		}
    		return winID;
    	}
    	
    	
    	
    	// FUNZIONE PER LA SCRITTURA DEL REGISTRO DI CONFIGURAZIONE
    	public void scritturaID(String winID, String path , String nameValue){
    		try{
    		
    			RegistryKey r = new RegistryKey(RootKey.HKEY_LOCAL_MACHINE, path);
    			if (r.exists()==false){
    			r.create();
    			}
    		
    			RegistryValue v = new RegistryValue(nameValue, ValueType.REG_SZ, winID);
    			r.setValue(v);
    		}catch(Exception e){
    		}	
    	}
    odio chi parla di politica..
    anzi vorrei fondare un partito contro tutto ciò

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    502
    Grazie a entrambi.
    Sto avendo difficoltà a usare il decode dell'encode. Nel senso che se prima faccio l'encode di una stringa, e poi il decode... mi dovrebbe tornare la prima stringa, o no?
    al volante son nervoso

  8. #8
    Utente di HTML.it L'avatar di morphy79
    Registrato dal
    Jun 2004
    Messaggi
    1,568
    yes
    praticamente dovresti aver tutto.. ti ho postato quasi tutto il codice..
    devi solo cercarti la libreria che ti ho detto per comunicare con il registro..

    tieni presente che è tutto codice di 5 anni fa.. magari qualcosa è cambiato o ci sono librerie\metodi migliori.. anche solo nella jre 6 magari accedi al registro di sistema.. non so..

    per quello che vedo funziona ancora tutto cmq
    odio chi parla di politica..
    anzi vorrei fondare un partito contro tutto ciò

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    502
    Originariamente inviato da morphy79
    yes
    Eh... solo che facendo l'encode con BASE64Encoder come hai scritto sopra e il decode con BASE64Decoder... mi da stringhe differenti.
    al volante son nervoso

  10. #10
    Utente di HTML.it L'avatar di morphy79
    Registrato dal
    Jun 2004
    Messaggi
    1,568
    ti posto le mie 2..
    il decode non te l'avevo dato

    codice:
    	// FUNZIONE PER ENCODE DI UNA STRINGA
    	public String encode(String stringToEncode){
    		String returnValue = "";
    		BASE64Encoder encrypt = new BASE64Encoder();
    		try{
    			String codedString = encrypt.encode(stringToEncode.getBytes());
    			returnValue = codedString;
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return returnValue;
    	}
    	
    	
    	// FUNZIONE PER DECODE DI UNA STRINGA
    	public String decode(String stringToDecode){
    		String returnValue = "";
    		BASE64Decoder decrypt = new BASE64Decoder();
    		try {
    			String decodedString = new String(decrypt.decodeBuffer(stringToDecode));
    			returnValue = decodedString;	
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return returnValue;
    	}
    odio chi parla di politica..
    anzi vorrei fondare un partito contro tutto ciò

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.