2014-07-18 1 views
4

J'essaie d'utiliser l'UUID pour générer un nonce à utiliser pour l'authentification inverse de Twitter. Mais apparemment, l'UUID n'est pas un bon choix. Donc, comment puis-je générer une chaîne aléatoire unique à chaque fois dépouillant tous les caractères non-mot, en prenant soin qu'il se libère de la mémoire après utilisation. Le code suivant se bloque.Génération de chaîne unique aléatoire à utiliser comme nonce (oauth)

var uuid: CFUUIDRef = CFUUIDCreate(nil) 
    var nonce: CFStringRef = CFUUIDCreateString(nil, uuid) 
    CFRelease(uuid) 

    println("createdNonce:\(nonce)") 

EDIT: Je suis sur xcode6 beta2, et je ne peux pas le débogage et les accidents de xocde, une chance qu'il obtient. Tellement bien, la partie CFRelease s'écrase pour moi. Une fois que je l'enlève, il semble bien fonctionner, mais je ne sais pas si cela va créer une fuite de mémoire.

Quant à savoir pourquoi ce UUID pourrait ne pas être un bon choix à utiliser pour apax il semble est parce que, UUID ne sont pas faits de vrais bits aléatoires, se référant cette discussion ici: https://github.com/aws/aws-sdk-ios/issues/30

+1

Regardez plutôt 'NSUUID', c'est ObjC et donc plus convivial pour Swift. Et pourquoi ne pas simplement générer une chaîne aléatoire pour le nonce? – Krumelur

+1

Pouvez-vous clarifier pourquoi vous pensez que l'UUID est un mauvais choix? Ce code a bien fonctionné pour moi dans un terrain de jeu Swift. Pouvez-vous partager plus de détails sur le crash? –

+0

a ajouté info @AaronGolden – srinivas

Répondre

9

Une façon plus correcte de la génération d'un nonce serait probablement de générer des octets aléatoires à l'aide un RNG cryptographique. iOS arrive juste pour avoir une telle chose:

var s = NSMutableData(length: 32) 
SecRandomCopyBytes(kSecRandomDefault, UInt(s.length), UnsafePointer<UInt8>(s.mutableBytes)) 

// s is now a NSData containing 32 random bytes 

ensuite convertir en une chaîne en utilisant l'API quel que soit le format suggère (probablement base64), par exemple

let base64str = s.base64EncodedStringWithOptions(0) 

EDIT: L'approche ci-dessus semble être celle que Twitter utilise dans les docs. Voir here. Je ne peux pas dire si les UUIDS sont plus facilement prédits. Cela dépend de la méthode à laquelle ils sont générés. SecRandomCopyBytes semble être utilisé à des fins de cryptographie, il devrait donc être sûr à utiliser.

+4

Beaucoup de choses ont changé dans Swift. Ressemble plus à ça maintenant: 'SecRandomCopyBytes (kSecRandomDefault, s! .length, UnsafeMutablePointer (s! .mutableBytes))' et 'let base64String = s! .base64EncodedStringWithOptions (NSDataBase64EncodingOptions (0))' – cowfaboo

0

Cela pourrait ne pas être une solution parfaite, mais veulent le suggérer, car il faudra beaucoup de Twitter inverse auth folie pour vous ..

Essayez d'utiliser cocoapod TWReverseAuth

+0

merci je vais vérifier ce pod – srinivas

+0

Je le faisais mal plus tôt. Maintenant, je génère le jeton x_reverse_auth sur le serveur et que le client mobile appelle, puis utilise SLRequest pour s'authentifier auprès de Twitter. J'ai étendu j7mbo/twitter-php-app pour faire twitter reverse auth. Voici la lib: https://github.com/srinivasmangipudi/twitter-api-php – srinivas

2

Votre code se bloque parce que vous appelez CFRelease .Dans swift il n'y a pas besoin d'appeler CFRelease .F rom swift guide

base Fondation objets renvoyés API annotés sont automatiquement mémoire gérée à Swift-vous n'avez pas besoin d'invoquer la CFRetain, CFRelease, ou vous CFAutorelease les fonctions.

var uuid: CFUUIDRef = CFUUIDCreate(nil) 
    var nonce: CFStringRef = CFUUIDCreateString(nil, uuid) 
    //Remove this swift will manage the memory managment.This line is causing crash 
    //CFRelease(uuid) 
    println("createdNonce:\(nonce)") 

ce code fonctionne très bien. Non, ce ne sera pas créer rapidement des fuites de mémoire gérerez que

+0

Avait complètement manqué que Swift gère automatiquement les objets CF. Une raison de plus de pousser pour Swift alors :) +1 – Krumelur

0

Voici un moyen plus facile de le faire alors:

var temp = NSUUID.UUID().UUIDString 
    var nonce = temp.stringByReplacingOccurrencesOfString("-", withString: "") 
    println("createdNonce:\(nonce)") 
Questions connexes