PHP5中哈希创建和验证方法详解,总结的一些PHP开发中的tips

首先讨论password_hash()函数。这将用作创建一个新的密码的哈希值。它包含三个参数:密码、哈希算法、选项。前两项为必须的。你可以根据下面的例子来使用这个函数:

一、开发习惯和php代码

$servername``=``"localhost"``;

 代码如下

1、准确的理解各种概念。现在的新东西层出不穷,望文生义和一知半解对开发工作有害无益;//比如我就碰到有人理解松散耦合(这个东西不新)的概念居然是要求代码不要有空行,否则你的程序就是“太松散”了

$username``=``"root"``;

$password = ‘foo’;
$hash = password_hash($password,PASSWORD_BCRYPT);
//$2y$10$uOegXJ09qznQsKvPfxr61uWjpJBxVDH2KGJQVnodzjnglhs2WTwHu

2、代码美观,适当的空行、缩进,空格,这样能更容易理解代码段的意思;

$password``=``"admin"``;

你将注意到我们并没有给这个哈希加任何选项。现在可用的选项被限定为两个:
cost 和salt。妖添加选项你需要创建一个关联数组。

3、一定要写注释,而且要恰当的注释,要不然后面的维护工作或者接手代码的人会痛哭不已;

$dbname``=``"test"``;

 代码如下

4、静态方法、类访问权限、接口、抽象类应该综合起来使用,发挥各自特点;

try``{

$options = [ ‘cost’ => 10,
             ‘salt’ => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM)
];

5、不要复制粘贴,即使是要用到现成的代码,也要一行一行的审阅后,再加入到新项目,因为经验告诉我们,这太容易出错了,对于使用开源类这种大段代码更需要;

``$conn``=``new
PDO(``"mysql:host=$servername;dbname=$dbname"``,``$username``,``$password``);

将选项添加到 password_hash() 函数后,我们的哈希值变了,这样更加安全。

6、变量都要初始化;

``$conn``->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

 代码如下

7、不要只处理error,而忽略warning和notice,这可能会导致日后的莫名其妙的问题,项目在开发状态下应该是error_reporting(
 E_ALL  ^  E_NOTICE
 ),等到发布的外网生产环境时,应关闭所有错误报告display_errors=Off,error_reporting(0)

``//开始事务

$hash = password_hash($password,PASSWORD_BCRYPT,$options);
//$2y$10$JDJ5JDEwJDhsTHV6SGVIQuprRHZnGQsUEtlk8Iem0okH6HPyCoo22

8、记录一些必要的错误日志,比如写文件失败、写memcache失败,socket连接失败、读写数据库失败,日志能够帮助出现问题时的快速定位,外部生产环境我个人是强烈建议关闭所有错误报告的;

``$conn``->beginTransaction();

现在哈希创建完毕了,我们可以通过 password_get_info()
查看新建哈希值得相关信息。password_get_info()
需要一个参数——哈希值——并返回一个包含算法(所用哈希算法的整数代表形式)、算法名(所用哈希算法的可读名称)以及选项(我们用于创建哈希值得选项)的关联数组。

9、用try、catch捕获异常,对代码的健壮有帮助,常常在API接口中碰到,这样子显得友好多了;

``$conn``->``exec``(``` "INSERT INTOhello(firstname,lastname,email)VALUES('YE','XIAMING','yexianming@163.com')" ```);

 代码如下

10、双引号中出现的变量建议加上大括号,至于是”${nider}at
gmail.com”还是”{$tom}at zendstudio.net”看个人习惯,我更喜欢后面一种;

``$conn``->``exec``(``` "INSERT INTOhello(firstname,lastname,email)VALUES('YE','CONG','yecong@163.com')" ```);

var_dump(password_get_info($hash));
/*
array(3) {
  [“algo”]=>
  int(1)
  [“algoName”]=>
  string(6) “bcrypt”
  [“options”]=>
  array(1) {
    [“cost”]=>
    int(10)
  }
}

11、尽量少的if
else嵌套层数,也许你要表达一个非常复杂的逻辑算法,但这样做至少能让代码逻辑更清晰

``$conn``->``exec``(``` "INSERT INTOhello(firstname,lastname,email)VALUES('FANG','MENG','fangmeng@168.com')" ```);

*/先一个被添加到 Password Hashing API 的是
password_needs_rehash(),它接受三个参数,hash、hash
算法以及选项,前两个是必填项。
password_needs_rehash()用来检查一个hash值是否是使用特定算法及选项创建的。这在你的数据库受损需要调整hash时非常有用。通过利用
password_needs_rehash() 检查每个hash值,我们可以看到已存的hash
值是否匹配新的参数, 仅影响那些使用旧参数创建的值。

12、多阅读网上开源项目的优秀代码(不是优秀项目的开源代码),吸取其中值得借鉴的地方

``//提交事务

发表评论

电子邮件地址不会被公开。 必填项已用*标注

标签:
网站地图xml地图