查看: 1147|回复: 0

[PHP代码] php cryptr 加密函数

发表于 2017-1-11 12:00:02
句号论坛

  1. class CryptHelper {
  2. /**
  3. * 加密
  4. * @param unknown $password
  5. * @param unknown $salt
  6. * @return string
  7. */
  8. public static function crypt($password,$salt){
  9. // $saltPrefix .= '$2y$'; // Blowfish 算法
  10. // $saltPrefix .= '13'; // 两位 cost 参数
  11. // $saltPrefix .= '$'; // 一个 $
  12. // $saltSuffix .= 'LGsF2ctmKKHE1yr2Py.vtu';
  13. return crypt($password, $salt);
  14. }
  15. /**
  16. * 字符比较
  17. * @param unknown $expected
  18. * @param unknown $actual
  19. * @return boolean
  20. */
  21. public static function compareString($expected, $actual)
  22. {
  23. $expected .= "\0";
  24. $actual .= "\0";
  25. $expectedLength = mb_strlen($expected, '8bit');
  26. $actualLength = mb_strlen($actual, '8bit');
  27. $diff = $expectedLength - $actualLength;
  28. for ($i = 0; $i < $actualLength; $i++) {
  29. $diff |= (ord($actual[$i]) ^ ord($expected[$i % $expectedLength]));
  30. }
  31. return $diff === 0;
  32. }
  33. /**
  34. * 校验密码
  35. * @param unknown $password
  36. * @param unknown $hash
  37. * @return boolean
  38. */
  39. public static function validatePassword($password, $hash)
  40. {
  41. if (!is_string($password) || $password === '') {
  42. return false;
  43. }
  44. if (!preg_match('/^\$2[axy]\$(\d\d)\$[\.\/0-9A-Za-z]{22}/', $hash, $matches)
  45. || $matches[1] < 4
  46. || $matches[1] > 30
  47. ) {
  48. return false;
  49. }
  50. $test = self::crypt($password, $hash);
  51. $n = strlen($test);
  52. if ($n !== 60) {
  53. return false;
  54. }
  55. return self::compareString($test, $hash);
  56. }
  57. }
复制代码

测试

  1. // --------- 测试 --------
  2. // 加密
  3. $salt = '$2y$13$LGsF2ctmKKHE1yr2Py.vtu'; // 7 + 22 == 29
  4. $password = 'Aa123456';
  5. echo CryptHelper::crypt($password,$salt);
  6. echo PHP_EOL;
  7. // 校验
  8. $hash = '$2y$13$LGsF2ctmKKHE1yr2Py.vtuiUR/A0C6tARkCxMO.LUlsiRISu7u53m';
  9. echo CryptHelper::crypt($password,$hash);
  10. echo PHP_EOL;
  11. echo strlen($hash);
  12. echo PHP_EOL;
  13. echo CryptHelper::validatePassword($password, $hash);
复制代码



太阳http代理AD
回复

使用道具 举报

关闭

站长推荐上一条 /1 下一条