php生成用户密码的两种方式

目录
  • 一、md5密码
  • 二、hash密码
  • PS:php生成随机密码的几种方法
    • 方法一:
    • 方法二:
    • 方法三:
    • 方法四:

在用户系统中,生成用户的密码是很重要的,而简单的密码必然给一些不法用户开了一些门户,这里列出几种常见的密码生成方式

一、md5密码

这种应该算是最常见的密码加密方式了
md5是属于非对称加密中的一种,这种密码方式其实说安全也很安全,而因为哈希碰撞的存在,会导致可能会出现漏洞
最好是在加密的时候,加入混淆字符串,如下所示

<?php
//加密
function md5_password($password, $hash = 'autofelix_')
{
    return md5($hash . $password);
}

//验证
$userinfo = /** 查询用户信息 **/;

if ($userinfo['password'] !== md5_password($password)) {
    /** 密码错误逻辑 **/
}

/** 密码正确,继续往后走逻辑 **/

二、hash密码

这种加密方式主要使用单向散列算法创建密码的散列
PASSWORD_DEFAULT 使用 bcrypt 算法
PASSWORD_BCRYPT 使用 CRYPT_BLOWFISH 算法创建散列
PASSWORD_ARGON2I 使用 Argon2 散列算法创建散列
这种密码加密方式数据库里储存结果的列可超过60个字符,所以varchar长度请设置255

<?php
//加密
function generatePassword($password)
{
   return password_hash($password, PASSWORD_DEFAULT);
}

//验证
function verifyPassword($password, $hashPassword)
{
   return password_verify($password, $hashPassword);
}

//加密结果:$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a

PS:php生成随机密码的几种方法

方法一:

1、在 33 - 126 中生成一个随机整数,如 35,
2、将 35 转换成对应的ASCII码字符,如 35 对应 #
3、重复以上 1、2 步骤 n 次,连接成 n 位的密码

该算法主要用到了两个函数,mt_rand ( int $min , int $max )函数用于生成随机整数,其中 $min - $max 为 ASCII 码的范围,这里取 33 -126 ,可以根据需要调整范围,如ASCII码表中 97 - 122 位对应 a - z 的英文字母,具体可参考 ASCII码表; chr ( int $ascii )函数用于将对应整数 $ascii 转换成对应的字符。

function create_password($pw_length = 8){
 $randpwd = '';
 for ($i = 0; $i < $pw_length; $i++) {
  $randpwd .= chr(mt_rand(33, 126));
 }
 return $randpwd;
}

// 调用该函数,传递长度参数$pw_length = 6
echo create_password(6);

方法二:

1、预置一个的字符串 $chars ,包括 a - z,A - Z,0 - 9,以及一些特殊字符
2、在 $chars 字符串中随机取一个字符
3、重复第二步 n 次,可得长度为 n 的密码

function generate_password( $length = 8 ) {
 // 密码字符集,可任意添加你需要的字符
 $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|';

 $password = '';
 for ( $i = 0; $i < $length; $i++ ) {
  // 这里提供两种字符获取方式
  // 第一种是使用 substr 截取$chars中的任意一位字符;
  // 第二种是取字符数组 $chars 的任意元素
  // $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
  $password .= $chars[ mt_rand(0, strlen($chars) - 1) ];
 }

 return $password;
}

方法三:

1、预置一个的字符数组 $chars ,包括 a - z,A - Z,0 - 9,以及一些特殊字符
2、通过array_rand()从数组 $chars 中随机选出 $length 个元素
3、根据已获取的键名数组 $keys,从数组 $chars 取出字符拼接字符串。该方法的缺点是相同的字符不会重复取。

function make_password( $length = 8 ) {
 // 密码字符集,可任意添加你需要的字符
 $chars = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
 'i', 'j', 'k', 'l','m', 'n', 'o', 'p', 'q', 'r', 's',
 't', 'u', 'v', 'w', 'x', 'y','z', 'A', 'B', 'C', 'D',
 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L','M', 'N', 'O',
 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y','Z',
 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!',
 '@','#', '$', '%', '^', '&', '*', '(', ')', '-', '_',
 '[', ']', '{', '}', '<', '>', '~', '`', '+', '=', ',',
 '.', ';', ':', '/', '?', '|');

 // 在 $chars 中随机取 $length 个数组元素键名
 $keys = array_rand($chars, $length); 

 $password = '';
 for($i = 0; $i < $length; $i++) {
  // 将 $length 个数组元素连接成字符串
  $password .= $chars[$keys[$i]];
 }

 return $password;
}

方法四:

本方法是本文被蓝色理想转载后,一名网友提供的一个新方法,算法简单,代码简短,只是因为md5()函数的返回值的缘故,生成的密码只包括字母和数字,不过也算是一个不错的方法。算法思想:
1、time() 获取当前的 Unix 时间戳
2、将第一步获取的时间戳进行 md5() 加密
3、将第二步加密的结果,截取 n 位即得想要的密码

function get_password( $length = 8 ) {
 $str = substr(md5(time()), 0, $length);
 return $str;
}

到此这篇关于php生成用户密码的两种方式 的文章就介绍到这了,更多相关php生成用户密码内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详细分析PHP7与PHP5区别

    1.php标量类型和返回类型声明 #主要分为两种模式,强制性模式和严格模式 declare(strict_types=1) #1表示严格类型校验模式,作用于函数调用和返回语句:0表示弱类型校验模式. 2.NULL合并运算符 $site = isset($_GET['site']) ? $_GET['site'] : 'wo'; #简写成 $site = $_GET['site'] ??'wo'; 3.组合预算符 // 整型比较 print( 1 <=> 1);print(PHP_EOL); p

  • PHP实现两种排课方式

    两种排课方式: 固定每周的固定时间上课(例:共上20节,每周六.周日早上8点-10点上课.假如今天周六凌晨1点,那么排课也需要从今天开始)总共上几个周,每周上课时间比较个性化(例:共上三周,第一周周一周二早上8点-10点上课:第二周周三周四下午8点-10点上课:第三周周日中午11点-12点上课.) 第一种排课比较好实现,简要代码如下: /** * 生成日期列表 * * @param int $startDate 开始日期 时间戳格式 * @param array $timeList 课时计划列表

  • php使用workman框架实现socket服务以及连接客户端

    1. 解决什么问题,为什么要用workman  socket服务 都知道游戏安装包很大,渠道推广时,需要对游戏进行分包处理,而PHP命令模式是单进程,一次只能分一次包,故这里用workman实现socket服务开启多进程,对游戏进行分包处理(一个进程处理一个分包,多个进程可以同时处理多个分包) 2. 服务端代码 server.php <?php /** * 分包程序.切记不能有die或exit出现. * * User: yzm * Data: 2018/1/16 */ require_once

  • php类中static与self的使用区别浅析

    使用 self:: 或者 __CLASS__ 对当前类的静态引用,取决于定义当前方法所在的类: 使用 static:: 不再被解析为定义当前方法所在的类,而是在实际运行时计算的.也可以称之为"静态绑定",因为它可以用于(但不限于)静态方法的调用. 静态绑定是PHP 5.3.0,增加的一个功能 用于在继承范围内引用静态调用的类 php类中static和self的区别,php类的定义中经常能看到self和static,在运行的时候经常发现结果并没有区别,但是肯定不是没有区别,因为没有区别为

  • php如何用PDO操作大数据对象

    目录 什么是大数据对象 "大"通常意味着"大约 4kb 或以上",尽管某些数据库在数据达到"大"之前可以轻松地处理多达 32kb 的数据.大对象本质上可能是文本或二进制形式的,我们在 PDOStatement::bindParam() 或 PDOStatement::bindColumn() 调用中使用 PDO::PARAM_LOB 类型码可以让 PDO 使用大数据类型.PDO::PARAM_LOB 告诉 PDO 作为流来映射数据,以便能使用 P

  • php生成用户密码的两种方式

    目录 一.md5密码 二.hash密码 PS:php生成随机密码的几种方法 方法一: 方法二: 方法三: 方法四: 在用户系统中,生成用户的密码是很重要的,而简单的密码必然给一些不法用户开了一些门户,这里列出几种常见的密码生成方式 一.md5密码 这种应该算是最常见的密码加密方式了 md5是属于非对称加密中的一种,这种密码方式其实说安全也很安全,而因为哈希碰撞的存在,会导致可能会出现漏洞 最好是在加密的时候,加入混淆字符串,如下所示 <?php //加密 function md5_passwor

  • Linux通过Shell脚本命令修改密码的两种方式

    交互方式修改密码 1. ssh 远程到主机: 2. 切换到root账号: [一般都是切换到root进行密码修改,如果普通用户修改自己的密码,要输入原密码,然后新密码要满足复杂度才OK]: 3. passwd username 使用passwd username 修改 username 的密码: 使用该命令会有提示,即进入了交互界面,输入密码即可. 使用脚本修改密码 很多时候我们可能需要远程执行服务器上的脚本来修改账号密码,此时就没有办法进行交互了. 此时可以使用如下两种方式修改密码: 方式1:

  • Android中EditText显示明文与密码的两种方式

    效果图如下所述: 布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_pa

  • javascript记住用户名和登录密码(两种方式)

    下面主要通过代码给大家展示下javascript记住用户名和登录密码,具体代码内容请看下文. 第一种方式: CONTENT     login.html     welcome.html     cookie.js     common.js login.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-t

  • 在AOP中Spring生成代理类的两种方式

    Java 动态代理.具体有如下四步骤: 通过实现 InvocationHandler 接口创建自己的调用处理器: 通过为 Proxy 类指定 ClassLoader 对象和一组 interface 来创建动态代理类: 通过反射机制获得动态代理类的构造函数,其唯一参数类型是调用处理器接口类型: 通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数被传入. 在AOP中,Spring通过生成代理类,来完成切面的织入. Spring生成代理类有2种方式. 如果目标对象实现的是一个接口,Sprin

  • 详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)

    最近做项目遇到生成二维码的问题,发现网上用的最多的是ThoughtWorks.QRCode和QrCode.Net两种方式.访问官网看着例子写了两个Demo,使用过程中发现两个都挺好用的,ThoughtWorks.QRCode的功能更多一些,但是dll文件有6兆,QrCode.Net只有400多K,大家根据自己的需要选择吧.附上代码仅供参考. 并且提供VS2013写的一个Demo提供给大家免费下载.如有疑问欢迎交流. ThoughtWorks.QRCode: private void Create

  • Angualrjs 表单验证的两种方式(失去焦点验证和点击提交验证)

    AngularJS提供了表单验证,但是验证的过程交互体验很不好,比如重设密码,重复密码的时候一键入就会提示密码不正确,现整理了两种方法,仅供借鉴. 一,点击提交验证 <form action="" class="form-horizontal col-md-9" name="reset_pwd" ng-submit="resetPwd()"> <div class="form-group"

  • 深入SqlServer2008 数据库同步的两种方式(Sql JOB)的分析介绍

    下面介绍的就是数据库同步的两种方式: 1.SQL JOB的方式  sql Job的方式同步数据库就是通过SQL语句,将一个数据源中的数据同步到目标数据库中.特点是它可以灵活的通过SQL的方式进行数据库之间的同步操作.可以在制定的时间时间作为任务计划自动执行.缺点是需要写SQL来进行操作.既然是数据库之间的同步就涉及到数据库之间的连接.建立连接是同步的第一步.SQL Server建立连接可以通过系统存储过程建立[是否还有其他方式,我还不清楚].存储过程有以下几个:sp_droplinkedsrvl

  • 分享java中设置代理的两种方式

    1 前言 有时候我们的程序中要提供可以使用代理访问网络,代理的方式包括http.https.ftp.socks代理.比如在IE浏览器设置代理. 那我们在我们的java程序中使用代理呢,有如下两种方式.直接上代码. 2 采用设置系统属性 import java.net.Authenticator; import java.net.PasswordAuthentication; import java.util.Properties; public class ProxyDemo1 { public

  • Oracle创建Database Link的两种方式详解

    创建一个dblink,命名为dblink_name,从A数据库连到B数据库,B数据库的IP为192.168.1.73,端口为1521,实例名为oracle,登录名为tast,密码为test. 一菜单方式: 打开plsql,点击[File]-[New]-[Database link],打开如下图所示窗口 填好各项信息后,点击[Apply]即可完成Database Link的创建. 二SQL方式 -- Drop existing database link drop public database

随机推荐