2016-06-08 1 views
2

J'écris une application Ruby qui devra gérer le mot de passe d'entreprise d'un utilisateur. Je voudrais minimiser le temps que le mot de passe est en mémoire pour réduire la probabilité que le mot de passe soit exposé.Effacement sécurisé du mot de passe de la mémoire dans Ruby

Dans une langue maternelle, j'effacerais directement les données. En C#, j'utiliserais le SecureString class. En Java, j'utiliserais char[]. Mais le meilleur que je puisse trouver pour Ruby est un old feature request qui semble mort.

Quelle est la norme pour stocker et effacer en toute sécurité les mots de passe de la mémoire dans Ruby? Y a-t-il une classe qui fait ça? Un modèle de codage similaire à char[] de Java?

+0

Finalement, c'est une cause perdue car vous n'avez aucun contrôle sur les données stockées dans les caches L1, L2, L3 ou les registres eux-mêmes. Ceux qui pensent pouvoir les effacer de la mémoire système se trompent souvent, le système d'exploitation peut être en train de remapper la mémoire à leur insu et de laisser des traces de leurs données. Si vous avez besoin d'une sécurité absolue, utilisez un mécanisme d'authentification qui n'exige pas que votre application ait le mot de passe. Des mécanismes tels que LDAP ou Oauth déchargent complètement cette responsabilité. – tadman

+0

@tadman Assez juste. Je suis toujours intéressé à entendre si il existe des modèles communs que les gens utilisent –

+0

Vous voudrez peut-être regarder [comment les gens manipulent les clés privées cryptographiques] (http://stackoverflow.com/questions/1263350/cryptography-best-practices-for -keys-in-memory) qui est généralement un problème beaucoup plus grave que les mots de passe. Les solutions sont souvent extrêmement compliquées et coûteuses. Fondamentalement, si vous ne pouvez pas faire confiance à votre matériel sécurisé, ne faites pas confiance à votre matériel et évitez d'accepter le mot de passe en premier lieu. Utilisez un mécanisme d'authentification différent. Frotter en mémoire limite le risque, il ne l'élimine pas. – tadman

Répondre

0

Un problème de ruby ​​existe depuis 5 ans (5741), en ce qui concerne l'effacement sécurisé des secrets de la mémoire. Ce numéro contient également des liens expliquant pourquoi il est bon d'effacer les mots de passe de la mémoire. Dernièrement, MacOs a eu un problème avec FileVault2, car le mot de passe a été stocké dans la mémoire.

Une solution possible à l'intérieur montré question 5741 est:

pass = "" 
$stdin.sysread(256, pass) # assuming a line-buffered terminal 
io = StringIO.new("\0" * pass.bytesize) 
io.read(pass.bytesize, pass) 

Il semble fonctionner avec rubis 2.3.1p112, mais je ne peux pas promettre.