Berechnung Passwortstärke in C#

In einem aktuellen Projekt besteht der Wunsch die Passwortstärke im Frontend anzuzeigen. Aber wie macht man das am besten. Was ein gutes Passwort ist weiß man ja.. aber wie berechnen 🙂

Man muss aber auch anerkennen, dass 20 Zahlen genauso sicher sind, wie z.b. ein kürzeres Passwort aber mit mehr Variation. Also z.B. Aki§23mE% 

Das heißt: Je komplexer ein Passwort ist, in Abhängigkeit von der Länge, desto sicherer ist es.

–> Der Code ist weiter unten 🙂

Beispiel: wenn ich nur Zahlen verwende, habe ich 10 Symbole. Bei einer Länge von Eins habe ich also eine Chance von 1:9 das richtige zu treffen. Bei 2 Zahlen sind es schon 100 Möglichkeiten u.s.w. Wenn ich Buchstaben nehme sind es 26, wenn ich Groß- und Kleingeschriebene nehme sind es 52.  

Aus dem Vortrag von Dr. Robert Formanek (Uni Hohenheim) (Link zur Präsentation):

Also N (Zeichenvorrat) hoch L (Länge des Passwortes) sind die Möglichkeiten => 95 ^6 => 735.091.890.625 Möglichkeiten (2^40 ==> 40 Bit Entropie) bei 6 Zeichen (a-z, A-Z,0-9 und Sonderzeichen). Wenn eine Grafikkarte also so rund 1Milliarde Passwörter pro Sekunde erproben kann würde es rund 17 Minuten Dauern. 

  • Bei 50Bit Entropie (7 Zeichen) dauert es schon 12 Tage (PC Baujahr 2011) 
  • Bei 52 Bit Entropie ( 8 Zeichen) würde es auf einem Amazon EC2 mit > 1000 Rechnern nur wenige Stunden dauern.
    • Bei über 65 Bit allerdings wohl >94 Jahre !

Werden jetzt “Wörter” verwendet wie Auto2Blume4 muss man neu denken. Da Auto und Blume hier eigene Symbole sind (Diceware) und hätte jetzt 2 Wörter + 2 zahlen.

Code

In unser Funktion muss als erstes bestimmt werden wie viele Zeichen wie nutzen könnten und dann kann man schon rechnen. Wir übergeben der Funktion also das passwort und den Bereich in der ASCII Tabelle von wo bis wo er schauen soll. Gibt es ein Zeichen aus dem Bereich gibt er uns die summe der bereiche zurück

 private int CountPossibleCharactersAndGiveBack(string password, params (int, int)[] range)
        {
            var RangeCount = range.Sum(p => Math.Abs(p.Item2 - p.Item1) + 1);
            foreach ((int, int) tuple in range)
            {
                if (password.ToCharArray().Any(p => p >= tuple.Item1 && p <= tuple.Item2))
                {
                    return RangeCount;
                }
            }

            return 0;
        }

Das nutzen wir dann hier wo dann auch die Berechnung statt findet:

       public int CalcPasswortEntropie(string password)
        {
            var numberOfCharactersN = 0;
            numberOfCharactersN += CountPossibleCharactersAndGiveBack(password, (48, 57)); // Zahlen
            numberOfCharactersN += CountPossibleCharactersAndGiveBack(password, (97, 122)); // kleine Buchstaben
            numberOfCharactersN += CountPossibleCharactersAndGiveBack(password, (65, 90)); // große Buchstaben
            numberOfCharactersN += CountPossibleCharactersAndGiveBack(password, (32, 47), (58, 64), (91, 96), (123, 126)); // Sonderzeichen
            numberOfCharactersN += CountPossibleCharactersAndGiveBack(password, (128, 254)); // alles über 128 Akzente und so

            var lengthOfPassword = password.Length;
            var potenzNhochL = Math.Pow(numberOfCharactersN, lengthOfPassword);
            var entropie = Math.Log(potenzNhochL, 2);
            return (int)Math.Round(entropie, 0, MidpointRounding.ToPositiveInfinity);
        }

Das ganze wird noch gerundet nach oben und man hat die Bits die genutzt werden.

Abschließend noch eine Tabelle aus der Wikipedia zur Passwort Entropie, damit man ein Gefühl bekommt wie ein Passwort sein muss. Aber prinzipell reicht ein Passwort mit einer Entropie über 53. Besser ist mehr 😉

Lizenz des Codes: MIT

Veröffentlicht unter Nützliches | Verschlagwortet mit , , , , , | Schreib einen Kommentar

Broadlink RM 3 Mini + Apple TV Fernbedienung

Vor kurzem entdeckte ich den Broadlink RM 3 Mini und das ist wahrlich ein super “Gateway” in die Welt der nicht-WLAN-fähigen Geräte. Der kleine Kasten (10-25€) kann Infrarotsignale einer Fernbedienung lernen und wieder geben. Es gibt auch eine Handyapp dazu, wo man die Fernbedienung nachbilden kann. Ich möchte das aber im IoBroker nutzen.

Zum IOBroker nur kurz: Die Einrichtung des RM Mini 3 muss abgebrochen werden, sobald sich das Gerät mit eurem WLAN verbunden hat. Keine Zuweisung von Namen, Raum oder sonstewas. 

2. Hinweis IOBroker in der Aktuellen Version 2.0.x ist die Eingabe der IP Adresse noch nicht möglich (wenn ihr ein anderes SUBNET verwendet) – Installiert hier direkt von GitHub (Katze).

Wenn ihr nun versucht die Fernbedienung (2015er) anzulernen, werdet ihr feststellen, dass nur die Laut und Leiser Tasten erkannt werden 🙁 Denn(!) die anderen Tasten funktionieren per Bluetooth (juhu). Nichts destotrotz kann der Apple TV auch IR-Kommands auswerden. Und diese kann man manuell einfügen.

Zuerst im IOBroker die Taste Lauter und Leiser anlernen, damit der entsprechende Ordner angelegt wird. Bei mir hat er ihn L genannt … Jetzt dieses Ordner anklicken und dann (2) oben auf das PLUS drücken.

hier muss der State auf button gesetzt werden und unter NATIV muss ein Feld mit der Bezeichnung “code” angelegt werden. Hier kommt dann der eigentliche “Sendecode” rein. Den Namen im IOBroker kann man beliebig wählen. Am Ende sollte man in den Objekten einen Button sehen.

Codes:

Home

2600a8000001269511131337123712371213133712371237143613361435141114121214121212371237143713111312131311131413111312371313111312131213131313121213120005940001284913000c4e0001274a12000c4f0001274914000c4d0001274a12000c4f0001274a12000c4f0001274913000c4f0001274913000c4e0001274a12000c4f0001284814000c4e0001274912000c4f0001284913000c4e0001264a13000d05

Menu

260050000001269513121237133614361312123714361337123613371237131212131313121213371238123713111412121412131113131313361312121313121214111312131213120005950001264a13000d050000000000000000

OK

260098000001289b11151139103a11381313123812391139103a113912381214101510151015103a121410151139113911391015113912141138111511150f1510151114111510141100054d0001279c111411391239103a1114113911391239113a103912381115101413131015113a0f3a1114123812131214101510160f1511391115101511131115101510160f160f00054e0001284b11000d05

Back

260050000001289312131237133712371312133713371137143613361237141114121411131213361237153512141212121312141113131312371312141211131214121214111411140005930001274b11000d050000000000000000

Up

260050000001279413131137133713371213123614361336133613381137131311141212131214371212123713121338111312131313111312371511131212141114121311131312130005940001274a13000d050000000000000000

Down

260050000001279414121137143612371411123812371237133712371435131314101412121312371214111313361337131311131312131213371313111411131313111411131313120005940001274a13000d050000000000000000

Left

260050000001289312131337133612371412123614361237143614351238131212131312131213361336141213121237121411131312141213361312121313131312121312121313120005940001284913000d050000000000000000

Right

260050000001279314121237123713371214133513361436123713361436131311141312121213371214113713361312131411131510141112371412121312131312111413121213120005950001274917000d050000000000000000

Play

260098000001299a1213113a103a103a1214103a103a103a103a103a14361214121310151015103a113912381238113a1139121411381213123912131213101511141115101412141000054d0001279c1213113a1238103a1114113912381239103a103a123812131213111511151039113912141036161211151015111510151138121312140f151214101510160f151000054e0001274c10000d05

Stop

260050000001269414371114113712141212133712371336143612371336141113131312131313351336141213121214113712381213131212381114121312121312141212131312120005950001264a13000d050000000000000000

Pause

260098000001279c111510391338113911151039113911371439103a113912140f1612131015103a1139123811391239113911150f3a1213113911141214111411141114111411141200054c0001289b11141238123912381015103a1238113a1139113911391114121313121313103a103a1114113911151113121411150f15113911141115111311141213111412141000054e0001284a11000d05

Fast Forward

260050000001289313361411133811131214113713371336133614361336151013121312141212381114133514121435133613131212151015341413121212141113131213121412120005940001274a12000d050000000000000000

Fast Backward

260050000001279313381113133613121411143612371336133713361237141212131312131311381212141113371435123813121213131212371312131213121313121312141213110005950001274913000d050000000000000000

Skip Forward

260050000001289313351413133614121212123812371237133613371237141212131212141213361237133614121312131312361214111313371411131311131214121311141410130005940001274a12000d050000000000000000

Skip Backward

260050000001269512371214113713121313123712371436123712371337121412121312131212371337131311371213141213361213121312371312141213121214131013131312130005940001274913000d050000000000000000

Next Chapter

260050000001279313371213133613131212123713371436133612371336131312131213131212381236133712131313121214361411131213361313111411141114121213131312130005930001274a14000d050000000000000000

Prev Chapter

260050000001269413361213123713131213123712371337133613361536131213121213111313361535121313361412131212371214111313361313121312131313111312141114120005940001264b12000d050000000000000000

Video Mode

2600500000012793131314351237133712131237123713361337123714361213121312141212123713371237123713131336121412121312123615121312121313121313121312121200054d0001264a14000d050000000000000000
Veröffentlicht unter Heimautomatisierung | Verschlagwortet mit , , , , , , , , , | Ein Kommentar

TP-Link WN823n v3 mit schlechtem Empfang unter Linux beheben

Wer einen “guten” und günstigen WLAN USB Stik sucht wird wohl um den TP-Link 823n v3 nicht drumherum kommen. Für unter 10€ bei Amazon ein Schnäpschen. 

Beim Einrichten unter Ubuntu am Intel NUC zeigte er aber mit dem Standard-Treiber sehr schlechte Empfangswerte. Selbst der <30cm entfernt stehende Access-Point zeigte schlechte Werte und der ~8m entfernte UniFi AC-Pro an der Decke war schlecht bis garnicht hörbar.

Wie sich zeigte, liegt das wohl an dem Treiber den Ubuntu mit bringt. Aber es gibt Abhilfe mit dem rtl8192eu linux treiber => https://github.com/Mange/rtl8192eu-linux-driver

Treiber bauen und installieren mittels DKMS

(1) Installieren der Tools und DKMS:

sudo apt-get install git linux-headers-generic build-essential dkms

(2) Klone das Repository und wechsele in den Ordner:

git clone https://github.com/Mange/rtl8192eu-linux-driver

cd rtl8192eu-linux-driver

(3) Füge den Treiber dem DKMS hinzu. Das wird den Quellcode in ein Systemverzeichnis kopieren, so dass er für ein “rebuild” (neubauen) der Module bei einem Kernel-Upgrade verwendet werden kann. 

sudo dkms add .

(4) Kompilieren und installieren des Treibers mittels DKMS

sudo dkms install rtl8192eu/1.0

(5) Distries die auf Debian oder Ubuntu basieren haben einen RTL8XXXU Treiber bereits enthalten und dieser läuft im Kernelspace. Um den RTL8192EU Treiber verwenden zu können muss also der RTL8XXXU Treiber auf die blacklist, damit er nicht geladen wird.

echo "blacklist rtl8xxxu" | sudo tee /etc/modprobe.d/rtl8xxxu.conf

(6) Nun setzen sorgen wir dafür, dass der neue Treiber RTL8192EU aktiv wird beim laden:

echo -e "8192eu\n\nloop" | sudo tee /etc/modules;

(7)  Neuere Versionen von Ubuntu haben merkwürdige Probleme beim Einstecken und Umstecken (Check #94). Dies schließt seltsame Leerlaufprobleme ein, um dies zu beheben:

echo "options 8192eu rtw_power_mgnt=0 rtw_enusbss=0" | sudo tee /etc/modprobe.d/8192eu.conf

(8) Änderungen an Grub & initramfs aktualisieren:

sudo update-grub; sudo update-initramfs -u

(9) Neustart des Systems, um neue Änderungen von neu generierten Initramfs zu laden.

systemctl reboot

(10) Nach dem Neustart kannst Du überprüfen, ob dein Kernel das richtige Modul geladen hat:

sudo lshw -c network

Jetzt sollte man die Zeile sehen: driver=8192eu

Veröffentlicht unter Blogroll, Linux-Welt | Verschlagwortet mit , , , , , , , , , , , , | Ein Kommentar

Hitze Index berechnen im IoBroker

Jetzt wo es wieder wärmer wird ist eine Kennzahl wieder wichtig: Der Hitze Index – die gefühlte Wärme. Dieser berechnet sich aus der Temperatur und der Luftfeuchte. Je feuchte es ist umso wärmer fühlt es sich an. Jedenfalls bei “hohen” Temperaturen.

Daneben gibt es noch den WindChill-Faktor wo die Windgeschwindigkeit eine Rolle spielt.

Die untere Formel für den Hitzeindex in Grad Celsius bzw. Grad Fahrenheit hat eine Genauigkeit von ±0,7 °C bzw. ±1,3 °F. Sie ist bei Temperaturen von mindestens 26,7 °C bzw. 80 °F und einer relativen Luftfeuchtigkeit von mindestens 40 % anwendbar. Als Variablen sind für ϑ die Temperatur in °C bzw. °F und für  die relative Luftfeuchtigkeit in % einzusetzen.

Quelle: Wikipedia

 

Über den “Skript”-Adapter im IoBroker lasse ich nun aller 5min den Hitzeindex für Innen und außen berechnen.

 

[cc lang=”js” tab_size=”2″ lines=”40″ width=”600″]
function Start() {
BerechneAussen();
BerechneInnen();
}function BerechneHitzeIndex(temp, hum){
var t =temp
var f = hum;var t2 = Math.pow(t,2);
var f2 = Math.pow(f,2);

var r =
-8.784695 + 1.61139411*t + 2.338549*f – 0.14611605*t*f – 0.012308094*t2
– 0.016424828*f2 + 0.002211732*t2*f + 0.00072546*t*f2 – 0.000003582*t2*f2;

return r;
}

function BerechneInnen(){
var t = parseFloat( getState(“netatmo.0.Wetterstation.Innen_Wetterstation.Temperature.Temperature”).val);
var f =parseFloat( getState(“netatmo.0.Wetterstation.Innen_Wetterstation.Humidity.Humidity”).val);
var r = BerechneHitzeIndex(t,f);
setState(“0_userdata.0.Hausdaten.Klima.HeatIndex_Innen”,r.toFixed(1));
}

function BerechneAussen(){
var t = parseFloat( getState(“netatmo.0.Wetterstation.Aussen_Wetterstation.Temperature.Temperature”).val);
var f =parseFloat( getState(“netatmo.0.Wetterstation.Aussen_Wetterstation.Humidity.Humidity”).val);
var r = BerechneHitzeIndex(t,f);
setState(“0_userdata.0.Hausdaten.Klima.HeatIndex”,r.toFixed(1));
}

schedule(‘*/5 * * * *’,function(){
Start();
});
[/cc]

Veröffentlicht unter Heimautomatisierung | Verschlagwortet mit , , , , , | Schreib einen Kommentar

IOBroker´s Schreibvolumen reduzieren

Der IOBroker ist eine coole Software um die vielfältigsten Systeme zu vereinen. Dazu rufen Adapter die Daten ab und stellen Kommandos zum steuern bereit. Die Daten werden dabei hierarisch gespeichert. Die Persistierung ist dabei sehr simple. Das Datenobjekt wird als JSON auf die Platte geschrieben. Bei vielen tausend Datenpunkten wird diese Datei aber recht groß und viele Schreibvorgänge erzeugen “Traffic”.

Das wäre nicht unbedingt das Problem, meine NVME kann das locker ab. Aber was ich in den Statistiken dann gesehen habe ich das Schreibvolumen auf die Platte:

Und Schreibvorgänge sind nicht gut für die Lebensdauer der Festwertspeicher.
Also ging ich auf Suche und sah, dass ioBroker zyklich die objects.json speichert die 50MB umfasste. Mittels dem Programm iotop konnte man in der kumulierenden Ansicht sehen, dass schnell GigaBytes an Daten zusammen kommen.

Die Lösung

Eine Möglichkeit wäre natürlich ein träges Dateisystem was als Cache fungiert. Aber besser ist das “Backend” vom IOBroker zu ändern. Das kann man umstellen auf CouchDB oder auch redis. 

Meine Wahl fiel auf redis da es “Leichtgewichtiger” ist. Was ioBroker nur leider noch nicht kann bzw. ich noch nicht gefunden habe, ist die Möglichkeit zur Authentifizierung gegenüber redis. Auth per Token geht leider nicht. Da muss ich mal noch forschen. Gerade für den Multihostbetrieb brauch man eine geschützte Datenbank.

Die Umstellung

Installation redis

$ sudo apt update 
$ sudo apt install redis-server

Durch die Problematik mit der Auth empfiehlt sich eine Installation auf der ioBroker Maschine. 

Redis ist in dem Moment noch nicht “systemverwaltet” das sollte man in der /etc/redis/redis.conf anpassen:

sudo systemctl restart redis.service

Danach kann man den Status abfragen:

sudo systemctl status redis

Jetzt kann man testen:Umstellung ioBroker

Als ersten muss man ioBroker mit stop beenden. Man kann auch mit “pkill io” alles schnell beenden 🙂

dann startet man das custom setup und trägt die Daten ein

iobroker setup custom
Type of objects DB [(f)ile, (c)ouch, (r)edis], default [file]: r
Host / Unix Socket of objects DB(file), default[127.0.0.1]: >ENTER
Port of states DB (redis), default[6379]: >ENTER
Type of states DB [(f)file, (r)edis], default [file]: r
Host / Unix Socket of states DB (redis), default[127.0.0.1]: >ENTER 
Port of states DB (redis), default[6379]: >ENTER
Data directory (file), default[../../../iobroker-data/]: >ENTER
Host name of this machine [iobroker]: >ENTER
creating conf/iobroker.json

Es folgt die Migration von File auf redis. Mit den ganzen Dateien kann das schon 10min dauern bei größeren Installationen.

Danach den iobroker wieder mit start starten und mit iobroker status kontrollieren ob alles läuft:

Im Redis Client kann man mit “keys *” sich auch alle Keys auflisten lassen die es gibt. Bei mir etwas über 150.000 – das ist schon Heftig

Endresultat

Was hat´s nun gebracht?

Die Schreibvorgänge sind erstmal massiv weniger geworden – Ziel erreicht. Aber auch die CPU Last hat sich gebessert:

Der Disk IO ist fast auf 0, dafür mehr Net IO und RAM Auslastung ist auch etwas gesunken am ioBroker.

Auf dem VM Host sieht man “etwas” weniger CPU – aber der redis benötigt natürlich auch etwas CPU Leistung. Aber dadurch, dass die Schreibvorgänge auf die NVME nun drastich weniger sind ist das Ziel erreicht.

Fazit

Ich denke mal, dass auch viele Raspberry Pi Besitzer auf redis als Backend umschalten sollten um die SD Karte zu entlasten. In meinem Beispiel wurden im Monat Mai 10TB an Daten geschrieben – sicher nicht alles der ioBroker aber ganz bestimmt ein Großteil.

Hinweise / Links:

  • Redis selbst speichert die Daten auch (Siehe “save” in der config)
  • IOBroker speichert (backup) weiter die Daten – aber nicht mehr so oft.
  • redis Installieren => Link
  • Redis im Bereich Multihost in der IoBroker Doku Link
Veröffentlicht unter Heimautomatisierung | Verschlagwortet mit , , , , , , , | 2 Kommentare