9

可能重复:
使用 PHP 加密和解密密码的最佳方法?

我最近一直在用 PHP 做很多事情,并想制作我的第一个登录/注册系统。因此,我一直在网上阅读大量资料,以找出执行此操作的最佳方法。我遇到了一些指南,在一些情况下我感到困惑,我想在开始这条路之前确定一下。

我的问题是我究竟如何使用河豚?我读过 crypt() 如果提供了适当的盐,它将自动选择河豚。如果是这样的话,是什么让咸河豚适合?

现在,我有一个脚本,可以根据日期和时间制作盐,一个随机数,然后将其散列为盐。那是我可以和河豚一起使用的东西吗?

4

3 回答 3

12

简而言之:不要自己构建它。使用图书馆。

在 PHP 5.5 中,将有一个新的 API 可让您更轻松地完成此过程。这是它的 RFC

我还在这里为它创建了一个向后兼容库:password-compat

$hash = password_hash($password, PASSWORD_BCRYPT);

然后验证:

if (password_verify($password, $hash)) {
    /* Valid */
} else {
    /* Invalid */
}

如果您想要另一个库,请查看phpass

简而言之,不要自己做。没有必要。只需导入库并完成它...

于 2012-12-10T18:27:16.300 回答
6

看看http://php.net/manual/en/function.crypt.php

如果您向下滚动大约 1/3,您应该会看到标题:Example #3 Using crypt() with different hash types. 希望这会有所帮助!你的盐应该没问题!

于 2012-12-10T18:22:13.327 回答
-3

试试这个 - 它未经测试,我只是把它搅起来展示如何使用 PHP 的 BLOWFISH 算法

<?php
class cipher {
private static $mode = 'MCRYPT_BLOWFISH';
private static $key = 'q!2wsd#45^532dfgTgf56njUhfrthu&^&ygsrwsRRsf';

public static function encrypt($buffer){
    $iv                 = mcrypt_create_iv(mcrypt_get_iv_size(constant(self::$mode), MCRYPT_MODE_ECB), MCRYPT_RAND); 
    $passcrypt  = mcrypt_encrypt(constant(self::$mode), self::$key, $buffer, MCRYPT_MODE_ECB, $iv); 
    $encode         = base64_encode($passcrypt); 
    return $encode; 
}

public static function decrypt($buffer){
    $decoded        = base64_decode($buffer); 
    $iv                 = mcrypt_create_iv(mcrypt_get_iv_size(constant(self::$mode), MCRYPT_MODE_ECB), MCRYPT_RAND); 
    $decrypted  = mcrypt_decrypt(constant(self::$mode), self::$key, $decoded, MCRYPT_MODE_ECB, $iv);
    return $decrypted;
}
}
?>

重要的!!将 $key 值更改为另一个随机字符串!

用法:

加密:

$mystring = '一只敏捷的棕色狐狸跳过了懒惰的骆驼'; $mystring = cipher::encrypt($mystring);

解密:

$mystring = cipher::decrypt($myencryptedstring);

于 2012-12-10T21:06:37.047 回答