加密如何保障安全

:-}

你还在用md5+salt方式加密密码吗?PHP5.5引入了Password Hashing函数,内核自带无需安装扩展。

入门

password_get_info — 返回指定散列(hash)的相关信息
password_hash — 创建密码的散列(hash)
password_needs_rehash — 检测散列值是否匹配指定的选项
password_verify — 验证密码是否和散列值匹配

提供了这4个函数,具体案例可以看 http://php.net/manual/zh/function.password-hash.php

例子

代码:

<?php

$pwd = password_hash('123456abc',PASSWORD_DEFAULT);
$v = password_get_info($pwd);

if(password_verify('123456abc', $pwd)){
  echo 'yes';
  echo  PHP_EOL;
}
var_dump($v);
  echo  PHP_EOL;
var_dump($pwd);
  echo  PHP_EOL;

在cli模式下运行结果:

$ php b.php
yes
array(3) {
  ["algo"]=>
  int(1)
  ["algoName"]=>
  string(6) "bcrypt"
  ["options"]=>
  array(1) {
    ["cost"]=>
    int(10)
  }
}

string(60) "$2y$10$PQcdiu8BHfKS.43/RJ5xUeYDdHQ8/vcDSlM6lubIdCiTwso6T9.7."

优点

通过password_hash加密后的密码,使用字典方式很难破解,因为每次生成的密码都是不一样的,破解这种加密只能采用暴力破解。加密方法再好,原始密码设置的过于简单都容易被破解,设置复杂的密码才是王道。

laravel框架中的使用

这两篇文章从框架源码讲解了Password Hashing函数的应用。
http://laravelacademy.org/post/8327.html
http://laravelacademy.org/post/4764.html

总结

虽然通过password_hash()创建的哈希密码更加安全,但是却降低了互操作性。
如我们使用md5方式,在php中用标准的MD5加密,很容易通过其他语言来校验,因为md5的加密方式其他语言也可以使用。而使用password_hash()加密的哈希值基本只能通过PHP的password_verify来校验。
这2种方法各有优劣,是使用md5(或sha1等)+salt(干扰字符串)的方式还是使用password_hash()大家根据具体情况取舍把。