파일 파이프에서 다른 명령으로 한 줄씩 읽고 다른 파일로 출력하는 스크립트

파일 파이프에서 다른 명령으로 한 줄씩 읽고 다른 파일로 출력하는 스크립트

비밀번호를 일반 텍스트로 저장하는 이상한 오래된 앱을 지원하려고 하는데 이를 해시하고 싶습니다. 각 줄에 사용자 이름과 비밀번호가 포함된 csv의 입력 파일을 갖고 싶지만 처음에는 해당 부분을 알아낼 때까지 비밀번호를 시도하고 있습니다. 일반 텍스트 비밀번호 목록을 다른 파일로 해시하고 목록을 순서대로 유지하려고 합니다. 나는 여기를 기웃거리며 while read 문을 통해 수행해야 한다고 생각했지만 제대로 작동하지 않습니다.

이것이 내가 지금까지 얻은 것입니다:

#!/bin/bash

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

입력 파일 pwd.txt에서 각 줄은 서로 다른 비밀번호입니다. 스크립트에서 실행할 때 첫 번째 비밀번호의 해시를 반복해서 반복하는 것뿐이지만 입력 파일의 행에 대해 올바른 횟수만큼 반복합니다. 제가 뭘 잘못하고 있는지, 아니면 더 좋은 방법이 있는지 알려주시면 정말 감사하겠습니다.

답변1

첫째, 직접적인 구문 오류입니다. "$ line"6자 문자열 $, space l,,,,,,입니다. 변수의 값을 얻으려면 를 사용하십시오. 값이 또는 이면 옵션으로 구문 분석되어 아무것도 인쇄되지 않습니다. 이를 방지하려면 대신 사용하세요. 또한 행을 문자 그대로 읽으려면 선행 및 후행 공백을 제거하고 백슬래시를 이스케이프 문자로 처리합니다.ineline"$line"-e-Eechoprintf %sreadIFS= read -r

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

비밀번호를 해시하는 데 SHA-256을 사용하지 마세요. 일반 텍스트보다 낫지만 여전히 끔찍합니다. SHA-256은 비밀번호 해시가 솔트 처리되어야 하고 속도가 느리기 때문에 허용되는 비밀번호 해싱 방법이 아닙니다. 바라보다비밀번호를 안전하게 해시하는 방법은 무엇입니까?자세한 설명을 위해. 일반적으로 사용되는 것을 사용할 수 있습니다.mkpasswd적절한 비밀번호 해시를 생성하는 유틸리티입니다. SHA-256 또는 SHA-512를 사용합니다(이름에도 불구하고 둘 중 하나는 실제로 SHA2 해시를 계산하지 않고 오히려 반복 해시를 계산하므로 허용 가능한 속도가 느림). 생성된 해시에는 임의의 솔트가 포함되어 있습니다.

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

애플리케이션에서 시스템의crypt이 해시를 확인하는 기능을 수행합니다. 사용 중인 프로그래밍 언어가 표준 라이브러리 crypt기능에 액세스하는 것을 허용하지 않는 경우 PBKDF2, bcrypt 또는 scrypt 라이브러리를 사용하고 해당 라이브러리를 사용하여 변환된 해시를 생성하십시오(다시 말하지만 순수 SHA-256 또는 SHA-512를 사용하지 마십시오). .

답변2

편집하다sha256sum 대신에훨씬 낫다더 강력한 것을 사용하십시오. (해트 팁: 사용자 Gilles). glibc crypt루틴은 최소 5000 라운드 동안 sha256을 통해 솔트 처리된 문자열을 반복합니다. 이는 비밀번호 크래커가 일치하는 문자열을 찾는 데 더 많은 리소스/시간이 필요하다는 아이디어입니다. 다음을 대체하여 거의 모든 시스템에서 이 기술을 사용할 수 있습니다 sha256sum.

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

그러면 8자 솔트가 생성되고 입력의 첫 번째 줄과 생성된 솔트가 에 전달됩니다 crypt.

입력 내용이 다음과 같고 username,password따옴표나 기타 다른 내용이 없는 경우 다양한 기술을 사용하여 이를 수행할 수 있습니다. 하나는:

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

username,hash이 버전에서는 이제 각 줄이 첫 번째 파일의 입력에 해당하도록 출력됩니다 .

관련 정보