====== 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**: * **head /dev/urandom**: Lê uma quantidade de dados aleatórios. * **tr -dc 'A-Za-z0-9!@#$%^&\*()'**: Filtra os caracteres para incluir letras, números e alguns símbolos. * **tr -dc '[:alnum:][:punct:]'**: Filtra caracteres alfanuméricos e de pontuação para mais variedade. * **head -c 20**: Define o comprimento da senha para 20 caracteres (pode ser ajustado). ===== 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**: * **openssl rand -base64 24**: Gera 24 bytes de dados aleatórios codificados em Base64. * **tr -dc '[:alnum:][:punct:]'**: Filtra para incluir apenas caracteres alfanuméricos e de pontuação. * **head -c 20**: Define o comprimento da senha. ===== 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**: * **date +%s%N**: Gera um valor com a hora atual em segundos e nanossegundos. * **openssl rand -base64 10**: Gera dados aleatórios adicionais. * **tr -dc '[:alnum:][:punct:]'**: Filtra para incluir os caracteres desejados. * A senha final combina parte da data e dados aleatórios para garantir unicidade. ===== 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**: * **printf "%s" "${palavras[@]}"**: Imprime todas as palavras sem espaços entre elas. * **fold -w1**: Dobra a string para que cada caractere apareça em uma nova linha. * **shuf**: Embaralha os caracteres. * **head -c 20**: Define o tamanho da senha para 20 caracteres. ===== 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: * **Segurança**: Para sistemas críticos, prefira fontes de entropia mais fortes como `/dev/random`. * **Tamanho da Senha**: Ajuste o comprimento da senha conforme necessário, idealmente com 20 caracteres ou mais. * **Personalização**: Modifique a lista de caracteres especiais ou a seleção de palavras para atender aos seus requisitos de segurança. * **Função Bash**: A função avançada oferece flexibilidade máxima com opções para diferentes casos de uso.