Lire un mot de passe dans le terminal peut sembler trivial, mais il y a deux pièges : le mot de passe s’affiche à l’écran si vous utilisez une lecture standard, et il faut s’assurer qu’il s’agit bien d’un terminal et non d’une redirection. Résolvons les deux avec le paquet golang.org/x/term.
Si vous lisez avec bufio.Scanner ou fmt.Scanln, chaque touche s’affiche à l’écran. Pour les mots de passe, cela ne convient pas. Le term.ReadPassword lit directement depuis le terminal, sans écho :
fd := int(os.Stdin.Fd()) // #nosec G115 -- stdin's fd is small; the conversion is safe
fmt.Print("password: ")
pass, err := term.ReadPassword(fd)
fmt.Println() // the user's Enter doesn't emit a newline; we do it
code source complet en
Si l’entrée provient d’un pipe, il n’y a pas de terminal pour désactiver l’écho. Il faut refuser d’abord :
if !term.IsTerminal(fd) {
return "", errors.New("an interactive terminal is required for the password")
}
Lorsque le mot de passe est nouveau, demandez-le deux fois et comparez-les. Ainsi, une faute de frappe ne crée pas un secret que vous ne pourrez jamais ouvrir :
Nous utilisons également #nosec G115 pour ignorer l’alerte de sécurité concernant l’utilisation de os.Stdin.Fd(), qui est sûr dans ce contexte.
Pour comparer les mots de passe, vous pouvez les caster en chaînes mais le mieux est d’utiliser bytes.Equal, qui est plus efficace.




