Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在用户注册和登录系统中实现MD5哈希?_Php_Mysql_Passwords_Md5 - Fatal编程技术网

Php 如何在用户注册和登录系统中实现MD5哈希?

Php 如何在用户注册和登录系统中实现MD5哈希?,php,mysql,passwords,md5,Php,Mysql,Passwords,Md5,我正在使用PHP和Mysql。我想知道如何使用MD5发送哈希密码,并想在用户尝试登录时检查密码。我试过了,但效果不好。如果有人知道怎么做,请提供代码给我 //Register: $the_magical_salt = "everybody_is_obsessed_with_these_days$3^^2)(%=-"; // Even_though_md5_shouldnt_be_used mysql_query('insert into users values (NULL,'.$filtere

我正在使用PHP和Mysql。我想知道如何使用MD5发送哈希密码,并想在用户尝试登录时检查密码。我试过了,但效果不好。如果有人知道怎么做,请提供代码给我

//Register:
$the_magical_salt = "everybody_is_obsessed_with_these_days$3^^2)(%=-"; // Even_though_md5_shouldnt_be_used
mysql_query('insert into users values (NULL,'.$filtered_username.','.md5($password.$the_magical_salt).');');
//Login:
$res = mysql_query('select password from users where username = '.$filtered_username);
$res = mysql_fetch_array($res);
if(md5($_POST['password'].$the_magical_salt) == $res[0]) echo "Yeah, you're welcome.";
else echo "Wrong password sugar";

除了两次使用md5()函数之外,它没有什么用处。

md5
不太适合这个用途。阅读以了解如何和为什么,但简短的版本是您应该使用
bcrypt
。一个快速的谷歌显示,声称支持
bcrypt


更新:正如@Dragontamer5788在评论中指出的,从理论角度来看,它甚至比bcrypt更好。作者擅长加密,但要注意,在这一点上,它比
bcrypt
有更少的评论和更少的真实曝光。我可能仍然会选择它,但它不像
bcrypt
而不是
md5
那样简单,如果没有更多信息,将很难帮助您,但我相信您需要的是

以下是PHP文档中的一个示例(特别是示例#7):


请注意,这种类型的身份验证不能防止中间人攻击。例如,如果有人在受害者的网络上嗅探流量,攻击者可以简单地使用摘要用户名/密码组合重放请求,您的PHP脚本会很高兴地将攻击者验证为受害者。

首先,值得注意的是,MD5不是加密,而是哈希或摘要算法。当你说“发送用md5加密的密码”时,你是指用户请求服务器,还是从PHP文件发送到MySQL?Robus说得对,但如果你想保存Hazel,你可以使用这个PHP身份验证类,可能是我对单词选择很挑剔,但你在哪里“发送”哈希密码?此外,如果你不使用盐,你应该。另外,你可能想考虑一个更安全的哈希函数。参见,或者,毫无疑问,在许多其他人中。@ SLATIBARTFAST:我想我会把MujaHID删去一个关于“发送”的问题作为“使用英语”的问题,这可能不是他的母语。同意salt,但是。你应该使用并存储salt-一个随机数-以防止对密码的脱机哈希攻击。而且,MD5几乎不足以作为散列机制;布鲁斯·施奈尔(Bruce Schneier)这样的人不会推荐它(现在已经有好几年没有被推荐了)。@Robus-如果你想使用salt,它应该在每个用户上都是加密唯一的,并且用密码存储在数据库中,而不是在PHP代码中硬编码。@John Rasch这不是salt。。无意义的(我承认我不熟悉这个主题,因为框架为我做了这件事)。我的意思是,暴力强制使用“密码”和“密码+盐”(已知盐)不会花费同样的时间吗?@Robus-盐的目的是防止暴力强制使用用户数据库,而不是一个特定用户的密码。如果每个用户的salt都是相同的,那么对数据库执行rainbow攻击就容易得多(即可能的)。如果必须为每个用户生成一个彩虹攻击,彩虹攻击的威胁会显著降低(即基本上没有机会),这首先破坏了生成彩虹攻击的目的。为什么要硬编码?盐需要随机化,以防止彩虹表。现在你的对手可以创建一个彩虹表,上面写着“现在每个人都被3^^2美元所困扰”(=-)在开始时,将密码数据库粉碎。您需要一个加密随机盐来防止彩虹表。我想将密码从php textfield保存到mysql表。这是一个正常的用户注册和登录系统。我使用加密在db中保存它,但当我使用select查询来检查登录密码和密码是否同时存在时用户已经提供的rd是相同的,即使它们是相同的,它也没有给我任何东西。我现在很困惑,好的,谢谢大家,我可以这样做,我将它保存为MD5(),当我检查密码时,我使用相同的MD5(),所以它工作得很好:)PHP5.3+在其“crypt”功能中支持BCrypt,而PHP5.2和更早的版本可以通过PHPSuhosin补丁获得(将BCrypt实现到PHP中)。从技术上讲,“scrypt”比BCrypt好,因为它既有内存约束,也有CPU约束……但BCrypt是目前应用最广泛的密码函数。最好在存在良好的scrypt实现之前使用它。这个答案需要更多的更新