• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Wir haben den Frühjahrsputz beendet, Ihr auch? Welches Foto zu dem Thema hat Euch dann am Besten gefallen? Hier geht es lang zur Abstimmung --> Klick

Verschlüsselungsverfahren übernehmen

moritzmoritz

Erdapfel
Registriert
04.03.13
Beiträge
4
Hallo Community,

erster Post und ich hoffe, dass man mir mit dem Problem direkt helfen kann.

Also: ich möchte für eine bessere Übersicht über meine Projekte ein Programm schreiben, was es ermöglicht neue Projekte anzulegen. Die Daten sollen in einer MySQL-Datenbank gespeichert werden, weil ich möchte, dass meine Kunden jeder Zeit einen Einblick in das Projekt erhalten können.

Aktuell geschieht dies manuell und die Daten werden mit folgenden Funktionen (in PHP) verschlüsselt:

Code:
public function encrypt($decrypted) {    // Verschlüsseln
        // 256-Bit Key
        $key = hash('SHA256',$this->salt,$this->password,true);
        srand();
        $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC), MCRYPT_RAND);
        if(strlen($iv_base64 = rtrim(base64_encode($iv),'=')) != 22) return false;
        
        $encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $decrypted . md5($decrypted), MCRYPT_MODE_CBC, $iv));
        
        return $iv_base64 . $encrypted;
    }
    
    public function decrypt($encrypted) {
        // 256-Bit Key    
        $key = hash('SHA256',$this->salt,$this->password,true);
        
        $iv = base64_decode(substr($encrypted, 0,22).'==');
        
        // remove iv from encrypted
        $encrypted = substr($encrypted,22);
        
        $decrypted = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, base64_decode($encrypted), MCRYPT_MODE_CBC, $iv),"\0\4");
        
        $hash = substr($decrypted, -32);
        
        $decrypted = substr($decrypted, 0,-32);
        
        if(md5($decrypted) != $hash) return false;
        
        return $decrypted;
[COLOR=#F9F9F9]    }[/COLOR]

Gibt es eine Möglichkeit diese Funktionen in Objective-C zu übernehmen? Mein Server verfügt über ssl .. könnte ich sonst die Daten unverschlüsselt dorthin schicken? Wobei das nicht schön wäre, weil wenn jemand den SSL-Kanal geknackt hat, kann dieser unegehindert mitlesen.

Oder habt ihr eine andere Art der Verschlüsselung? Könnte ja meine PHP-Version anpassen ... gibt es eine Klasse von Apple selbst, die es ermöglicht bekannte Verschlüsselungstechniken zu verwenden?

Schönen ersten sonnigen Nachmittag euch allen,

Moritz
 

Marcel Bresink

Hadelner Sommerprinz
Registriert
28.05.04
Beiträge
8.574
Das geht ohne Probleme, da alle diese Funktionen mehrfach im System vorhanden sind. Je nach Systemversion gibt es von Apple unterschiedliche Empfehlungen, aus welcher Bibliothek man die Funktionen verwenden sollte:

- Vor Mac OS X 10.4 sollte man das Programm mit der im System vorhandenen OpenSSL-Bibliothek linken und deren Funktionen verwenden. Nähere Hinweise siehe "man ssl".
- Ab Mac OS X 10.4 sollte man die sogenannten "CommonCrypto"-Funktionen verwenden, die bereits in libSystem eingebaut sind. Nähere Hinweise siehe "man CC_crypto".
- Ab OS X 10.8 sollte man das Security-Framework verwenden und dort mit sogenannten "Security Transforms" arbeiten. Nähere Hinweise siehe 10.8-Dokumentation unter "Security > Security Transforms Programming Guide".
 

moritzmoritz

Erdapfel
Registriert
04.03.13
Beiträge
4
- Vor Mac OS X 10.4 sollte man das Programm mit der im System vorhandenen OpenSSL-Bibliothek linken und deren Funktionen verwenden. Nähere Hinweise siehe "man ssl".
- Ab Mac OS X 10.4 sollte man die sogenannten "CommonCrypto"-Funktionen verwenden, die bereits in libSystem eingebaut sind. Nähere Hinweise siehe "man CC_crypto".
- Ab OS X 10.8 sollte man das Security-Framework verwenden und dort mit sogenannten "Security Transforms" arbeiten. Nähere Hinweise siehe 10.8-Dokumentation unter "Security > Security Transforms Programming Guide".

Danke für deine gute Antwort :) sind den Unterschiede in der Performance oder in der Sicherheit vorhanden oder ist das eigt. irrelevant?

Moritz
 

Marcel Bresink

Hadelner Sommerprinz
Registriert
28.05.04
Beiträge
8.574
Da die Funktionen sich hundertprozentig gleich verhalten sollten, kann es keine Unterschiede in der Sicherheit geben. Im Detail kann das natürlich von der Version der jeweiligen Bibliothek abhängen, die aber in jeder Betriebssystemversion unterschiedlich sein könnte. Das gilt aber für PHP genauso.
 

moritzmoritz

Erdapfel
Registriert
04.03.13
Beiträge
4
Alles klar :)

Jetzt stehe ich schon vor meinem ersten problem:
Code:
[COLOR=#008607][COLOR=#000000] $key = hash('SHA256',$this->salt,$this->password,true);[/COLOR][/COLOR]
ist in PHP .. das Password und den Salt habe ich. Wie kriege ich jetzt aber einen Hash in Objective-C ?

Oder sollte ich lieber ein weniger anspruchvolles Verfahren ausarbeiten und verwenden?

Moritz
 

Marcel Bresink

Hadelner Sommerprinz
Registriert
28.05.04
Beiträge
8.574
Ich nehme mal an, das soll in Wirklichkeit

Code:
$key = hash('SHA256', $this->salt . $this->password, true);

heißen?

Du musst Dir schon die Mühe machen, die Dokumentation der jeweiligen Bibliothek zu lesen. Angenommen, Du würdest die CommonCrypto-Funktionen von Mac OS X verwenden, dann wäre das in Objective-C in etwa wie folgt:

Code:
NSString  *stringToHash;
NSData *dataToHash;
unsigned char key[CC_SHA256_DIGEST_LENGTH];

stringToHash = [[self salt] stringByAppendingString: [self password]];
dataToHash = [stringToHash dataUsingEncoding: NSUTF8StringEncoding];
CC_SHA256([dataToHash bytes], (CC_LONG)[dataToHash length], key);

Du wirst öfter feststellen, dass PHP an einigen Stellen "unterspezifiziert" ist, d.h. die offizielle Dokumentation sagt nicht immer klar, wie bestimmte Details zu implementieren sind. Das muss man dann durch Re-Engineering ermitteln. Im obigen Fall ist z.B. nicht ganz klar, welche Zeichencodierung verwendet wird, um den Kennwort-String in rohe Bytes zu wandeln. Der Beispielcode geht von UTF-8 aus.