FHEM - Entwicklung > FHEM Development

[FHEM::Core::Authentication::Passwords] Password Hilfsmodul

(1/7) > >>

CoolTux:
Hallo,

Ich habe ein Password Hilfsmodul geschrieben um Passwörter entsprechend zu verwalten. Bedeutet speichern, auslesen, löschen und ändern.
Die Passwörter werden gesalzen als SHA265 Hash im keyFileName (default uniqueID) abgespeichert.

Beispiel Anwendung:

Klasse einbinden und ein Objekthash mittels des Constructors erzeugen

--- Code: ---use FHEM::Core::Authentication::Passwords qw(:ALL);
...
sub Define {
    my $hash = shift // return;
    my $aArg = shift // return;
.....
    ### create password object to handle pass keystore
    $hash->{helper}->{passObj}  = FHEM::Core::Authentication::Passwords->new($hash->{TYPE});
.....
}

--- Ende Code ---
Passwort speichern

--- Code: ---my ($passResp,$passErr);
 ($passResp,$passErr) = $passwdObj->setStorePassword($name,$password);

--- Ende Code ---

Passwort auslesen

--- Code: ---my $password;
$password = $passwdObj->getReadPassword($name);

--- Ende Code ---

Passwort löschen

--- Code: ---my ($passResp,$passErr);
($passResp,$passErr) = $passwdObj->setDeletePassword($name);

--- Ende Code ---

Ist $passResp definiert und $passErr ist undef wurde das Passwort erfolgreich abgespeichert. Bei einem Fehler bekommt $passResp ein undef und $passErr enthält den Fehlergrund


Wenn Devices/Instanzen umbenannt werden so muss man eine Rename Funktion in seinem Modul haben welche entsprechend in der Initialize Funktion zugewiesen wurde.

--- Code: ---$hash->{RenameFn}       = \&Rename;
--- Ende Code ---
Die Funktion könnte dann zum Beispiel so aussehen.

--- Code: ---sub Rename {
    my $new     = shift;
    my $old     = shift;
   
    my $hash    = $::defs{$new};

    my ($passResp,$passErr);
    ($passResp,$passErr) = $hash->{helper}->{passObj}->setRename($new,$old);
   
    ::Log3($new, 1,
qq(MODULNAME \(${new}\) - error while change the password hash after rename - $passErr))
        if ( !defined($passResp)
        and defined($passErr) );

    ::Log3($new, 1,
qq(MODULNAME \(${new}\) - change password hash after rename successfully))
        if ( defined($passResp)
        and !defined($passErr) );

    return;
}

--- Ende Code ---


Spricht etwas gegen das einchecken ins SVN?
Das Modul befindet sich seit heute im SVN



Grüße
Marko

herrmannj:
Md5 ist brooken, aber das nur am Rande. ;) Und salzen, bitte ;)

Das Modul ist nicht dafür gedacht ein Passwort zu hinterlegen um auf einen 3rd Dienst zu zugreifen? Richtig? Thnx für die Idee!

CoolTux:

--- Zitat von: herrmannj am 26 März 2021, 16:25:56 ---Md5 ist brooken, aber das nur am Rande. ;) Und salzen, bitte ;)

Das Modul ist nicht dafür gedacht ein Passwort zu hinterlegen um auf einen 3rd Dienst zu zugreifen? Richtig? Thnx für die Idee!

--- Ende Zitat ---

Das musst Du mir erklären. Wieso ist Md5 broken?

Das Modul ist dafür gedacht Modulentwickler beim händling mit Passwörtern zu unterstützen. Für was das Passwort im jeweiligen Modul genutzt obliegt dem jeweiligen Entwickler.


--- Code: ---    my $index   = $defs{$name}->{TYPE} . '_' . $name . '_passwd';
    my $key     = getUniqueId() . $index;
    my $enc_pwd = '';

    if ( eval q{use Digest::MD5;1} ) {

        $key = Digest::MD5::md5_hex( unpack "H*", $key );
        $key .= Digest::MD5::md5_hex($key);
    }

    for my $char ( split //, $password ) {

        my $encode = chop($key);
        $enc_pwd .= sprintf( "%.2x", ord($char) ^ ord($encode) );
        $key = $encode . $key;
    }

    my $err;
    $err = setKeyValue( $index, $enc_pwd );

--- Ende Code ---

Der Code ist experimental bitte nicht verwenden!!!


Grüße

rudolfkoenig:

--- Zitat ---Wieso ist Md5 broken?
--- Ende Zitat ---
Weil irgendwelche Leute mit viel Geduld und CPU vor paar Jahren geschafft haben, mehrere Texte zu erstellen mit dem gleichen MD5 Hashwert.
Selbst allowed verwendet seit Jahren sha256. Mit Salz. :)

CoolTux:
Alles klar. Dann baue ich entsprechend um. Kein Problem.
Danke für den Hinweis.

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln