Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Comment obfusquer une chaîne de caractères dans un script Python ?

+4 votes

Contexte

Je fournis des scripts d'administration en Python destinés à des machines sous Mac OS.
Quelques scripts doivent installer sur les postes clients la clé ssh d'un serveur rsync car c'est le serveur rsync qui contacte les clients.

En Python, je vais directement ajouter cette clé dans le poste client à partir d'une chaîne de caractères de mon script Python puis ajouter au fichier existant cette clé.

Problème

Comment cacher à minima cette clé qui est en clair dans mon script Python ? Est-ce que je m'y prends bien par cette méthode ? Est-ce que je chiffre uniquement cette chaîne et je l'a décode à la volée avant écriture dans le fichier ou bien dois-je compiler ce script avec nuitka ou cython pour cacher cette chaîne ?
Quels sont vos conseils ?

demandé 15-Jan-2015 par DoubleNain (1,662 points)

Le soucis avec ce type de question, même si elle est intéressante, de manière générale , est si "ouverte" que ça va mener à ce que chacun propose une réponse pas forcément précise ( avec du code par exemple) ou mene à du troll (quoiqu'on soit assez adulte ici pour l'éviter) .
ce que je veux dire c'est qu'on s'attend ici plus à " j'ai un problème / erreur, quelle est la solution/pourquoi ?"
Demander du " best practice " j'ai peur que tu n'aies jamais la réponse rêvée.
Et pour avoir cotoyé des plateforme equivalentes, les utilisateurs y repondent peu parce que le temps passé sur le sujet ne leur rapportera pas de petits points (la carotte, y'a que ça qui interressent certains)
J'attends de voir qd même la réponse , ça me titille aussi ;)

J'avoue, je suis intéressé aussi. On a besoin de passer le code source de certaines applications à nos clients qui référencent des services internes ayant besoin d'un peu de sécurité.

Si vous avez des idées, je suis largement preneur. :D

Le serveur rsync contact les clients via ssh, donc c'est la cle publique du serveur rsync qui doit etre copiée chez les clients. Heu, une cle publique, comme son nom l'indique, est publique, ou alors j'ai pas bien compris le probleme. Peut on voir ton script, histoire de mieux saisir le contexte?

4 Réponses

+5 votes
 
Meilleure réponse

Problème pris à l'envers.

Il faut séparer le code des données.

Le serveur rsync doit contacter l'ordinateur client, donc le script doit générer une pair de clés sur le client, et exporter la clé public vers le serveur rsync.

Aucun besoin d'obfuscation dans ce cas d'utilisation.

D'une manière général, si on a besoin d'obfusquer du code pour autre chose que "jouer" (occ, capture de drapeau, etc...) c'est qu'on s'y prend mal.

répondu 19-Jan-2015 par yohann (312 points)
sélectionné 19-Jan-2015 par DoubleNain

Merci à tous pour vos suggestions.
Je vais me baser effectivement sur la suggestion de yohann, car je prenais bien le problème à l'envers...Avec une clé publique, pas de problème.

Si j'ai bien compris le besoin initial, c'est le serveur rsync qui va se connecter au client.
Donc la paire de clé est bien générée côté serveur et ensuite la clé publique est envoyé au client afin que le serveur puisse se connecter via sa paire de clé.

Si c'est bien le cas, il n'y a rien à obfusquer : une clé publique est par définition publique. Peu importe si quelqu'un parvient à la récupérer, ça n'empêchera pas le serveur de contacter son client et ça ne permettra pas à Malory de se connecter au client puisqu'elle n'aura pas la clé privée.

J'ai raté quelque chose ?

–3 votes

Chiffrer la chaîne avec un algorithme un minimum compliqué (XOR, permutation de caractères, ...)
Ensuite, ne fournir que le fichier .pyc (bytecode) au lieu du .py (code source).

L'algorithme de déchiffrement est obfusqué par le fait qu'il soit en bytecode.

Bon c'est très moche. D'autant plus qu'il est possible de retrouver le .py à partir du .pyc. Mais j'ai pas mieux.

répondu 15-Jan-2015 par recher (354 points)
edité 16-Jan-2015 par recher

XOR et la permutation c'est quand même pas la joie en terme de complexité dans ce cas ci. A noter que le bytecode est plus haut niveau que du code réellement compilé, ce qui veut aussi dire qu'en terme d’obfuscation c'est moins bon.
Petite erreur sur la dernière ligne où pyc est remplacé par py ?

Ah oui, bien vu la boulette py/pyc.
C'est corrigé. Merci !

+3 votes

L'offuscation comme moyen de cacher le/une partie du code source n'est pas une méthode viable en Python.
Je me contenterai de linker cet article qui couvre à peu près le problème.

Même cacher la chaine de caractères dans un module C, offusquées ou non, n'est pas une manière sure d’empêcher quelqu'un de la retrouver (un mec motivé pourra toujours se taper la motiver de reverse le bousin).

Pour ton cas, à mon sens, il conviendrait de penser différemment. Comme l'a justement fait remarquer Nsukami_, si le serveur rsync contacte les client par ssh, et donc il pousse sa clef publique. Il n'y a aucun problème de laisser une clef publique libre d'accès aux clients.

répondu 18-Jan-2015 par Arza (726 points)

je me permet de commenter l'url de ton lien : l'admin du site a qq pb a propos du nom de domaine, en attendant on peut y acceder via son blog : http://pdp.microjoe.eu/tutoriels/280/dropbox-a-des-fuites/

+4 votes

Je +1 Arza, la sécurité par l'obscurité est rarement une bonne technique, et c'est particulièrement vrai en Python.

Si le but est de protéger la clé d'un attaque, la chiffre avec le module cryptography et demander à l'utilisateur de rentrer un mot de passe est suffisant.

Si c'est une clé publique uniquement, il n'y a rien besoin de faire, une clé publique est faite pour être, et bien, publique.

Si c'est une clé privée, le problème n'est pas l'obfuscaction, mais le fait que tu as un un système qui a besoin de filer votre clé privée pour que ça marche. Je suggère plutôt que le script génère sa propre clé privée, et que vous mettiez un service Web en place pour que l'utilisateur puisse se logger, et uploader sa clé publique (ou le faire à travers le script) ce qui va créer un user, avec cette clé, les bonnes permissions, etc.

répondu 19-Jan-2015 par Sam (4,974 points)
...