Passwortschutz/-abfrage/-verschlüsselung



  • Nabend zusammen 😉 ,

    für mein Tool, dass ich mit C++ und Winapi geschrieben habe, möchte ich demnächst eine Passwortabfrage realisieren. Das Tool wird generell nur vom Adminstrator installierbar, konfigurierbar und deintsallierbar sein. Ich hatte mir das so gedacht, dass der Admin bei der Installation ein Passwort festlegen muss, und dieses bei späterer Rekonfiguration oder Deinstallation des Tools abgefragt wird.
    Nun ist mein Problem: Wo und wie sollte ich das Passwort speichern? Das Tool speichert alle Einstellungen in der Registry, aber das Passwort kann ich ja schlecht einfach da reinschreiben. Verschlüsseln? Gibts da einen guten Ansatz? Wie realiseren das diese Passwort-Reminder-Tools, wo man alle Passwörter speichern kann? Oder kann man irgendwie auf das original-Administratorkennwort zugreifen? Entschlüsseln kann man es nicht, das ist klar, aber Windows macht das ja auch irgendwie.

    Fragen über Fragen, wäre schön, wenn ihr mir einen Tip bzw. Ansatz geben könntet.



  • Cosmixx schrieb:

    Oder kann man irgendwie auf das original-Administratorkennwort zugreifen? Entschlüsseln kann man es nicht, das ist klar, aber Windows macht das ja auch irgendwie.

    Du könntest mittels der Funktion LogonUser prüfen, ob das Kennwort gültig ist, denn ansonsten schlägt die Funktion fehl.

    BOOL IsValidLogon(PCHAR username,PCHAR password)
    {
    	HANDLE hToken = NULL;
    	BOOL bRet = LogonUser(username,NULL,password,LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, &hToken);
    	CloseHandle(hToken);
    
    	return bRet;
    }
    


  • Speicher den Hash des Passworts an einer Stelle, die nur der Administrator auslesen kann. Selbst wenn das System kompromitiert wurde, kennt der Cracker nicht das Passwort.

    Aber mal im ernst, wozu willst du noch ein eigenes Passwort-System in deine Anwendung einbauen, wenn sich doch das System mit seiner Benutzeraufteilung drum kümmert? Find ich überlüssig.



  • kingruedi schrieb:

    Aber mal im ernst, wozu willst du noch ein eigenes Passwort-System in deine Anwendung einbauen, wenn sich doch das System mit seiner Benutzeraufteilung drum kümmert? Find ich überlüssig.

    Kann man den ein Programm so installieren, dass nur der Administrator es aufrufen kann??



  • Dommel schrieb:

    kingruedi schrieb:

    Aber mal im ernst, wozu willst du noch ein eigenes Passwort-System in deine Anwendung einbauen, wenn sich doch das System mit seiner Benutzeraufteilung drum kümmert? Find ich überlüssig.

    Kann man den ein Programm so installieren, dass nur der Administrator es aufrufen kann??

    Ich kenn mich mit Windows jetzt nicht im Detail aus. Aber man kann doch sicher die Ausführrechte eines Binaries eingrenzen. Zur not installiert man das Programm in einem Verzeichnis, dass nur der Administrator lesen kann.

    Selbst wenn ein User das Programm startet, sollte es doch wegen fehlender Rechte scheitern, beim bearbeiten der Konfigurationsdateien (Registry).



  • Viele Administrationsprogramme machen sich auch nicht die Mühe, alle erforderlichen Berechtigungen bei Programmstart zu überprüfen, sondern schauen einfach nur, ob der aktuelle Benutzer ein Administrator ist und beenden sich falls nicht. Das könntest du zum Beispiel mit dem Code unten feststellen.

    #include <iostream> 
    #include <windows.h> 
    #include <conio.h> 
    #include <Accctrl.h> 
    #include <Aclapi.h> 
    
    BOOL IsAdmin(PBOOL pbresult) { 
        DWORD dwbufsize = 0; 
        BOOL bSuccess = FALSE; 
        PTOKEN_GROUPS grouplist = NULL; 
        HANDLE hAccessToken = NULL; 
        PSID pSID = NULL; 
    
        *pbresult = FALSE; 
        SID_IDENTIFIER_AUTHORITY auth = SECURITY_NT_AUTHORITY; 
    
        //Prozesstoken öffnen 
        if(!OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY,&hAccessToken)) { 
            goto exit; 
        } 
    
        //Gruppenliste des Tokens abrufen 
        if (!GetTokenInformation(hAccessToken,TokenGroups,grouplist,0,&dwbufsize)) { 
            if (GetLastError()!=ERROR_INSUFFICIENT_BUFFER) { 
                goto exit; 
            } 
    
            grouplist = (PTOKEN_GROUPS) new CHAR[dwbufsize]; 
    
            if (!GetTokenInformation(hAccessToken,TokenGroups,grouplist,dwbufsize,&dwbufsize)) { 
                goto exit; 
            } 
        } else { 
            goto exit; 
        } 
    
        //SID erzeugen, die die gewünschte Gruppe repräsentiert 
        if (!AllocateAndInitializeSid(&auth,2,SECURITY_BUILTIN_DOMAIN_RID,DOMAIN_ALIAS_RID_ADMINS,0,0,0,0,0,0,&pSID)) { 
            goto exit; 
        } 
    
        //Prüfen, ob die gewünschte Gruppe in der Gruppenliste des Tokens enthalten ist 
        for (UINT i=0;i<grouplist->GroupCount;i++) { 
            if (EqualSid(grouplist->Groups[i].Sid,pSID)) { 
                *pbresult = TRUE; 
                bSuccess = TRUE; 
                goto exit; 
            } 
        } 
    
    exit: 
        if (grouplist)        {delete[] grouplist;} 
        if (hAccessToken)    {CloseHandle(hAccessToken);} 
        if (pSID)            {FreeSid(pSID);} 
    
    #if defined(_DEBUG) && defined(_CONSOLE) 
        if (!bSuccess)        {std::cout << "Fehler beim Aufruf von " __FUNCTION__ " - Fehlercode:" << GetLastError();}    
    #endif 
    
        return bSuccess; 
    
    }
    


  • Hallo @all,

    erstmal Danke für die Beiträge.

    Zur Zeit ist es so, dass bei Start des Programms überprüft wird, ob gerade ein Administrator angemeldet ist. Ansonsten lässt sich das Ganze gar nicht starten. (Hatte das mit einer Überprüfung, ob der Nutzer den Schlüssel HKEY_LOCAL_MACHINE ändern darf, implementiert. Die Lösung von masterofx32 gefällt mir jetzt aber besser). Darüberhinaus, wie kingruedi schon schrieb, würde die Installation wegen fehlender Rechte beim Schreiben in die Registry abbrechen. Soweit OK.
    Das Tool hat aber auch eine Netzwerkfunktionalität, hätte das eher erwähnen sollen. D.h. es lässt sich auch über Netzwerk konfigurieren. Intern ist das recht einfach mit RegConnectRegistry() realisiert. Zur Zeit ist diese Funktion aus meiner Sicht recht unsicher: Spätestens, wenn auf dem Zielrechner ein Administrator angemeldet ist, könnte man von einem anderen Rechner im Netzwerk aus, auf dem man AdminRechte und das Programm hat, die Einstellungen des Zielrechners konfigurieren. Oder sehe ich das falsch?

    Deshab denke ich, wäre eine Passwortabfrage sinnvoll, was aber voraussetzt, dass das Passwort zur Konfiguration des Zielrechners auf dem Zielrechner gespeichert ist. Ich denke der Vorschlag mit der Speicherung des Hashwertes des Passworts von kingruedi ist da sinnvoll.


Anmelden zum Antworten