【发布时间】:2013-06-17 18:50:32
【问题描述】:
基本上,当新用户注册帐户时,我有一个游戏服务器,其中密码哈希为 sha1,另一个为 md5。我决定坚持使用 sha1,但是我希望我的用户能够更改他们的密码,这会将他们从 md5 创建为 sha1。
我已经编写了以下代码,但它似乎不起作用。
基本上,我希望他们在更改密码时将 md5 替换为 sha1 哈希密码。
<?php
if(isSet($_POST['submit']))
{
$changePW = true;
}
?>
<?php
public function hashed($password)
{
return sha1($password . "xCg532%@%gdvf^5DGaa6&*rFTfg^FD4\$OIFThrR_gh(ugf*/");
}
?>
<?php
if(isset($changePW))
{
//host, username, password, dbName
$con=mysqli_connect("localhost","root","password","dbName");
$username = $_POST['username'];
$password = $_POST['passwordOld'];
$passwordNew1 = $_POST['passwordNew1'];
$passwordNew2 = $_POST['passwordNew2'];
$passwordHash = md5($password);
// Check connection
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
$cmd = "SELECT COUNT(*) FROM users WHERE username = '" . $username . "' AND password = '" . $passwordHash . "'";
$result = mysqli_query($con,$cmd);
$row = mysqli_fetch_row($result);
if($row[0] == 1)
{
if($passwordNew1 == $passwordNew2)
{
$newHash = hashed($passwordNew1);
$cmd = "UPDATE users SET password = '$newHash' WHERE username = '$username'";
mysqli_query($con,$cmd);
}
else{
$passwordMatch = true;
}
}
else {
$detailsError = true;
}
//$hash = md5($password);
//mysqli_query($con,"INSERT INTO tutorials_tbl (name, hash) VALUES ('" . $username . "','" . $hash . "')");
mysqli_close($con);
}
?>
<head>
<style type="text/css">
.lblLabel{
width:165px;
display: inline-block;
}
</style>
</head>
<form name="login" method="post" action="change.php">
<fieldset style="width:350px;"><legend>Change Password Form</legend>
<label class="lblLabel">Username</label><input id="name" type="text" name="username" value=""><br />
<label class="lblLabel">Old Password</label><input type="password" name="passwordOld"><br />
<?php
if(isset($detailsError))
{ ?>
<span style="color: #F00; font-weight: bold;">Username or Password Incorrect</span>
<?php }
?>
<label class="lblLabel">New Password</label><input type="password" name="passwordNew1"><br />
<label class="lblLabel">Repeated New Password</label><input type="password" name="passwordNew2"><br />
<?php
if(isset($passwordMatch))
{ ?>
<span style="color: #F00; font-weight: bold;">Password's do not match</span>
<?php }
?>
<label class="lblLabel"> </label><input id="submit" type="submit" name="submit" value="Change Password"><br />
</fieldset>
</form>
它正在调用将用户表中密码列下的密码更改为sha1。 users表中所有当前密码都是md5,需要转换成sha1。
对不起,如果这没有意义。
【问题讨论】:
-
出于好奇,为什么不 SHA MD5 的密码?
-
另外,你看到this question了吗?
-
我不熟悉密码哈希。我有1000+注册用户,都是MD5密码,需要换成SHA1才能登录成功。
-
基本上,您要做的只是一次,遍历每个用户并对他们的密码进行 SHA 哈希处理。这将创建密码的 SHA 哈希。当您进行登录检查时,您将对给定密码进行 MD5 哈希处理,对结果进行 SHA 哈希处理,然后对照您的用户表进行检查。这对您来说是最少的初始工作,并且对您的用户来说是一个无缝过渡(他们不必更改密码,您不必维护他们的密码的两条记录等)
-
您的密码字段在数据库中有多大?它可能太小,这会导致密码被截断,导致所有尝试验证数据库失败。