#1
|
|||
|
|||
iOS Projekt
Hallo zusammen,
ich möchte gerne eine OpenSource JDAnywhere-Alternative starten, nachdem Apple den Vertrieb der App gestoppt hat. Hierbei komme ich leider bereits beim Verbinden eine Fehlermeldung, welche besagt, dass die Authentifizierung fehlgeschlagen ist. Ich habe ein API auf PHP-Basis gefunden und den Ablauf beider Codes miteinander verglichen und erhalte unterschiedliche Signaturen, kann mir aber nicht genau erklären weshalb. Funktionsaufruf laut Dokumentation: Code:
loginSecret=hex(sha256(utf8bytes( email.lowercase + pass + “server” )); queryString = “/my/connect?email=foo@bar.com&rid=1361982773157”; queryString += “&signature=” + HmacSha256(utf8bytes(queryString), loginSecret); Quote:
Code:
// Generate loginSecret - (NSString *)calculateSecretWithEmail:(NSString *)eMail password:(NSString *)password type:(NSString *)type { // Type can be server or device! // loginSecret=hex(sha256( utf8bytes( email.lowercase + pass + “server” )); NSString *rawSecret = [NSString stringWithFormat:@"%@%@%@", [eMail lowercaseString], password, type]; NSData *data = [rawSecret dataUsingEncoding:NSUTF8StringEncoding]; NSString *encoded = [rawSecret SHA256]; // Return this as String because the HMAC function needs a string as key. <- Is this my fault maybe? Couldn't find any other solution. return encoded; } - (NSString*) SHA256 { unsigned int outputLength = CC_SHA256_DIGEST_LENGTH; unsigned char output[outputLength]; CC_SHA256(self.UTF8String, [self UTF8Length], output); return [self toHexString:output length:outputLength];; } - (NSString *)hmacForKeyAndData:(NSString *)key data:(NSString *)data { const char *cKey = [key cStringUsingEncoding:NSASCIIStringEncoding]; const char *cData = [data cStringUsingEncoding:NSASCIIStringEncoding]; unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH]; CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC); NSData *hmacData = [[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)]; // [hmacData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength]; const unsigned char *buffer = (const unsigned char *)[hmacData bytes]; NSString *HMAC = [NSMutableString stringWithCapacity:hmacData.length * 2]; for (int i = 0; i < hmacData.length; ++i) HMAC = [HMAC stringByAppendingFormat:@"%02lx", (unsigned long)buffer[i]]; return HMAC; } Code:
NSString *loginSecret = [self calculateSecretWithEmail:eMail password:password type:@"server"]; NSString *deviceSecret = [self calculateSecretWithEmail:eMail password:password type:@"device"]; NSString *escapedEmail = [eMail stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]]; NSMutableString *query = [NSMutableString stringWithFormat:@"/my/connect?email=%@&appkey=%@&rid=%@", escapedEmail, kAppKey, @"1447631886"]; NSString *signature = [self hmacForKeyAndData:loginSecret data:query]; [query appendString:[NSString stringWithFormat:@"&signature=%@", signature]]; Wie bereits gesagt, im Internet habe ich bereits gesucht und nichts dazu gefunden. Letztendlich habe ich schon Stunden investiert. Vielleicht kennt sich jemand mit Objective-C aus und sieht hier den Fehler. Nach Stunden wird man bekanntlich ja auch blind, was die Fehlersuche anbelangt. Ich möchte ungern alles auf einen externen WebService auslagern, wenn es die App an sich selbst schon können müsste. Hierzu fehlen mir auch die Kapazitäten. Danke und viele Grüße |
#2
|
||||
|
||||
Schreib doch mal den Entwickler der iPhone App an, ob er evtl bestimmte Teile des Codes zur Verfügung stellt. Zb die rohe Client-API?
In Objective-C können wir leider nicht helfen :(
__________________
JD-Dev & Server-Admin |
#3
|
||||
|
||||
Ich würde die Empfehlen Schritt für Schritt zu Testen/Vergleichen
Also erstmal Prüfen ob ein simpler SHA256("HALLO") korrekt ist Via google findest du genug Websiten die dir sowas schnell berechnen. Kann ja auch gut sein das irgendwo ein simpler Fehler im SHA256 ist.
__________________
JD-Dev & Server-Admin |
#4
|
|||
|
|||
Den Entwickler habe ich bereits angeschrieben. Die App holt die Daten aber scheinbar über einen C#-Webservice ab. Einen externen Server wollte ich vermeiden...
Der SHA256-Hash sieht korrekt aus. Ich habe nochmal das PHP-Projekt überprüft. Hier wird die Hash-Funktion aufgerufen (für loginSecret) und als letzten Parameter (raw_output) ein true übergeben. Wenn ich false eintrage, und diesen String für den Hmac-Hash verwende, komme ich auf das selbe Ergebnis wie ich es bei mir im Projekt herausbekomme. Leider habe ich bisher aber keinen Weg gefunden, den Hmac-Hash über ein Byte-Array aufzurufen, das verlangt immer einen String - zumindest alles was ich bisher gefunden habe. Die Ausgabe mit raw_output = true erzeugt leider (aber natürlich klar) immer eine kryptische Ausgabe. |
#5
|
||||
|
||||
NSData *data = [rawSecret dataUsingEncoding:NSUTF8StringEncoding];
NSString *encoded = [rawSecret SHA256]; Wohin geht dein Data? Aber der Fundevil dürfte dir doch die Basics geben können? Die API muss er ja auch Client(iPhone) Seitig implementiert haben. Soweit ich weiß benötigt er den Server nur für die Push-Notifications
__________________
JD-Dev & Server-Admin |
#6
|
|||
|
|||
Ich saß bis zwei Uhr heute Nacht noch dran und hab's letztendlich hinbekommen. Der Fehler war, dass die SHA256-Methode den String als Hexstring zurückliefert. Wenn ich das direkt als NSData (das müsste einem Byte-Array entsprechen) zurückliefere und eine Funktion zum Hashen mit HmacSha256 aufrufe, funktioniert es.
Das eigentliche Problem ist eigentlich die Tatsache, dass die allermeisten Codeschnippsel mit Strings arbeiten und nicht mit konkreten Byte-Objekten. Diese Funktionen sind nicht einmal in Objective-C implementiert. Mit Glück findet man hier einen Wrapper, der die richtigen Parameter mit richtigem Typen auf die C-Funktionen mappt und entsprechend castet bzw. umwandelt. Andere Programmiersprachen machen das leichter und bieten mehrere Standardfunktionen an um das gewünschte Ergebnis zu bekommen (siehe bspw. PHP-Funktion mit $raw_output = true || false;) - in Objective-C ist das eine einzige Umwandlungsfunktion. Letztendlich bekam ich einen Rückgabewert, verschlüsselt in SHA256 und encodiert in base64. Diesen Wert bekomme ich nicht ins JSON-Format entschlüsselt und die ganze Problematik von oben beginnt von vorne. Mit dem Unterschied, dass ich jetzt nicht einmal mehr Vergleichswerte durch das PHP-Projekt bekomme, da das alles als Rohdaten ausspuckt. Ich lege das Projekt vorerst mal auf Eis und werde es mir in Zukunft noch einmal anschauen, wenn ich wieder einen freien Kopf dafür habe. Mein derzeitiger Lichtschimmer wäre maximal, das Backend dezentral in einer anderen Programmiersprache zu programmieren - ist für mich aber wie bereits gesagt, die unschönste Variante. Fundevil ist der JDAnywhere-Entwickler oder? Gestern bekam ich leider keine Antwort mehr von ihm, er sagte aber, dass die Connect-Methode in C# programmiert ist, sieht für mich also nach einer dezentralen Lösung aus. Danke und Grüße |
#7
|
||||
|
||||
ja, Fundevil ist der JDAnywhere Entwickler.
Ich denke das gerade für so *roh* Sachen C# besser geeignet ist als Objective-C. Und ein so Schlimm ist so eine Lösung doch auch nicht, oder? Danke auf jeden Fall fürs Feedback und Klärung der Sache. Wenn wir dir irgendwie helfen können oder du Fragen haben solltest, meld dich einfach unter suppport@jdownloader.org
__________________
JD-Dev & Server-Admin |
#8
|
|||
|
|||
Gibts hier irgend ein update? Das webinterface ist schon klasse aber speziell am iPhone wäre eine native App wieder toll.
|
#9
|
||||
|
||||
Du kannst ja mal Fundevil oder BirdsAreSpies anschreiben. Ohne große Möglichkeit eine App in den Apple Store zu bringen, ist die Motivation eine App zu entwickeln eher gering.
__________________
JD-Dev & Server-Admin |
#10
|
|||
|
|||
@BirdsAreSpies
ich teste auch gerade mit der API herum... Stehe vor dem gleichen Problem, das meine Referenz Signatur vom PHP Projekt zu iOS abweicht. Lag das Problem beim hex´en des loginsecret welches als NSString eine falsche Rückgabe liefert? Könntest mir eventuell die Methoden zum erstellen des loginsecret bzw der Signatur zukommen lassen? |
#11
|
|||
|
|||
Habs hinbekommen!
|
#12
|
||||
|
||||
Wäre evtl Gut wenn du deine Erkenntnisse auch hier posten würdest, für andere
__________________
JD-Dev & Server-Admin |
#13
|
|||
|
|||
Arbeite gerade an einer fetigen klasse, und werde sie hier dann zur verfügung stellen!
|
#14
|
|||
|
|||
Gibt's da schon was?
Seit dem jdsnywhere weg ist, ist es fürs iOS richtiger Mist. Hoffe es gibt bald Abhilfe. |
Thread Tools | |
Display Modes | |
|
|