FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: der_da am 09 Oktober 2017, 11:12:43

Titel: [gelöst] e-mail Authentifizierung (Passwort) verschlüsselt auslagern?
Beitrag von: der_da am 09 Oktober 2017, 11:12:43
Hallo liebe Forumsteilnehmer.

Ich nutze schon lange den E-mail-Versand mittels sub Debianmail (http://www.fhemwiki.de/wiki/E-Mail_senden#Raspberry_Pi).
Was mich etwas stört ist der Umstand, dass das Passwort in der 99_myUtils.pm unverschlüsselt abgelegt ist. Gibt es irgendeine Möglichkeit, das Passwort irgendwie verschlüsselt abzulegen. Eine einfache ROT13-"Verschlüsselung" würde mir da schon reichen - ich möchte nur verhindern, dass der nächste DAU, der im FHEM herumklickt, auf den ersten Blick das Passwort ablesen kann.
Über die Suchfunktion habe ich nur gefunden, dass man einen eigenen Mailserver auf dem Raspi installieren kann. Das wäre für mich aber keine Option.
Titel: Antw:e-mail Authentifizierung (Passwort) verschlüsselt auslagern?
Beitrag von: CoolTux am 09 Oktober 2017, 11:30:22

sub StorePassword($$) {
   
    my ($hash, $password) = @_;
    my $index = $hash->{TYPE}."_".$hash->{NAME}."_passwd";
    my $key = getUniqueId().$index;
    my $enc_pwd = "";

   
    if(eval "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 = setKeyValue($index, $enc_pwd);
    return "error while saving the password - $err" if(defined($err));

    return "password successfully saved";
}

sub ReadPassword($) {
   
    my ($hash) = @_;
    my $name = $hash->{NAME};
    my $index = $hash->{TYPE}."_".$hash->{NAME}."_passwd";
    my $key = getUniqueId().$index;
    my ($password, $err);

   
    Log3 $name, 4, "($name) - Read password from file";
   
    ($err, $password) = getKeyValue($index);

    if ( defined($err) ) {
   
        Log3 $name, 4, "($name) - unable to read password from file: $err";
        return undef;
       
    }
   
    if ( defined($password) ) {
        if ( eval "use Digest::MD5;1" ) {
       
            $key = Digest::MD5::md5_hex(unpack "H*", $key);
            $key .= Digest::MD5::md5_hex($key);
        }
       
        my $dec_pwd = '';
       
        for my $char (map { pack('C', hex($_)) } ($password =~ /(..)/g)) {
       
            my $decode=chop($key);
            $dec_pwd.=chr(ord($char)^ord($decode));
            $key=$decode.$key;
        }
       
        return $dec_pwd;
       
    } else {
   
        Log3 $name, 4, "($name) - No password in file";
        return undef;
    }
}


Damit legst Du das Passwort verschlüsselt in den dafür bestimmten FHEM Ort ab.
Titel: Antw:e-mail Authentifizierung (Passwort) verschlüsselt auslagern?
Beitrag von: der_da am 09 Oktober 2017, 12:15:51
Danke für die schnelle Antwort.  :D
Allerdings ist sie (für mich) zu kurz.
Ich habe die beiden Subs in meine 99myUtils.pm übernommen, eine Datei Secure.txt im Verzeichnis FHEM angelegt und anschließend in der FHEM-Kommandozeile folgendes eingegeben:
{StorePassword ('geheim','Secure.txt')}
bekomme als Antwort aber leider nur ein:
Can't use string ("geheim") as a HASH ref while "strict refs" in use at ./FHEM/99_myUtils.pm line 95.
"strict refs"? Was mache ich da falsch?
Titel: Antw:e-mail Authentifizierung (Passwort) verschlüsselt auslagern?
Beitrag von: CoolTux am 09 Oktober 2017, 12:45:18
Alles.

FHEM hat bereits einen Ort wo solche Daten gespeichert werden.

Alles was Du der Funktion übergeben musst ist den Hash von Deinem Device und das zu verschlüsselnde Passwort.


my $hash = $defs{$name};
StorePassword ($hash,'MEINGEHEIMESPASSWORT')


Titel: Antw:e-mail Authentifizierung (Passwort) verschlüsselt auslagern?
Beitrag von: Grinsekatze am 10 Oktober 2017, 11:16:48
Hey, das find ich gut!

Ich habe damals das PW (für die DebianMail Sub) als base64() String im Perlcode codiert - was jetzt auch nicht soo geheim ist. Die Lösung von CoolTux finde ich jedoch bedeutend schöner!
Titel: Antw:e-mail Authentifizierung (Passwort) verschlüsselt auslagern?
Beitrag von: CoolTux am 10 Oktober 2017, 11:36:25
Es gibt viele Wege. Der von mir genannte deckt den Anforderungen des Threaderstellers ab. Allerdings sollte man nicht das Device auf welchen man den Hash nimmt wegwerfen. Ansonsten ist das PW weg.

Die gezeigte Methode ist eigentlich mehr was für ein Modul. Aber es passt auch in eine myUtils  :D
Titel: Antw:e-mail Authentifizierung (Passwort) verschlüsselt auslagern?
Beitrag von: der_da am 11 Oktober 2017, 10:07:44
Zitat von: CoolTux am 09 Oktober 2017, 12:45:18
FHEM hat bereits einen Ort wo solche Daten gespeichert werden.
Alles was Du der Funktion übergeben musst ist den Hash von Deinem Device und das zu verschlüsselnde Passwort.

my $hash = $defs{$name};
StorePassword ($hash,'MEINGEHEIMESPASSWORT')

Hmm - Danke. Ich weiß, warum ich nicht Programmierer geworden bin. :D Ich habe mich gestern Ewigkeiten damit herumgeschlagen. Ohne Erfolg. :( Habe jetzt erst mal Grinsekatzes Variante mit der base64-Encodierung benutzt. Damit ist das Passwort wenigstens nicht mehr offensichtlich lesbar. Danke für den Wink Grinsekatze.

Trotzdem würde ich gerne wissen wollen, wie CoolTux' Lösung funktioniert. Womit befülle ich denn $defs und $name? Und mache ich das auch in einer weiteren Funktion oder direkt in FHEM? Wenn ich es richtig verstanden habe, wird das Passwort zusammen mit dem Hash irgendeines Devices (z.B. der Dummy du_Beispieldummy?) als Hash abgelegt. Das hätte den Vorteil gegenüber der einfachen base64-Encodierung, dass man zum Entschlüsseln des Passwortes auch noch das zum Verschlüsseln benutzte Device kennen muss - oder? Oder bin ich wieder völlig falsch?
Titel: Antw:e-mail Authentifizierung (Passwort) verschlüsselt auslagern?
Beitrag von: CoolTux am 11 Oktober 2017, 11:34:42
Für Schulungszwecke  ;)


defmod dummyDebianMail dummy
attr dummyDebianMail readingList password,state
attr dummyDebianMail room Test
attr dummyDebianMail setList password read:noArg

setstate dummyDebianMail ichunddu
setstate dummyDebianMail 2017-10-11 11:17:01 password successfully saved
setstate dummyDebianMail 2017-10-11 11:17:26 state ichunddu



defmod notifyDebailMailPassword notify dummyDebianMail:(password|read).* { \
        my $hash = $defs{$NAME};;\
        my $result = 'kaputt';;\
        my ($arg1,$arg2) = split(':',$EVENT);;\
        Log(1, "Event ist: $EVENT");;\
        if( $arg1 =~ /^password/ ) {\
            $result = StorePassword($hash,$arg2);;\
            #Log(1, "Hash ist: $hash");;\
            \
        } elsif( $arg1 =~ /^read/ ) {\
            $result = ReadPassword($hash);;\
        }\
        \
        CommandSet(undef,"$NAME $result");;\
}
attr notifyDebailMailPassword room Test

setstate notifyDebailMailPassword 2017-10-11 11:17:26
setstate notifyDebailMailPassword 2017-10-11 11:14:12 state active
Titel: Antw:[gelöst] e-mail Authentifizierung (Passwort) verschlüsselt auslagern?
Beitrag von: der_da am 26 Oktober 2017, 12:26:07
Habe heute bemerkt, es funktioniert nur nicht, wenn ein Doppelpunkt oder ähnliche ungewöhnliche Zeichen im Passwort enthalten sind.  8) :o
Aber ihr Spezis würdet mit Sicherheit auch dafür wieder einen Weg finden.  :P