2010-07-22 131 views
-1

我正在使用PHP和Mysql。我想知道如何使用MD5发送密码散列,并希望在用户尝试登录时检查它。我尝试过,但无法正常工作。如果有人知道如何去做,请给我提供代码。如何在用户注册和登录系统中实现MD5散列?

+0

首先,值得注意的是MD5不加密,它是一种散列或摘要算法。当你说“发送密码在md5中加密”你的意思是在用户的请求到服务器,或从你的PHP文件到MySQL? – 2010-07-22 02:38:42

+1

Robus说得对,但如果你想保存Hazel,你可以使用这个PHP身份验证类http://www.phpclasses.org/package/6174-PHP-Manage-registrations-and-authenticate-users.html – Pablo 2010-07-22 02:39:36

+0

它可能是我对挑选单词很挑剔,但你在哪里发送哈希密码?另外,如果你不使用盐,你应该。此外,您可能还想考虑更安全的哈希函数。 – Slartibartfast 2010-07-22 02:51:14

回答

0
//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()函数两次以外,没有太多内容。

+2

您应该使用并存储盐 - 一个随机数 - 以防止对密码进行离线哈希攻击。另外,MD5作为哈希机制还不够。它不会被像布鲁斯·施奈尔这样的人推荐(并且现在还没有被推荐多年)。 – 2010-07-22 02:40:17

+0

+1,因为我使用了类似的错误密码。哦,愤怒的电子邮件 – 2010-07-22 02:44:24

+2

@Robus - 如果你打算使用盐,它应该是加密唯一的每个用户,并将密码存储在数据库中,而不是在PHP代码中进行硬编码。 – 2010-07-22 02:52:19

5

md5不太适合这个目的。阅读this article以了解最新情况,但简短版本是您应该使用bcrypt来代替。 Google快速显示PHPass声称支持bcrypt

更新:由于@ Dragontamer5788在评论中指出,scrypt甚至比理论上的bcrypt更好。作者擅长加密技术,但请注意,此时的评论数量少于现实世界的曝光量,而不是bcrypt。我可能仍会选择它,但它不像md5上的bcrypt

+1

PHP 5.3+支持BCrypt in它的“crypt”功能,而PHP 5.2及更早的版本可以通过PHP Suhosin Patch(它实现了BCrypt到PHP)。技术上说,“scrypt”比BCrypt更好,因为它存在内存约束和CPU约束。但是BCrypt是目前最广泛使用的密码功能,不妨直接使用它,直到好的scrypt实现存在为止,这个答案需要更多upvotes – Dragontamer5788 2010-12-01 20:38:36

0

没有更多的信息,这将是很难帮助你,但我相信你想要的是Digest Authentication

下面是一个例子(实施例具体#7)从PHP文档:http://php.net/manual/en/features.http-auth.php

注意,此类型的认证不防止对人在中间人攻击。例如,如果某人正在嗅探受害者网络上的流量,则攻击者可以简单地使用消化的用户名/密码组合重新播放该请求,并且您的PHP脚本会高兴地将攻击者认证为受害者。

+0

我想将密码从php textfield保存到mysql表中,它是一个普通的用户注册和登录系统,我使用db加密保存,但是当我使用select查询来检查登录密码和用户已经提供的密码是否相同时,尽管它们是相同的。我很困惑, – Mujahid 2010-08-01 04:13:19

+0

好吧谢谢大家,我可以做到这一点,我将它保存为MD5(),当我检查密码时,我使用相同的MD5(),所以它工作正常:) – Mujahid 2010-08-27 05:59:14