Script para ler linha por linha de um canal de arquivo que para outro comando e saída para outro arquivo

1

Eu tenho esse aplicativo antigo e estranho que estou tentando suportar e ele armazena as senhas em texto sem formatação e gostaria de alterá-las. Eu realmente gostaria de ter um arquivo de entrada no csv com um nome de usuário, senha para cada linha, mas estou tentando apenas a senha no início até que eu consiga aquela parte. Eu estou tentando hash uma lista de senhas que estão em texto sem formatação para outro arquivo e manter a lista em ordem. Eu estava bisbilhotando por aqui e acho que precisa ser feito com uma declaração de leitura, mas não está funcionando corretamente.

aqui está o que eu tenho até agora:

#!/bin/bash

while read line
do 
    /bin/echo -n "$ line" | sha256sum >> /tmp/hashes.txt
done < pwd.txt

No arquivo de entrada pwd.txt, cada linha é uma senha diferente. Quando executo isso em um script, tudo o que ele está fazendo é repetir o hash da primeira senha várias vezes, mas está fazendo a quantidade correta de vezes para as linhas no arquivo de entrada. Eu realmente apreciaria alguma orientação sobre o que estou fazendo de errado ou se há uma maneira melhor.

    
por user2366949 15.05.2015 / 19:18

2 respostas

4

Primeiro, seu erro de sintaxe imediata: "$ line" é a string de dólar de 6 caracteres, espaço, l , i , n , e . Para obter o valor da variável line , use "$line" . Observe que, se o valor for -e ou -E , echo irá analisá-lo como uma opção e não imprimirá nada. Para evitar isso, use printf %s . Além disso, o% comum read retira os espaços em branco no início e no final da linha e trata as barras invertidas como caracteres de escape; para ler a linha literalmente, use IFS= read -r .

while IFS= read -r line; do
  printf %s "$line" | …
fi

Não use o SHA-256 para senhas hash. Embora seja melhor que texto simples, ainda é ruim. SHA-256 não é uma maneira aceitável de hash senhas porque hashes de senha devem ser salgados e lentos. Consulte Como colocar senhas hash com segurança? para obter uma explicação detalhada. Você pode usar o utilitário comumente disponível mkpasswd para gerar hashes de senha decentes; use o SHA-256 ou SHA-512 (apesar de seu nome, eles estão ok porque eles não calculam um hash SHA2, eles calculam um hash iterado, que é aceitavelmente lento). O hash gerado inclui um sal aleatório.

printf %s "$line" | mkpasswd -s -m SHA-512

Em seu aplicativo, chame a função crypt do sistema para verificar esses hashes. Se a linguagem de programação que você está usando não lhe der acesso à biblioteca padrão crypt function, use uma biblioteca PBKDF2, bcrypt ou scrypt, e use essa biblioteca para gerar os hashes convertidos também (novamente, não use plain SHA-256 ou SHA-512).

    
por 16.05.2015 / 02:49
-1

EDIT Em vez de sha256sum, é muito melhor usar algo mais robusto. (Dica do chapéu: usuário Gilles). A rotina glibc crypt repete a string salgada através de sha256 para um mínimo de 5000 rodadas. A idéia é que isso faz com que os crackers de senha precisem de muito mais recursos / tempo para encontrar uma string correspondente. Você pode usar essa técnica em praticamente qualquer sistema, substituindo o sha256sum :

sha256sum() { 
    read password
    salt='openssl rand -base64 8'
    perl -le "print crypt('${password}','\\$${salt}\$')";
}

Isso gera um sal de 8 caracteres e passa a primeira linha de entrada e o sal gerado por crypt .

Se sua entrada for algo como username,password e nenhuma marca de citação ou qualquer coisa, você pode usar ... uma técnica de gazillon para fazer isso. Uma é:

while IFS=, read username pass ; do 
    /bin/echo -n "$username,"
    echo "$pass" | sha256sum |cut -d' ' -f1
done < input.txt >output.txt

Nesta versão, sua saída agora é username,hash e cada linha corresponde à entrada do primeiro arquivo.

    
por 16.05.2015 / 00:11