Accueil Nos publications Blog Java, sécurité et les char[]

Java, sécurité et les char[]

Cipher

En relisant une énième fois la certification SCJP pour Java 6 je suis resté quelques minutes sur une nouveauté : la classe java.io.Console (qui fait justement son appartition avec Java 6). Un point de sécurité est soulevé dans le livre au sujet de la méthode readPassword qu’il me semble intéressant de sortir de son contexte pour l’étendre.

En effet une particularité des JVM due à leur optimisation consiste lors du déréférencement d’un objet String à garder quelque part en mémoire l’objet, et à ne pas le supprimer même si dans le fond il est éligible au Garbage Collector. La raison étant que ces chaînes de caractères (qui sont souvent plutôt des morceaux de chaînes de caractères) peuvent être réutilisés sans passer par une phase d’allocation/désallocation qui peut à terme s’avérer coûteuse.

Partant de là le livre de la certification explique que pour éviter d’avoir un mot de passe conservé en mémoire à l’insu de l’application, la méthode readPassword renvoie un Array de char (char[]) qui lui sera bien désalloué aussitôt la référence du mot de passe mise à null. Bien que le mot de passe en tant que bits de données reste sûrement encore un peu en mémoire en l’état, au moins aucune référence n’y est faite dans la JVM et on peut espérer qu’il soit écrasé assez rapidement.

Mais pour aller au delà de la méthode readPassword, même si la saisie utilisateur est bien récupérée sous forme de char[], si de l’autre côté le SHA-1 (la signature du mot de passe), par exemple, est récupéré depuis la base de données, toujours pour l’exemple, sous forme de String, alors un programme malveillant est susceptible de chercher en mémoire ce qui y ressemble.
Ce qui est faisable, puisqu’un SHA-1 ressemble à ça :
AFBA34A2A11AB13EEBA5D0A7AA22BBB6120E177B
une séquence alphanumérique de taille constante égale à 40 caractères

L’algorithme a alors beau être un des plus sûr au monde (et c’est le cas de SHA-1), il est possible de confronter la signature à une bibliothèque de signatures connues, comme par exemple celle des mots du dictionnaire. Un mot de passe peu sûr (faisant partie du dictionnaire) sera alors cassé.

Bilan

Il me semble donc important de penser assez systématiquement à un objet char[] pour les données critiques en terme de sécurité.

(une séquence alphanumérique de taille constante égale à 40 caractères). L'algorithme a alors beau être un des plus sûres au monde (et c'est le cas de SHA-1), il est possible de confronter la signature à une bibliothèque de signatures connues, comme par exemple celle des mots du dictionnaire. Un mot de passe peu sûr (faisant partie du dictionnaire) sera alors cassé.