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

Begonnen von CoolTux, 26 März 2021, 16:20:55

Vorheriges Thema - Nächstes Thema

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

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});
.....
}

Passwort speichern

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


Passwort auslesen

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


Passwort löschen

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


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.
$hash->{RenameFn}       = \&Rename;
Die Funktion könnte dann zum Beispiel so aussehen.

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;
}



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



Grüße
Marko
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

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

#2
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!

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.


    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 );


Der Code ist experimental bitte nicht verwenden!!!


Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

rudolfkoenig

ZitatWieso ist Md5 broken?
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.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

KernSani

Ist ja cool... >Vor ca. einem Jahr hatte ich mal überlegt ein Passwort-Hilfsmodul zu bauen. Das kann ich dann von der Taskliste streichen :-)
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

KernSani

Cooltux, wenn du einen Tester suchst - ich hätte einen konkreten Anwendungsfall für das Teil...
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

CoolTux

Sehr gerne. Ich muss aber noch auf sha256 mit Salz umbauen.

Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

vuffiraa

Hallo CoolTux,

du hast oben geschrieben, dass man mit dem Hilfsmodul auch Passwörter auslesen kann. Geht das, wenn man nur einen Hash speichert?

Jetzt sehe ich, dass der Pseudocode aus deinem Beitrag auch fast so in meinen Modulen zu finden ist. Damit bietet sich der Umstieg auf dein Hilfsmodul schon mal an  :) Stellt sich nur die Frage, wie das nun funktioniert. Muss ich mir mal in Ruhe anschauen bzw. hat jemand jemand einen Link, wo das mit der XOR-Verknüpfung erklärt wird?

Gruß VuffiRaa
FHEM 5.8 auf Cubietruck, Raspi B+

Weinzierl KNX IP BAOS 770, Homematic, EnOcean

CoolTux

Hallo Ulf,

Nimm bitte nicht den Code. Ich werde das ganze noch mal umschreiben. Muss nur dazu kommen.


Grüße
Marko
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

vuffiraa

Es ging nicht um das Übernehmen des Code, der ist ja schon länger z.B. aus dem FRITZBOX Modul bekannt.

Ich meine der ganze Algorithmus gehört eher in die Kategorie obfuscation und ist keine sichere Verschlüsselung. Der Algorithmus ist umkehrbar und das ist auch Bestandteil des Code und damit dokumentiert. Die Datei uniqueID reicht alleine aus, um die Passwörter zu entschlüsseln. Momentan macht da ein anderer Hash-Algorithmus auch keinen Unterschied.  Gehasht wird nicht das Passwort, sondern der Schlüssel, mit dem es in die Datei geschrieben wird.
FHEM 5.8 auf Cubietruck, Raspi B+

Weinzierl KNX IP BAOS 770, Homematic, EnOcean

CoolTux

Jepp ich weiß. Daher wird das auch alles anders geschrieben.
Muss nur Zeit finden.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

CoolTux

Hallo,

Also entweder wurde ich falsch verstanden oder ich habe das Konzept mit salt und sha Hash nicht kapiert.
Alles was ich die letzten Tage raus gefunden habe ist, das meine Art der Denkweise nicht funktioniert. Aus einem gesalzenden sha265 Hash kann man kein Plaintextpassword mehr generieren. Man kann nur die validieren und zwar mit einem neu erstellten salt hash welcher durch eine passwordeingabe erfolgt und einen bereits abgespeicherten salt hash.

Was ich will ist ein Plaintext Password verschlüsselt abspeichern um es wieder aus zu lesen und zu entschlüsseln damit es wieder Plaintext wird.

Ich bin der Meinung das mir die allowed Implementierung dabei nicht hilft.



Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

CoolTux

Ok vielleicht habe ich es doch falsch verstanden. Ich muss erstmal noch was testen.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

CoolTux

Ok ich habe mich bedeppert angestellt  :-[
Zu mindest sha256 funktioniert jetzt. kommen wir nun zum salt.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

herrmannj

ähhh - nö. Hash ist eine kryptographische Einwegfunktion. Das darf nicht rückwärts funktionieren. Auf keinen Fall.

Das was Du vmtl möchtest, ist verschlüsseln (plaintext wird in eine cipher gewandelt). Das gibt es in den Geschmacksrichtungen symmetrisch (ver- und entschlüsseln mit dem gleichen Key) oder asymmetrisch (mit dem einem Key wird verschlüsselt, mit einem anderen entschlüsselt).

Ein passendes symmetrisches Verschlüsselungsverfahren ist AES, 128 bit Schlüssellänge gilt als hinreichend sicher (bruteforcen dauert etwa 550Mio Jahre).

Problem: der Key wird als (gemeinsames) Secret bezeichnet. Bedeutet: wenn jemand Zugriff auf die Daten bekommt, dann darf er nicht gleichzeitig den Key welcher zum ver- und entschlüsseln der Passwörter benötigt wird erhalten. Das ist ein Zielkonflikt denn dann müsste man den Key ja immer händisch eingeben wenn fhem das passwort (welches verschlüsselt ist) benötigt.

CoolTux

Ich habe FERTIG!

Mag vielleicht jemand über den Code schauen bitte. Danke

https://git.cooltux.net/FHEM/mod-Password/raw/branch/devel/lib/FHEM/Core/Password/Utils.pm



Grüße
Marko
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

CoolTux

Zitat von: herrmannj am 20 April 2021, 14:39:30
ähhh - nö. Hash ist eine kryptographische Einwegfunktion. Das darf nicht rückwärts funktionieren. Auf keinen Fall.

Das was Du vmtl möchtest, ist verschlüsseln (plaintext wird in eine cipher gewandelt). Das gibt es in den Geschmacksrichtungen symmetrisch (ver- und entschlüsseln mit dem gleichen Key) oder asymmetrisch (mit dem einem Key wird verschlüsselt, mit einem anderen entschlüsselt).

Ein passendes symmetrisches Verschlüsselungsverfahren ist AES, 128 bit Schlüssellänge gilt als hinreichend sicher (bruteforcen dauert etwa 550Mio Jahre).

Problem: der Key wird als (gemeinsames) Secret bezeichnet. Bedeutet: wenn jemand Zugriff auf die Daten bekommt, dann darf er nicht gleichzeitig den Key welcher zum ver- und entschlüsseln der Passwörter benötigt wird erhalten. Das ist ein Zielkonflikt denn dann müsste man den Key ja immer händisch eingeben wenn fhem das passwort (welches verschlüsselt ist) benötigt.

Habe eben erst Deine Antwort gesehen.
Ich habe es nach besten Wissen, Gewissen und meiner gedachten Funktionsweise umgesetzt. Key zum ver und entschlüsseln ist gleich und wird auch entsprechend festgehalten. Aber ich denke mal besser wir nichts und/oder die bisherige Lösung aus dem Fritz-Modul.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

vuffiraa

Ich muss hermannj zustimmen. :(

Es wird doch immer noch nur der Key aus der Passwortdatei gehasht und buchstabenweise mit dem Passwort ver-"oder"-t.
Außerdem ist die Entschlüsselung in getReadPassword in Code gegossen.

Man braucht nur die Datei uniqueID, da steht alles drin.
FHEM 5.8 auf Cubietruck, Raspi B+

Weinzierl KNX IP BAOS 770, Homematic, EnOcean

CoolTux

Die Anforderung war gewesen das Passwort verschlüsselt ab zu legen und ohne User Zutun wieder entschlüsselt aufzurufen um es an eine Anwendung weiter zu reichen. Zum Beispiel HttpUtils um sich an einer Web API zu Authentifizieren.
Gibt es bessere Vorschläge zur Lösung bin ich voll Ohr. Möchte es ja gerne besser machen.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

rudolfkoenig

"Besser" gibts nicht, die Alternativen sind nur Geschmackssache.

Wenn man FHEM ohne menschliche Interaktion betreiben will, dann ist die Verschluesselung des Passworts nur eine Verschleierung, da der Schluessel "daneben" liegt, und jeder mit Zugriff auf dem System es frueher oder spater entschluesseln kann. Meine Loesung (mit setKeyValue/getKeyValue) speichert solche Geheimnisse in einer Datei (/opt/FHEM/FhemUtils/uniqueID), die man normalerweise nicht im Forum herumzeigt.

CoolTux

Danke Rudi.
So war ja auch meine Intention. Sollte dennoch jemand eine elegantere Lösung haben dann bitte bitte her damit.
So wie es aktuell ist würde ich es die Tage einchecken und nach und nach meine entsprechenden Module umstellen.


Grüße
Marko
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

CoolTux

Guten Morgen,

Ich habe das Modul eingecheckt. Habe im ersten Post noch etwas geschrieben.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

KernSani

Hi Marko,
ich habe das in eines meiner Module eingebaut... funktioniert wunderbar. Im ersten Post könntest du vielleicht noch einen Einzeiler für
getReadPassword($name) hinzufügen.
Rename funktioniert bei mir allerdings nicht (und - um ehrlich zu sein - kann eigentlich auch mit meiner alten Funktion nicht funktioniert haben). Wenn ich keine Tomaten auf den Augen habe, existiert $defs{$old} zum rename-Zeitpunkt nicht mehr und daher kann in getReadPassword bei $defs{$name}->{TYPE} auch nichts mehr gefunden werden... Bin nur gerade etwas verwirrt, weil das ja in 1000 Modulen so implementiert ist... Wo ist mein Denkfehler?
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

CoolTux

Hallo Oli,

vielen Dank für den Rename Hinweis, da hast Du vollkommen Recht. Das muss ich noch umschiffen mit $defs{$name}->{TYPE} mit alten Instanznamen.

Aber in meinen Modulen hatte ich das Problem mit Rename gelöst gehabt. Siehe Gardena oder TeslaPowerWall.


Grüße
Marko
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

CoolTux

Hallo Oli,

Ich habe das gefixt. Kommt heute ab 8 Uhr per FHEM Update.

ACHTUNG!!! Neue Syntax für das erstellen des Objektes
FHEM::Core::Authentication::Passwords->new($hash->{TYPE});

Es muss nun immer der Instanztype mit übergeben werden.



Grüße
Marko
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

KernSani

Zitat von: CoolTux am 23 April 2021, 02:56:45
Hallo Oli,

Ich habe das gefixt. Kommt heute ab 8 Uhr per FHEM Update.

ACHTUNG!!! Neue Syntax für das erstellen des Objektes
FHEM::Core::Authentication::Passwords->new($hash->{TYPE});

Es muss nun immer der Instanztype mit übergeben werden.



Grüße
Marko
Nice, dann baue ich heute Abend um (und schaue mal ins Gardena-Modul ;-))
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

CoolTux

Zitat von: KernSani am 23 April 2021, 08:37:55
Nice, dann baue ich heute Abend um (und schaue mal ins Gardena-Modul ;-))

Wie gesagt im Gardena ist noch die alte Lösung ohne das neue Hilfsmodul.

Schau mal hier
https://git.cooltux.net/FHEM/mod-TeslaPowerwall2AC/src/branch/devel/lib/FHEM/Devices/Tesla/Powerwall.pm

Hier habe bereits eine komplett fertige und saubere Implementierung des neuen Password Modules.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

KernSani

Hi Marko,
die globale Definition macht dann aber keinen Sinn, da da $hash noch nicht bekannt ist ;-)
Ansonsten fluppt das und spart eine Menge copy/paste.
Grüße,
Oli
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

CoolTux

Zitat von: KernSani am 24 April 2021, 01:06:27
Hi Marko,
die globale Definition macht dann aber keinen Sinn, da da $hash noch nicht bekannt ist ;-)
Ansonsten fluppt das und spart eine Menge copy/paste.
Grüße,
Oli

Hast auch wieder Recht. Oh man wie gut das noch jemand drauf schaut. Aber auch hier baue ich mal was ein.
Vielen lieben Dank

Marko
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

KernSani

Zitat von: CoolTux am 24 April 2021, 05:54:29
Aber auch hier baue ich mal was ein.
Nimm die Option doch einfach aus der Doku raus. Im define ist es m.E sowieso besser aufgehoben
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

xenos1984

Wie ist denn der Status dieses Moduls? Gibt es da eine stabile API, die für die Modulprogrammierung empfohlen / einsetzbar ist?

Ich arbeite gerade an einem neuen Modul für eine JUCI / JSON-ubus Schnittstelle, die auf manchen Routern läuft, und würde auf diesem Wege das Router-Passwort speichern.

CoolTux

Die API ist stabil und das Modul offiziell. Kannst Du also gerne einsetzen
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Ellert

@CoolTux: Es kann nur ein einziges Passwort pro Device gespeichert werden. Sehe ich das richtig?
Wenn ja, würdest Du das das Hilfsmodul bei Bedarf um eine optionale Angabe erweitern, welche die Passworteinträge unterscheidbar machen? Ich denke darüber nach den Zugriff auf eine 2. API in ein Modul einzubauen, da wäre ein 2. Passwort erforderlich.

CoolTux

Zitat von: Ellert am 01 Februar 2023, 13:51:12
@CoolTux: Es kann nur ein einziges Passwort pro Device gespeichert werden. Sehe ich das richtig?
Wenn ja, würdest Du das das Hilfsmodul bei Bedarf um eine optionale Angabe erweitern, welche die Passworteinträge unterscheidbar machen? Ich denke darüber nach den Zugriff auf eine 2. API in ein Modul einzubauen, da wäre ein 2. Passwort erforderlich.

Du kannst beim setStorePassword statt

setStorePassword($name,$password) machen setStorePassword('irgendwas',$password)

Du must Dir natürlich das irgendwas merken. es sollte also eine Art dauerhafter Bezug vorhanden sein. Probiere mal bitte, das sollte eigentlich soweit gehen. Das irgendwas muss aber auch dauerhaft Bestand haben.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Ellert