staging.inyokaproject.org

Abfrage Passwort und Passwort-Hash in Python3 mit scrypt bzw yescrypt

Status: Gelöst | Ubuntu-Version: Server 22.04 (Jammy Jellyfish)
Antworten |

schneibva

Avatar von schneibva

Anmeldungsdatum:
25. Dezember 2006

Beiträge: 514

Hallo allerseits

m.E. gibt es z.Zt. eine unglückliche Situation bzgl. der Verifizierung eines Passwort-Hashes in Python. Angesichts der modernen GPU-Prozssoren sind Hashes wie MD5, SHA1, bcrypt etc in der Defensive; in zahlreichen Linux-Versionen - auch Ubuntu - wird bereits das moderne yescrypt eingesetzt, das den Angreifern sowohl Rechenzeit als auch Speicherbedarf abverlangt.

Gut so.

Das Problem: wie überprüft man jetzt scrypt bzw yescrypt?

python3-passlib kann zwar noch scrypt, aber nicht mehr yescrypt und ist de_facto tot. python3-crypt kann sowohl mit scrypt als auch yescrypt umgehen, ist aber obsolet und ab Python_3.13 nicht mehr vorhanden. pyescrypt wird noch vorgeschlagen, ist Version 0.1.0 und sieht aus, als wäre es nie richtig lebendig gewesen. Da wird im OS eine moderne Hash-Methode eingesetzt, die aber in Python3 absehbar nicht mehr funktioniert.

Hat jemand weitere Infos zu dieser Problematik?

Viele Grüsse und vorab schon mal vielen Dank.

TK87

Anmeldungsdatum:
8. Juli 2019

Beiträge: 266

Moin,

dafür kannst du den Befehl mkpasswd aus dem Paket whois nutzen. Musst halt nur bei der Überprüfung den Salt übergeben (den ersten Teil bis zum 4. Dollarzeichen).

1
sudo apt install -y whois

Beispiel Bash:

1
2
3
4
5
pwd=`mkpasswd`
printf "Re-enter "
compare=`mkpasswd -S $(cut -d'$' -f1-4 <<<"$pwd")`

[ "$pwd" = "$compare" ]&&echo Passwörter stimmen überein||echo Passwörter sind nicht gleich

Oder z.B. für ein vorhandenes Passwort:

1
salt=`sudo getent shadow thomas |cut -d: -f2|cut -d'$' -f1-4`

Gruß Thomas

schneibva

(Themenstarter)
Avatar von schneibva

Anmeldungsdatum:
25. Dezember 2006

Beiträge: 514

Mir geht es nicht um die Passwörter in /etc/shadow. Ich habe eine Liste - wie in .htaccess beim Apache2 - da stehen die Benutzernamen und Hashes für die Anwender drin. Das Passwort für den u.g. Hash wäre hier 'abcd1234', Algorithmus ist hier yescrypt (sieht man an $y$)

username:$y$j9T$yP9yirH2yTknCiRDDMphh/$46EPatIL0n60AIkfIxHt04rE.45KvxTKooZ6Ms/OPh2

Für eine bestimmte Funktion muss der Nutzer seinen Namen ('username') und das Passwort ('abcd1234') eingeben. Jetzt ist das mit crypt noch easy:

#!/bin/python3
import crypt
# pw = Passwort, hs = Hash 
ergebnis = crypt.crypt(pw,hs) == hs

Mit passlib ebenso (hier mit bcrypt, da passlib kein yescrypt kann):

from passlib.hash import bcrypt
ergebnis = bcrypt.verify(pw, hs) 

ergebnis wäre dann False oder True.

Aber - wie schon gesagt - crypt und passlib haben keine Zukunft. Ich möchte ungern jetzt noch damit herumwursteln und in 2026 mit den neuen Ubuntu LTS alle Hashes für alle Nutzer neu machen. Deswegen die Frage, ob es schon was stabiles gibt für Python.

TK87

Anmeldungsdatum:
8. Juli 2019

Beiträge: 266

schneibva schrieb:

Mir geht es nicht um die Passwörter in /etc/shadow. Ich habe eine Liste - wie in .htaccess beim Apache2 - da stehen die Benutzernamen und Hashes für die Anwender drin. Das Passwort für den u.g. Hash wäre hier 'abcd1234', Algorithmus ist hier yescrypt (sieht man an $y$)

username:$y$j9T$yP9yirH2yTknCiRDDMphh/$46EPatIL0n60AIkfIxHt04rE.45KvxTKooZ6Ms/OPh2

Das ist exakt das selbe, wie das Passwort in der /etc/shadow. Für dieses Beispiel, könntestr du den Hash so überprüfen...

1
mkpasswd -S '$y$j9T$yP9yirH2yTknCiRDDMphh/'

schneibva

(Themenstarter)
Avatar von schneibva

Anmeldungsdatum:
25. Dezember 2006

Beiträge: 514

~$ mkpasswd -S "$y$j9T$yP9yirH2yTknCiRDDMphh/"
Falsche Salt-Länge: 1 Byte, aber 0 wurden erwartet.
~$

TK87

Anmeldungsdatum:
8. Juli 2019

Beiträge: 266

schneibva schrieb:

~$ mkpasswd -S "$y$j9T$yP9yirH2yTknCiRDDMphh/" Falsche Salt-Länge: 1 Byte, aber 0 wurden erwartet.

Ja, die Doublequotes müssen durch Singlequotes ersetzt werden, sonst werden die Dollarzeichen natürlich als Variable interpretiert oder müssten escaped werden. Mein Fehler, hatte es oben schon editiert.

TK87

Anmeldungsdatum:
8. Juli 2019

Beiträge: 266

~$ echo "abcd1234" | mkpasswd -S '$y$j9T$yP9yirH2yTknCiRDDMphh/' -s
$y$j9T$yP9yirH2yTknCiRDDMphh/$46EPatIL0n60AIkfIxHt04rE.45KvxTKooZ6Ms/OPh2

schneibva

(Themenstarter)
Avatar von schneibva

Anmeldungsdatum:
25. Dezember 2006

Beiträge: 514

>>> import subprocess
>>> hs='$y$j9T$yP9yirH2yTknCiRDDMphh/$46EPatIL0n60AIkfIxHt04rE.45KvxTKooZ6Ms/OPh2'
>>> sl='$y$j9T$yP9yirH2yTknCiRDDMphh/'
>>> ans = subprocess.check_output(["mkpasswd", "-S", sl], text=True)
Passwort: 
>>> hs
'$y$j9T$yP9yirH2yTknCiRDDMphh/$46EPatIL0n60AIkfIxHt04rE.45KvxTKooZ6Ms/OPh2'
>>> ans.strip()
'$y$j9T$yP9yirH2yTknCiRDDMphh/$46EPatIL0n60AIkfIxHt04rE.45KvxTKooZ6Ms/OPh2'
>>> 
>>> ans.strip() == hs
True

Zwar deutlich umständlicher, aber läuft!!! Danke!!!

TK87

Anmeldungsdatum:
8. Juli 2019

Beiträge: 266

Gerne. Ansonsten könntest du es auch noch hiermit versuchen: https://github.com/0xcb/pyescrypt

schneibva

(Themenstarter)
Avatar von schneibva

Anmeldungsdatum:
25. Dezember 2006

Beiträge: 514

TK87 schrieb:

Gerne. Ansonsten könntest du es auch noch hiermit versuchen: https://github.com/0xcb/pyescrypt

Hatte ich in meinem 1. Beitrag schon erwähnt. Sieht mir nicht sehr lebendig aus und ist auch umständlicher als crypt oder passlib. Vorteil: komplett in Python ohne Umweg auf die Bash.

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4735

Das ist nicht komplett in Python, das ist eine Python-Anbindung an yescript und das ist in C geschrieben.

schneibva

(Themenstarter)
Avatar von schneibva

Anmeldungsdatum:
25. Dezember 2006

Beiträge: 514

Marc_BlackJack_Rintsch schrieb:

Das ist nicht komplett in Python, das ist eine Python-Anbindung an yescript und das ist in C geschrieben.

Es ist völlig normal, das viele Python-Module in C geschrieben sind. Aber es wäre schön, wenn ich meine Programmierung komplett in Python machen könnte und nicht subprocess o.ä. nutzen müsste

Antworten |