Пароли не хранить в открытом виде; только хеш с солью. В Go: golang.org/x/crypto/bcrypt (GenerateFromPassword, CompareHashAndPassword). Cost задает сложность (10-12 типично). scrypt - альтернатива (более устойчив к ASIC). Не использовать обычный SHA без соли; не использовать MD5. При аутентификации сравнивать хеш с введенным паролем через Compare.
hash, _ := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
err := bcrypt.CompareHashAndPassword(storedHash, []byte(password))