Passwort encrypten



  • Hallo,
    ich habe eine Passwortabfrage in einem Programm, die nun mit veränderbarem Passwort ersetzt werden soll. Sprich das Passwort muss irgendwo gespeichert werden. Dazu wäre es sinnvoll das Passwort zu verschlüsseln. Gibts da schon eine fertige funktion? Ansonsten dachte ich zieh ich einfach von jedem char 1 ab. Also B->A etc. natürlich sehr unsicher, aber so geheim ist das auch nicht.



  • Hallo

    C++ kennt keine Verschlüsselung, du must dir also entweder selber einen Algorithmus implementieren oder eine passende externe Library benutzen.

    bis bald
    akari



  • Hi,

    was Du tust, ist "Rot1" .... und wirklich nicht besonders sicher.
    Mein Vorschlag wäre: Nutze eine Hashfunktion (SHA1 oder so), denn eigentlich brauchst Du ja nicht das Passwort selbst abzuspeichern, sondern nur einen passenden "Vergleichswert".
    Dann vergleichst Du im Programm nur:

    string eingabePW;
       cout << "Bitte geben Sie das Passwort ein:"
       cin >> eingabePW;
    
       if(SHA1(eingabePW) != liesHashPW()) {
          cout << "Falsches Passwort !! -> Abbruch\n";
          return -1;
       }
    

    Sowas ist schon etwas sicherer, behält aber letztlich die Schwächen, die jede Softwarelösung in einem "offenen Betriebssystem" hat (z.B. mit einem "Patch" kann z.B. einfach die PW-Abfrage übersprungen werden).
    Für den "Normalbetrieb" würde mir das aber reichen.

    Gruß,

    Simon2.



  • Ich empfehle einen MD5-Hash zu benutzen, siehe http://fatman98.fa.funpic.de/builder_crypt.php



  • Also ich benutzte eigentlich immer einen SHA512 hash.
    Weil für md5 gibts ja schon tabellen, wo viele hashwerte drinnestehen.



  • dfgdfg schrieb:

    Also ich benutzte eigentlich immer einen SHA512 hash.

    Code?

    dfgdfg schrieb:

    Weil für md5 gibts ja schon tabellen, wo viele hashwerte drinnestehen.

    Link?





  • also MD5 und ähnliches ist für meinen Fall totaler overkill. Werde wohl die Rot13 function von dem von f98 geposteten link benutzen.
    Eine andere Frage die sich mir nun gestellt hat, ist, wo ich denn das Passwort abspeichere. Einfach in eine Ini rein ist ja blöd, selbst wenn verschlüsselt. Andere Möglichkeit wär in die Registry rein...gibt es da evtl ein Pfad für Passwörter?



  • streetch schrieb:

    also MD5 und ähnliches ist für meinen Fall totaler overkill. Werde wohl die Rot13 function von dem von f98 geposteten link benutzen.
    Eine andere Frage die sich mir nun gestellt hat, ist, wo ich denn das Passwort abspeichere. Einfach in eine Ini rein ist ja blöd, selbst wenn verschlüsselt. Andere Möglichkeit wär in die Registry rein...gibt es da evtl ein Pfad für Passwörter?

    Deine "andere Frage" belegt, dass Deine erste Einschätzung falsch ist. :p 😉 😃
    Ich wette mit Dir, dass Du viel schneller den o.a. Code für die Hashfunktionen eingebunden hast als mit irgendwelchen OS-spezifischen Funktionen "Pseudosicherheit" erzeugt.

    Mein Tipp: Nimm die Hashfunktion und schreib den PW-Hash in die IniDatei.
    Geht schneller und ist sicherer.

    Gruß,

    Simon2.



  • dgcfgdgd schrieb:

    SHA512:
    http://rafb.net/p/vAoJDB19.html

    Danke! Gibts da auch ein Anwendungsbeispiel dafür?

    dgcfgdgd schrieb:

    MD5:
    http://us.md5.crysm.net/

    Interessant.



  • Anwendugsbeispiel(so benutzte ich's):

    LPCWSTR lpPassword = L"TOTOTOTO";
    BYTE digest[64];
    Sha512 sh;
    sh.Update((BYTE*)lpPassword, (DWORD)wcslen(lpPassword) * 2 + 2);
    sh.Final(digest);
    

    Und schon hat man den hash wert.
    Für die größe vom hash kannst du SHA512_DIGEST_SIZE benutzen.



  • ertert schrieb:

    Für die größe vom hash kannst du SHA512_DIGEST_SIZE benutzen.

    Verstehe ich jetzt nicht ganz im Zusammenhang mit dem Anwendungsbeispiel. Und wieso wird die Passwortlänge *2+2 gerechnet?



  • Die Update funktion erwartet bytes, wcslen gibt aber die länge in wchar_t zurück.
    Und da die 2 groß sind(besser sizeof(wchar_t)) nehme ich die länge des texts mal 2 und addiere noch 2 für den null char am ende.

    BYTE diges[SHA512_DIGEST_SIZE];

    so kann man auch SHA256_DIGEST_SIZE etc. benutzten, und muss nicht die länge in bytes ausrechnen.



  • Ok, und den Kauderwelsch, der in digest steht muß man dann noch in Hex wandeln?



  • std::string bignum_to_string (bignum const& n)
    {
        std::ostringstream os;
        os.width (2);
        os.fill ('0');
        BOOST_FOREACH(unsigned byte, n)
        {
            os << std::hex <<  byte;
        }
        return os.str ();
    }
    
    template <typename Iterator>
    unsigned char read_byte (Iterator& i)
    {
        unsigned char c = *i++;
        unsigned char result = (c < 'a' ? c - '0' : c - 'a' + 10) * 16;
        c = *i++;
        return result + (c < 'a' ? c - '0' : c - 'a' + 10);
    }
    
    bignum string_to_bignum (std::string const& s)
    {
         bignum result;
         std::string::const_iterator i = s.begin ();
         BOOST_FOREACH(unsigned char& b, result)
         {
             b = read_byte (i);
         }
         return result;
    }
    

    So mach ich das. bignum ist einfach ein sehr schmal gekapseltes Array (soll heißen es bietet begin und end). BOOST_FOREACH muss man auch nicht benutzen. read_byte geht sicherlich schöner (und portabler), aber für den Anfang tuts das auch ;).



  • Vielleicht wäre ja auch hashlib++ eine alternative.
    Im moment werden zwar nur MD5 und SHA1 unterstützt, aber dafür ist die Sache sehr einfach zu handhaben.

    http://hashlib2plus.sourceforge.net



  • falls du die volle packung brauchst nimm www.cryptopp.com. einbinden, in deinem fall zwei zeilen code schreiben - fertig.

    @md5: gilt immer noch als nicht geknackt. es treten lediglich kollisionen auf. für anwendungen wo es nicht wirklich drauf ankommt immer noch völlig in ordnung. sha etc. sind natürlich sicherer und auch nicht schwieriger zu verwenden,.



  • ertert schrieb:

    Anwendugsbeispiel(so benutzte ich's):

    LPCWSTR lpPassword = L"TOTOTOTO";
    BYTE digest[64];
    Sha512 sh;
    sh.Update((BYTE*)lpPassword, (DWORD)wcslen(lpPassword) * 2 + 2);
    sh.Final(digest);
    

    Und schon hat man den hash wert.
    Für die größe vom hash kannst du SHA512_DIGEST_SIZE benutzen.

    Kann mir jemand sagen wie ich BYTE in char* oder System::String o.Ä. bekomme?



  • BYTE ist in der Regel char oder unsigned char .

    greetz, Swordfish



  • BYTE ist in der Regel wohl unsigned char (0 ... 255) ...



  • Ist mir inzeischen auch wieder eingefallen, bringt mich leider nicht weiter:
    Wenn ich den Hash von Teststring bilde erhalte ich mit

    char* hashChar = (char*)hash;
    

    (hash ist ein BYTE Wert) σá5~︽ñT(PÖm€Ö ä W܃ô©!ÓléÎGÐÑ<]…ò°ÿƒÒ‡~ì/c¹1½GAz¥82zù'Ú>Å#G„¨J, ich brauche das ganze aber als Hexwert, das wäre dann bei SHA512 0226198a38c58db0f43f845549a11e1a3c323400dfd00fb5df25fbf97c5fed6fc90bc383a17d26de5bdea367369afc7ccd7fa7234052c67fc1a1fe83daf21c0e


Anmelden zum Antworten