JDownloader Community - Appwork GmbH
 

Go Back   JDownloader Community - Appwork GmbH > Deutscher Support > Allgemeine Diskussion
Reply
 
Thread Tools Display Modes
  #1  
Old 16.11.2015, 12:30
BirdsAreSpies
Guest
 
Posts: n/a
Default 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);
Testdaten (User existiert so nicht, da ich die Datenbank nicht mit unnützen Daten zumüllen möchte. Es geht hier ausschließlich um die generierte Signatur, da das PHP-Projekt eindeutig funktioniert):
Quote:
Test data (User: hi@mynameis.com, Password: testtest1234, rid: 1447631886, AppKey: FBJDRemote)

PHP project: 23de4c7b37eb4299d9cd6eaa64c403e4b6c7450cbc5c70a93cdc21a1aa819c3c

Objective-C project: 9b478bed48ca79b8e04330ca663226599f48de05b59c9fab29e90d46bb928059
Code zum Verschlüsseln:
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;
}
Und "Main-Funktion":
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]];
Zudem noch der Link zum PHP-Projekt: **External links are only visible to Support Staff**Klick

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
Reply With Quote
  #2  
Old 16.11.2015, 14:45
Jiaz's Avatar
Jiaz Jiaz is offline
JD Manager
 
Join Date: Mar 2009
Location: Germany
Posts: 79,571
Default

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
Reply With Quote
  #3  
Old 16.11.2015, 14:47
Jiaz's Avatar
Jiaz Jiaz is offline
JD Manager
 
Join Date: Mar 2009
Location: Germany
Posts: 79,571
Default

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
Reply With Quote
  #4  
Old 16.11.2015, 17:52
BirdsAreSpies
Guest
 
Posts: n/a
Default

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.
Reply With Quote
  #5  
Old 17.11.2015, 12:22
Jiaz's Avatar
Jiaz Jiaz is offline
JD Manager
 
Join Date: Mar 2009
Location: Germany
Posts: 79,571
Default

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
Reply With Quote
  #6  
Old 17.11.2015, 14:29
BirdsAreSpies
Guest
 
Posts: n/a
Default

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
Reply With Quote
  #7  
Old 18.11.2015, 13:38
Jiaz's Avatar
Jiaz Jiaz is offline
JD Manager
 
Join Date: Mar 2009
Location: Germany
Posts: 79,571
Default

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
Reply With Quote
  #8  
Old 02.01.2016, 18:37
Macbook Pro Macbook Pro is offline
Modem User
 
Join Date: Dec 2015
Posts: 3
Default

Gibts hier irgend ein update? Das webinterface ist schon klasse aber speziell am iPhone wäre eine native App wieder toll.
Reply With Quote
  #9  
Old 03.01.2016, 11:04
Jiaz's Avatar
Jiaz Jiaz is offline
JD Manager
 
Join Date: Mar 2009
Location: Germany
Posts: 79,571
Default

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
Reply With Quote
  #10  
Old 20.01.2016, 15:25
hugoboss
Guest
 
Posts: n/a
Default

@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?
Reply With Quote
  #11  
Old 21.01.2016, 08:27
hugoboss
Guest
 
Posts: n/a
Default

Habs hinbekommen!
Reply With Quote
  #12  
Old 21.01.2016, 08:36
Jiaz's Avatar
Jiaz Jiaz is offline
JD Manager
 
Join Date: Mar 2009
Location: Germany
Posts: 79,571
Default

Wäre evtl Gut wenn du deine Erkenntnisse auch hier posten würdest, für andere
__________________
JD-Dev & Server-Admin
Reply With Quote
  #13  
Old 27.01.2016, 11:31
hugoboss
Guest
 
Posts: n/a
Default

Arbeite gerade an einer fetigen klasse, und werde sie hier dann zur verfügung stellen!
Reply With Quote
  #14  
Old 04.02.2016, 21:10
wastez
Guest
 
Posts: n/a
Default

Gibt's da schon was?
Seit dem jdsnywhere weg ist, ist es fürs iOS richtiger Mist.
Hoffe es gibt bald Abhilfe.
Reply With Quote
Reply


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump

All times are GMT +2. The time now is 18:52.
Provided By AppWork GmbH | Privacy | Imprint
Parts of the Design are used from Kirsch designed by Andrew & Austin
Powered by vBulletin® Version 3.8.10 Beta 1
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.