Comment conserver un secret, la clé de l'API dans une application binaire?
Je suis entrain de créer un client Twitter pour Mac OS X et j'ai un Consommateur secret. C'est ma compréhension, je ne devrais pas partager cette secret clé. Le problème est que lorsque je l'ai mis comme une chaîne littérale dans mon application et de l'utilisation, comme ceci:
#define QQTwitterConsumerSecret @"MYSECRETYOUMAYNOTKNOW"
[[QQTwitterEngine alloc] initWithConsumerKey:QQTwitterConsumerKey consumerSecret:QQTwitterConsumerSecret];
Il est dans la section de données de mon application binaires. Les pirates peuvent lire ceci, désassembler l'application, etc..
Est-il un moyen sûr de stocker le Consommateur secret? Dois-je le chiffrer?
- Si vous le chiffrer, vous aurez encore besoin de cacher la clé de chiffrement.
- Définir ce que si le hacker ne connais pas l'algorithme de chiffrement?
- À moins que la clé se réfère à une sorte de compte privilégié, il n'y a pas de raison pour qu'il soit gardé secret ou même qu'elle existe, et Twitter est juste stupide. Si il fait référence à un compte privilégié, alors il n'appartient pas à une application que vous partagez.
- Programmeur: pourquoi êtes-vous ce marquage avec
C
? que l'extrait de code estobjective-c
. - oui, il est, mais je ne veux pas répondre à cette question spécifique à une langue. Je vais supprimer le C de la balise.
- en crypto, il est toujours préférable de supposer que l'adversaire a une parfaite connaissance de la technique de cryptage utilisé, et de travailler autour de cela.
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas de véritable solution parfaite. Peu importe ce que vous faites, quelqu'un dédié, il sera capable de voler.
Même Twitter pour iPhone/iPad/Android/mac/etc. a une clé secrète de là, ils ont probablement mis dans l'ombre en quelque sorte.
Par exemple, vous pouvez le diviser en plusieurs fichiers ou de chaînes de caractères, etc.
Remarque: à l'Aide d'un éditeur hexadécimal, vous pouvez lire des chaînes ascii dans un fichier binaire, qui est le moyen le plus facile. Par décomposer en différents morceaux ou en utilisant des appels de fonction pour créer la clé secrète travaille habituellement pour rendre cette opération plus difficile.
Vous pourriez juste en base64 encode pour obscurcir il. Ou, mieux idée, générer la clé au lieu de simplement stocker - écrire quelque chose comme ceci:
Cependant, un très bon hacker aura, peu importe quoi, la seule façon de vraiment protéger de la aux yeux d'autrui est à l'aide d'une fonction de hachage sûre, mais alors vous ne serez pas en mesure de le récupérer, trop 🙂
int hash(char *s) { return 0; }
Vous ne devriez pas utiliser un secret de la clé api dans une application qui ne fonctionne pas uniquement sur votre serveur.
Même si c'est parfaitement caché.. vous pouvez toujours sauter sur les données qui vont à travers le fil. Et puisque c'est votre appareil, vous pourriez même trafiquer avec SSL (l'homme dans le milieu avec un certificat créé par un CA qui a été ajouté à l'appareil de l'autorité de certification de confiance de la liste). Ou vous pouvez accrocher dans la bibliothèque SSL pour intercepter les données avant d'être chiffré.
Vraiment une réponse tardive...
Si vous configurez votre propre serveur, vous pouvez l'utiliser pour vous aider à l'application bureau à arriver autorisé par les utilisateurs sur twitter, sans partage (c'est à dire: l'intégration) de votre clé secrète.
Vous pouvez utiliser cette approche:
Lorsqu'un utilisateur installe le bureau vous app elle doit s'inscrire avec twitter et avec votre serveur
*)
*) L'application demande au serveur de générer de la demande de jeton URL
*) Le serveur envoie l'URL générée à l'app
*) L'application indique à l'utilisateur à l'autoriser URL
*) L'utilisateur autorise votre application sur twitter et colle le code confidentiel généré en il
*) En utilisant le code PIN de votre application attrape le jeton
*) La communication utilise le jeton et ne pas impliquer votre serveur
Remarque: l'application des journaux à votre serveur à l'aide de l'identification de l'utilisateur (par exemple: id et mot de passe) de votre serveur.