逐行读取文件,然后对其进行散列,在php中会给出错误的输出

逐行读取文件,然后对其进行散列,在php中会给出错误的输出,php,hash,md5,Php,Hash,Md5,当我尝试在我的网站上散列所有用户密码时,首先我将所有密码保存在文件中,然后我尝试对它们进行散列,但我意识到它给了我错误的散列,而不是真正的散列 我尝试了2个函数,但结果相同,这些PHP代码解释了一切 文件password.txt只有一行“password”为纯文本 md5()函数: echo md5("password"); #5f4dcc3b5aa765d61d8327deb882cf99 if ($file = fopen("password.txt", "r")) { while

当我尝试在我的网站上散列所有用户密码时,首先我将所有密码保存在文件中,然后我尝试对它们进行散列,但我意识到它给了我错误的散列,而不是真正的散列

我尝试了2个函数,但结果相同,这些PHP代码解释了一切

文件password.txt只有一行“password”为纯文本

md5()函数:

echo md5("password"); #5f4dcc3b5aa765d61d8327deb882cf99
if ($file = fopen("password.txt", "r")) {
    while(!feof($file)) {
        $lines = fgets($file);
        echo md5($lines); #286755fad04869ca523320acce0dc6a4
    }
    fclose($file);
}
file()函数,然后md5命令行:

$openfile = file("password.txt");
foreach($openfile as $lines){
    echo md5($lines); #286755fad04869ca523320acce0dc6a4
}
fopen()函数:

echo md5("password"); #5f4dcc3b5aa765d61d8327deb882cf99
if ($file = fopen("password.txt", "r")) {
    while(!feof($file)) {
        $lines = fgets($file);
        echo md5($lines); #286755fad04869ca523320acce0dc6a4
    }
    fclose($file);
}
我想这行只是有一些空格之类的

已编辑

我读了更多关于散列和加密之间区别的文章。关于散列密码,我现在用这个

md5(sha1($passwords.$variable_salt))

已编辑


这些天来,我开始使用BCrypt哈希算法,而不使用MD5或SHA1,现在更好了。

这两种算法的返回值都包括行尾

您可以通过
rtrim($line,“\n”)运行这些值首先,或对
文件使用以下选项:

$openfile = file("little.txt", FILE_IGNORE_NEW_LINES);
这将为您删除行尾

编辑:
从评论中提出的问题可以看出,这是一种相当奇怪的解决问题的方法。想一想为什么需要将所有这些密码存储在一个文件中(散列或其他形式)。

是否要对整个文件或每行进行加密?MD5不是加密,您不应该将其用于密码散列。“以后再加盐”并不能解决任何问题,编写坏代码来解决问题就是坏代码在生产中的结局。改用。你也不应该有一个满是纯文本文件的文件。就个人而言,我认为你在浪费时间。这是出于教育目的还是打算投入使用?整个“我知道它不安全,但我以后会添加安全性”的理念是不好的,因为以后总是被现在需要做的更紧急的事情所取代。空白是密码的有效字符,对吗?
trim
是否会删除它?通常是的,但是如果它们要存储在单个文件中,那么总是会出现分隔符与密码部分重叠的问题,不管它是什么。
rtrim($line,“\n”)
假设换行符不是有效的密码字符:-)@abracadver Fair point,这至少可以减少问题的发生位修剪将删除有效密码周围的空白。我不认为像“某物”这样的密码是任何人都应该允许的密码。通常情况下,人们不允许密码带有任何空格。空格与其他所有可能被人尝试使用的空白和不可打印字符之间也存在差异。