Hallo,
da es unter Windows-Mobile bislang keine Zugriffsmöglichkeit auf
Postgres-Datenbanken gibt, habe ich einen Client in basic4ppc selbst
geschrieben. Der muss mangels ODBC-Schicht direkt mit dem Backend reden,
was auch soweit gut funktioniert.
Was nicht klappt ist die Authentication mittels MD5-Password. Vermutlich
ist meine Hash-Erzeugung falsch, ich finde aber keine detaillierte
Beschreibung was der Server erwartet.
Orientiert habe ich mich an folgendem Code-Fragment eines Python-
Treibers:
class AuthenticationMD5Password(AuthenticationRequest):
def __init__(self, data):
self.salt = "".join(struct.unpack("4c", data))
def ok(self, conn, user, password=None, **kwargs):
pwd = "md5" + md5.new(md5.new(password + user).hexdigest() +
self.salt).hexdigest()
conn._send(Protocol.PasswordMessage(pwd))
Kann mir jemand damit oder aus anderen Quellen sagen, ob in folgendem
Ablauf ein Fehler steckt?
1. Server liefert Auforderung für MD5-Passwort zusammen mit 4 Bytes Salt.
2. Passwort und Username werden unmittelbar hintereinander zu einem
String verkettet und daraus der erste MD5-Hash gebildet
3. Der Hash wird als String mit Hex-Ziffern abgeholt (ohne ein führendes
"md5") und binär mit den 4 Salt-Bytes verlängert.
4. Aus dem Ergebnis wird nochmal ein Hash gebildet und dieser mit
vorausgestellten "md5" an den Server gegeben.
Zu Hash-Erzeugung benutze ich eine fertige DLL. Testweise liefert die die
gleichen Ergebnisse wie der Python-Hash, daran sollte es also nicht
liegen. Weniger sicher bin ich ob der Punkt 3 korrekt ist.
Da der Server bei Fehlern einfach nur die Connection beendet, ist diese
Seite nicht weiter hilfreich.
Siegfried
--
http://www.schmidt.ath.cx