用于从文件管道中逐行读取到另一个命令并输出到另一个文件的脚本

用于从文件管道中逐行读取到另一个命令并输出到另一个文件的脚本

我有一个奇怪的旧应用程序,我正在尝试支持它,它以纯文本形式存储密码,我想对它们进行哈希处理。我真的很想在 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 个字符的字符串 $、空格l、、、、、、。要获取变量的值,请使用.请注意,如果值为or ,会将其解析为选项并且不打印任何内容。为了避免这种情况,请改用。此外,plain会去除行首和行尾的空格,并将反斜杠视为转义字符;要按字面意思阅读该行,请使用.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)。 glibccrypt例程通过 sha256 迭代加盐字符串至少 5000 轮。这个想法是,这使得密码破解者需要更多的资源/时间来找到匹配的字符串。您可以通过替换以下内容在几乎任何系统上使用此技术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,每一行对应于第一个文件的输入。

相关内容