Table of Contents

Criação de Senhas no Linux

Métodos eficientes para criar senhas seguras no terminal Linux utilizando Bash. As técnicas abaixo combinam diferentes ferramentas para gerar senhas contendo letras, números e caracteres especiais.

1. Usando /dev/urandom com tr

Este método é simples e amplamente utilizado por sua segurança e facilidade.

head /dev/urandom | tr -dc 'A-Za-z0-9!@#$%^&*()' | head -c 20 ; echo

Ou, para incluir uma gama maior de caracteres especiais:

head /dev/urandom | tr -dc '[:alnum:][:punct:]' | head -c 20 ; echo

Explicação:

2. Usando openssl

O openssl também pode ser usado para gerar senhas seguras com dados criptograficamente fortes.

openssl rand -base64 24 | tr -dc '[:alnum:][:punct:]' | head -c 20 ; echo

Explicação:

3. Combinando Data e Aleatoriedade

Você pode gerar senhas únicas usando a data e hora atuais em conjunto com dados aleatórios.

parte1=$(date +%s%N)  # Segundos e nanossegundos desde 1970
parte2=$(openssl rand -base64 10 | tr -dc '[:alnum:][:punct:]')
senha="${parte1:0:10}$parte2"
echo $senha

Explicação:

4. Misturando Palavras com shuf

Este método cria senhas embaralhando palavras ou caracteres.

palavras=('Casa' 'Carro' 'Livro' 'Árvore' 'Sol')
senha=$(printf "%s" "${palavras[@]}" | fold -w1 | shuf | tr -d '\n' | head -c 20 ; echo)
echo $senha

Explicação:

5. Usando pwgen (pacote externo)

# Instalação: sudo apt-get install pwgen (Debian/Ubuntu)
pwgen -s 20 1  # Gera uma senha segura de 20 caracteres

6. Método com /dev/random

head -c 32 /dev/random | base64 | tr -dc '[:alnum:][:punct:]' | head -c 20

7. Método Python (se disponível)

python3 -c "import secrets, string; print(''.join(secrets.choice(string.ascii_letters + string.digits + '!@#$%^&*') for i in range(20)))"

Função Bash Avançada para Gerar Senhas

Função completa para o arquivo `~/.bash_functions` ou `~/.bashrc`:

# Função gerar_senha 
# ~/.bash_functions
# Versão: 2.0
 
gerar_senha() {
    # Definir cores para output
    local RED='\033[0;31m'
    local GREEN='\033[0;32m'
    local YELLOW='\033[1;33m'
    local BLUE='\033[0;34m'
    local CYAN='\033[0;36m'
    local NC='\033[0m' # No Color
 
    # Funções de log usando variáveis de cores
    _info() { echo -e "${BLUE}[INFO]${NC} $*"; }
    _warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
    _error() { echo -e "${RED}[ERRO]${NC} $*" >&2; }
    _success() { echo -e "${GREEN}[SUCESSO]${NC} $*"; }
 
    # Valores padrão
    local comprimento=20
    local usar_simbolos=true
    local quantidade=1
    local apenas_hex=false
    local metodo="random"
    local mostrar_senha=false
    local copiar_clipboard=false
    local arquivo_saida=""
 
    # Limites de segurança
    local COMPRIMENTO_MAX=256
    local QUANTIDADE_MAX=100
 
    # Função auxiliar para gerar conjunto de caracteres
    # Evita duplicação de código (melhoria de qualidade)
    _gerar_caracteres() {
        if [ "$apenas_hex" = true ]; then
            echo '0-9A-F'
        elif [ "$usar_simbolos" = true ]; then
            echo 'A-Za-z0-9!@#$%^&*()_+-=[]{}|;:,.<>?'
        else
            echo 'A-Za-z0-9'
        fi
    }
 
    # Função para limpeza de variáveis sensíveis
    # Melhoria crítica de segurança
    _limpar_variaveis_sensíveis() {
        unset senha senha_gerada caracteres
    }
 
    # Trap para garantir limpeza mesmo em caso de erro
    trap '_limpar_variaveis_sensíveis' RETURN
 
    # Mostrar ajuda
    mostrar_ajuda() {
        cat << EOF
Uso: gerar_senha [OPÇÕES]
 
Opções:
  -c, --comprimento N    Define o comprimento da senha (padrão: 20, máx: 256)
  -q, --quantidade N     Gera N senhas (padrão: 1, máx: 100)
  -s, --sem-simbolos     Gera senha apenas com letras e números
  -x, --hexadecimal      Gera senha hexadecimal (0-9, A-F)
  -m, --metodo METODO    Método de geração: random, mkpasswd, openssl, openssl-rand (padrão: random)
  -S, --mostrar-senha    Mostra a senha em claro quando usando mkpasswd ou openssl
  -C, --clipboard        Copia a última senha gerada para clipboard (requer xclip)
  -f, --arquivo ARQUIVO  Salva as senhas em arquivo (com permissões 600)
  -h, --help             Mostra esta ajuda
 
Exemplos:
  gerar_senha                            # Gera uma senha de 20 caracteres com símbolos
  gerar_senha -c 16 -q 3                 # Gera 3 senhas de 16 caracteres
  gerar_senha --sem-simbolos             # Gera senha apenas com letras e números
  gerar_senha --hexadecimal              # Gera senha hexadecimal
  gerar_senha --metodo mkpasswd          # Gera o hash de uma senha aleatória usando mkpasswd
  gerar_senha --metodo openssl -S        # Gera o hash e mostra a senha em claro
  gerar_senha -c 32 -C                   # Gera senha de 32 caracteres e copia para clipboard
  gerar_senha -q 5 -f senhas.txt         # Gera 5 senhas e salva em arquivo
 
Métodos disponíveis:
  random       - Geração aleatória pura (mais rápido, ideal para uso geral)
  mkpasswd     - Hash SHA-512 (ideal para /etc/shadow)
  openssl      - Hash SHA-512 via openssl (alternativa a mkpasswd)
  openssl-rand - Geração via openssl rand -base64 (compatível com base64)
EOF
    }
 
    # Processar argumentos
    while [[ $# -gt 0 ]]; do
        case $1 in
            -c|--comprimento)
                # Validação de argumento faltante (melhoria de robustez)
                if [ -z "$2" ]; then
                    _error "Opção $1 requer um valor"
                    return 1
                fi
                if [[ $2 =~ ^[0-9]+$ ]] && [ "$2" -gt 0 ]; then
                    comprimento="$2"
                    shift 2
                else
                    _error "Comprimento deve ser um número positivo"
                    return 1
                fi
                ;;
            -q|--quantidade)
                # Validação de argumento faltante (melhoria de robustez)
                if [ -z "$2" ]; then
                    _error "Opção $1 requer um valor"
                    return 1
                fi
                if [[ $2 =~ ^[0-9]+$ ]] && [ "$2" -gt 0 ]; then
                    quantidade="$2"
                    shift 2
                else
                    _error "Quantidade deve ser um número positivo"
                    return 1
                fi
                ;;
            -s|--sem-simbolos)
                usar_simbolos=false
                shift
                ;;
            -x|--hexadecimal)
                apenas_hex=true
                shift
                ;;
            -m|--metodo)
                # Validação de argumento faltante (melhoria de robustez)
                if [ -z "$2" ]; then
                    _error "Opção $1 requer um valor"
                    return 1
                fi
                case "$2" in
                    random|mkpasswd|openssl|openssl-rand)
                        metodo="$2"
                        shift 2
                        ;;
                    *)
                        _error "Método deve ser: random, mkpasswd, openssl ou openssl-rand"
                        return 1
                        ;;
                esac
                ;;
            -S|--mostrar-senha)
                mostrar_senha=true
                shift
                ;;
            -C|--clipboard)
                copiar_clipboard=true
                shift
                ;;
            -f|--arquivo)
                # Validação de argumento faltante (melhoria de robustez)
                if [ -z "$2" ]; then
                    _error "Opção $1 requer um valor"
                    return 1
                fi
                arquivo_saida="$2"
                shift 2
                ;;
            -h|--help)
                mostrar_ajuda
                return 0
                ;;
            *)
                _error "Opção desconhecida: $1"
                mostrar_ajuda
                return 1
                ;;
        esac
    done
 
    # Validação de limites de segurança (melhoria crítica)
    if [ "$comprimento" -gt "$COMPRIMENTO_MAX" ]; then
        _error "Comprimento máximo permitido: $COMPRIMENTO_MAX caracteres"
        return 1
    fi
 
    if [ "$quantidade" -gt "$QUANTIDADE_MAX" ]; then
        _error "Quantidade máxima permitida: $QUANTIDADE_MAX senhas"
        return 1
    fi
 
    # Verificar dependências para os métodos
    if [ "$metodo" = "mkpasswd" ] && ! command -v mkpasswd >/dev/null 2>&1; then
        _error "O comando 'mkpasswd' não está instalado. Instale com: sudo apt install whois"
        return 1
    fi
 
    if [[ "$metodo" = "openssl" || "$metodo" = "openssl-rand" ]] && ! command -v openssl >/dev/null 2>&1; then
        _error "O comando 'openssl' não está instalado."
        return 1
    fi
 
    # Verificar dependência para clipboard
    if [ "$copiar_clipboard" = true ] && ! command -v xclip >/dev/null 2>&1; then
        _warn "O comando 'xclip' não está instalado. Clipboard será desativado."
        copiar_clipboard=false
    fi
 
    # Validar arquivo de saída
    if [ -n "$arquivo_saida" ]; then
        if ! touch "$arquivo_saida" 2>/dev/null; then
            _error "Não foi possível criar/acessar o arquivo: $arquivo_saida"
            return 1
        fi
        chmod 600 "$arquivo_saida"
    fi
 
    # Mensagem informativa sobre o método
    case "$metodo" in
        random) _info "Gerando senha com método aleatório..." ;;
        mkpasswd) _info "Gerando hash com mkpasswd (SHA-512)..." ;;
        openssl) _info "Gerando hash com openssl (SHA-512)..." ;;
        openssl-rand) _info "Gerando senha com openssl rand..." ;;
    esac
 
    # Gerar senhas
    local ultima_senha=""
    for ((i=1; i<=quantidade; i++)); do
        if [ "$quantidade" -gt 1 ]; then
            echo -e "${CYAN}--- Senha $i ---${NC}"
        fi
 
        # Gerar a senha baseada no método selecionado
        local senha
        local senha_gerada
        case "$metodo" in
            random)
                # Otimização de performance: limitar leitura de /dev/urandom (melhoria de performance)
                local caracteres
                caracteres=$(_gerar_caracteres)
 
                if ! senha=$(head -c 1024 /dev/urandom | tr -dc "$caracteres" | head -c "$comprimento"); then
                    _error "Falha ao gerar senha"
                    return 1
                fi
                ;;
            openssl-rand)
                # Gera exatamente o comprimento solicitado
                local bytes_necessarios=$((comprimento * 3 / 4 + 1))
                if ! senha=$(openssl rand -base64 "$bytes_necessarios" 2>/dev/null | tr -d '\n/+=' | head -c "$comprimento"); then
                    _error "Falha ao gerar senha com openssl rand"
                    return 1
                fi
                ;;
            mkpasswd|openssl)
                # Para métodos de hash, primeiro gerar uma senha aleatória
                local caracteres
                caracteres=$(_gerar_caracteres)
 
                if ! senha_gerada=$(head -c 1024 /dev/urandom | tr -dc "$caracteres" | head -c "$comprimento"); then
                    _error "Falha ao gerar senha"
                    return 1
                fi
 
                if [ -z "$senha_gerada" ]; then
                    _error "Falha ao gerar senha"
                    return 1
                fi
 
                case "$metodo" in
                    mkpasswd)
                        if ! senha=$(mkpasswd -m SHA-512 "$senha_gerada" 2>/dev/null); then
                            _error "Falha ao gerar hash com mkpasswd"
                            return 1
                        fi
                        ;;
                    openssl)
                        if ! senha=$(openssl passwd -6 "$senha_gerada" 2>/dev/null); then
                            _error "Falha ao gerar hash com openssl"
                            return 1
                        fi
                        ;;
                esac
 
                # Mostrar senha em claro se solicitado
                if [ "$mostrar_senha" = true ]; then
                    echo -e "${GREEN}Senha: ${senha_gerada}${NC}"
                fi
                ;;
        esac
 
        if [ -z "$senha" ]; then
            _error "Falha ao gerar senha"
            return 1
        fi
 
        # Exibir resultado
        echo -e "${GREEN}${senha}${NC}"
 
        # Salvar em arquivo se solicitado
        if [ -n "$arquivo_saida" ]; then
            echo "$senha" >> "$arquivo_saida"
        fi
 
        # Guardar última senha para clipboard
        ultima_senha="$senha"
 
        # Espaço entre múltiplas senhas
        if [ "$quantidade" -gt 1 ] && [ "$i" -lt "$quantidade" ]; then
            echo
        fi
    done
 
    # Copiar para clipboard se solicitado (melhoria de funcionalidade)
    if [ "$copiar_clipboard" = true ] && [ -n "$ultima_senha" ]; then
        if echo -n "$ultima_senha" | xclip -selection clipboard 2>/dev/null; then
            _success "Última senha copiada para clipboard"
        else
            _warn "Falha ao copiar para clipboard"
        fi
    fi
 
    # Informações finais
    if [ -n "$arquivo_saida" ]; then
        _success "Senhas salvas em: $arquivo_saida (permissões: 600)"
    fi
 
    # Dicas de segurança
    if [ "$comprimento" -lt 12 ]; then
        _warn "Recomendação: Use senhas com pelo menos 12 caracteres para melhor segurança"
    fi
 
    # Informação adicional para métodos de hash
    if [[ "$metodo" == "mkpasswd" || "$metodo" == "openssl" ]]; then
        _info "Use este hash em arquivos de configuração como /etc/shadow"
    fi
 
    # Limpeza de variáveis sensíveis (melhoria crítica de segurança)
    # Nota: O trap já cuidará disso, mas fazemos explicitamente também
    _limpar_variaveis_sensíveis
}
 
# Exportar função se for sourced
export -f gerar_senha

Como usar a função:

1. Adicionar ao seu ambiente:

``` # Adicione a função ao ~/.bashrc ou ~/.bash_functions echo “source ~/.bash_functions” » ~/.bashrc ```

2. Exemplos de uso:

``` gerar_senha # Senha padrão (20 chars com símbolos) gerar_senha -c 16 -q 3 # 3 senhas de 16 caracteres gerar_senha –sem-simbolos -c 32 # Senha de 32 chars sem símbolos gerar_senha –metodo mkpasswd # Hash SHA-512 para /etc/shadow ```

Considerações Finais

Esses métodos cobrem uma ampla gama de abordagens para gerar senhas seguras diretamente no terminal Linux, usando ferramentas padrão como Bash. Escolha o método que melhor se adapta à sua necessidade de segurança e ajuste conforme necessário: