如何使用substr解密php中的md5密码?

时间:2017-10-17 08:07:21

标签: php mysql login md5

我正在共享我的2个文件的代码。用于插入用户名和密码以及检索数据。我的情况有所不同。如果用户名: abc 和密码: 123456789

在登录界面上,用户只需输入密码中的3位数字。但这将是他密码中的随机数字。如果现在系统会要求我输入密码的第1,第3和第9位数字。重新加载页面后,它会随机更改。它将显示第2,第5和第4等等。

我之前使用我的代码完成了这项任务。但现在我想用md5加密方法插入密码。

如果我使用md5进行加密,那么我会被困在这里,然后如何重新密码。

insert.php:

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
    <form action="" method="post">
        <label>username</label>
        <input type="text" name="username">
        <label>pin</label>
        <input type="password" name="pin">
        <label>password</label>
        <input type="password" name="password">
        <button name="submit">Submit</button>
    </form>
</body>
</html>
<?php
include 'conn.php';
if (isset($_POST['submit'])) 
{
    $name = $_POST['username']; 
    $pass = md5($_POST['password']);

    $sql = mysqli_query($conn,'INSERT INTO `emp`(`name`, `pass`) VALUES ("'.$name.'","'.$pass.'")');
    if ($sql>0) 
    {
        header('Location: index.php');  
    }
}
?>

的index.php:

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
<?php
include 'conn.php';
if (isset($_POST['submit'])) {
    $name = $_POST['username'];    
    $pass1 = $_POST['pass1'];
    $pass2 = $_POST['pass2'];
    $pass3 = $_POST['pass3'];

    $char1 = $_POST['char1'];
    $char2 = $_POST['char2'];
    $char3 = $_POST['char3'];

    $sql = 'SELECT name,pass,pin from `emp` '
            . 'where `name` = "'.$name.'" '
            . 'AND SUBSTR(pass, '.($char1).', 1) = \''.$pass1.'\' '
            . 'AND SUBSTR(pass, '.($char2).', 1) = \''.$pass2.'\' ' 
            . 'AND SUBSTR(pass, '.($char3).', 1) = \''.$pass3.'\' ';        


    $sql = mysqli_query($conn,$sql);
    $data = mysqli_fetch_assoc($sql);
    if ($data) 
    {

        echo 'success';
    }
    else
    {
        echo 'Fail';
    }

}

// generate unique, not equal numbers
$char_pos = range(1, 9);
shuffle($char_pos);
$char_pos = array_slice($char_pos, 0, 3);
sort($char_pos);
?>
<form action="" method="post">
    <input type="hidden" name="char1" value="<?php echo $char_pos[0]; ?>">
    <input type="hidden" name="char2" value="<?php echo $char_pos[1]; ?>">
    <input type="hidden" name="char3" value="<?php echo $char_pos[2]; ?>">    
    Username:
     <input type="text" name="username" value="">    
    Password:
     <input type="password" class="inputs" maxlength="1" name="pass1" placeholder='<?php echo $char_pos[0]; ?>st' value="">
     <input type="password" class="inputs" maxlength="1" name="pass2" placeholder='<?php echo $char_pos[1]; ?>th' value="">
     <input type="password" class="inputs" maxlength="1" name="pass3" placeholder='<?php echo $char_pos[2]; ?>th' value="">
     <button name="submit">Submit</button>
</form>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script>
    $(".inputs").keyup(function () {
        if (this.value.length == this.maxLength) {
          $(this).next('.inputs').focus();
        }
    });
</script>
</body>
</html>

2 个答案:

答案 0 :(得分:0)

正如评论中已经指出的那样,md5是一种单向散列函数,而不是加密函数。这意味着无法对哈希执行部分密码验证,因为无法检索原始密码。

Smart Architects博客曾经有一篇关于部分密码验证的精彩文章,但现在只能通过web archive访问。

总结可能性(在纯文本解决方案中省略完全不安全的存储密码):

  1. 以加密格式存储密码,这意味着如果需要进行比较,您可以以纯文本格式检索密码。亲:易于实施。 Con:如果有人获得密钥,则可以撤消所有密码。如果您想要一些非常安全的东西,那么您可能需要一个HSM(硬件安全模块)。在您开始使用HSM之前,您可以尝试openssl_encrypt()功能。

  2. 散列接口可能以散列格式提出的所有字母组合。 Pro:可能是最安全的存储格式(如果正确的哈希算法与盐一起使用)。 Con:只需考虑为长密码创建的记录数量。

  3. 使用Shamir秘密共享方案。 Pro:存储空间与安全性的妥协。 Con:从编码的角度来看,可能是最难实现的解决方案。

答案 1 :(得分:0)

MD5()函数不是加密解密函数。它根据输入产生数据。该数据无法恢复。如果你需要用普通文本检查MD5输出,你必须MD5普通文本然后比较两个MD5输出。

有几个在线MD5 Decrypter存在。它基于过去的输入历史。 www.md5online.org

md5decrypt.net/en/

您可以查看..

谢谢...