006
15.02.2010, 19:07 Uhr
0xdeadbeef
Gott (Operator)
|
Um mehrere Benutzer zu erlauben, wäre eine Abbildung (map) ein sinnvollerer Mechanismus. Außerdem empfiehlt es sich, die Passörter in irgendeiner Weise zu verschlüsseln, sonst kann jeder mit einfachen Mitteln deine Passwörter einsehen. Als Beispiel mit der UNIX-Funktion crypt könnte das etwa so aussehen:
C++: |
#include <crypt.h>
#include <iostream> #include <string> #include <map>
class password_map { public: typedef std::string user_t; typedef std::string password_t; typedef std::map<user_t, password_t> map_t; typedef map_t::const_iterator const_iterator;
// Nur zu Anschauungszwecken. Sinnvoller wäre etwa ein Konstruktor, der die // Passwort-Map aus einer Datei initialisiert. password_map() { users_["Timmo"] = "$1$F\"%1x?^3$3D2lLwnbct9j3YsHsx5Tj0"; }
bool check(user_t const &user, password_t const &pw) const { const_iterator i = users_.find(user);
return i != users_.end() && i->second == crypt(pw.c_str(), get_salt(i->second).c_str()); }
private: static std::string get_salt(std::string pw_enc) { if(pw_enc[0] == '$') { return pw_enc.substr(0, pw_enc.find('$', 3)); }
return pw_enc.substr(0, 2); }
map_t users_; };
int main() { password_map pwmap;
std::string user; std::string pw;
std::cout << "Benutzername: " << std::flush; std::getline(std::cin, user);
std::cout << "Passwort: " << std::flush; std::getline(std::cin, pw );
if(!pwmap.check(user, pw)) { std::cerr << "Authentifikation fehlgeschlagen" << std::endl; return -1; }
std::cout << "Rest des Programms." << std::endl; }
|
Ich benutze crypt dabei, weil es sehr einfach (also anschaulich) ist und mir ein ihm enstprechendes Windows-API nicht bekannt ist.
Wenn Sicherheit nicht von Bedeutung ist, geht das natürlich auch so:
C++: |
#include <iostream> #include <string> #include <map>
class password_map { public: typedef std::string user_t; typedef std::string password_t; typedef std::map<user_t, password_t> map_t; typedef map_t::const_iterator const_iterator;
// Nur zu Anschauungszwecken. Sinnvoller wäre etwa ein Konstruktor, der die // Passwort-Map aus einer Datei initialisiert. password_map() { users_["Timmo"] = "4876"; }
bool check(user_t const &user, password_t const &pw) const { const_iterator i = users_.find(user);
return i != users_.end() && i->second == pw; }
private: map_t users_; };
int main() { password_map pwmap;
std::string user; std::string pw;
std::cout << "Benutzername: " << std::flush; std::getline(std::cin, user);
std::cout << "Passwort: " << std::flush; std::getline(std::cin, pw );
if(!pwmap.check(user, pw)) { std::cerr << "Authentifikation fehlgeschlagen" << std::endl; return -1; }
std::cout << "Rest des Programms." << std::endl; }
|
-- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra Dieser Post wurde am 15.02.2010 um 19:09 Uhr von 0xdeadbeef editiert. |