【问题标题】:Exactly how do I use blowfish in PHP? [duplicate]究竟如何在 PHP 中使用河豚? [复制]
【发布时间】:2012-11-28 05:03:01
【问题描述】:

可能重复:
Best way to use PHP to encrypt and decrypt passwords?

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

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

现在,我有一个脚本,可以根据日期和时间生成盐,一个随机数,然后对盐进行哈希处理。我可以和河豚一起使用吗?

【问题讨论】:

  • 为了理解你可以看看这个example code的cmets,为了使用它,我强烈推荐使用ircmaxell的优秀api。 crypt() 的第二个参数叫做 salt 是误导性的,实际上它包含了包括 salt 在内的所有 crypt 参数。

标签: php hash passwords blowfish crypt


【解决方案1】:

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

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

【讨论】:

  • 我已经看到了,但我仍然感到困惑。我是否只是在我的盐前面加上 $2a$07$(最后再加上 $)让它使用河豚?另外,那个例子中的 07 是几轮?
  • 没错,07的数字越大,轮数越多,耗时越长
【解决方案2】:

简而言之:不要自己构建它。使用库。

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

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

$hash = password_hash($password, PASSWORD_BCRYPT);

然后去验证:

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

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

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

【讨论】:

  • 我已经读过,从长远来看可能会使用它,但我喜欢自己了解如何做事。感谢您的提示,但它没有回答我的问题。
  • @sharf:看看这些库做了什么(compat 应该很容易阅读)。这应该让您了解这一切是如何运作的......
  • 那仍然没有回答我的问题。
  • 这不是 OP 所要求的,但这是 OP 需要的答案
  • @BenDuffin:您实际上只是用您的评论证明了我的观点。 crypt() 可以做 bcrypt。但是很容易搞砸。在您杀死安全性的情况下很容易结束。这就是为什么我不建议直接使用它,而是使用库。因为密码学很难,如果你有替代方案,你不应该自己做。还有其他选择。
【解决方案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);

【讨论】:

  • 几点: 1.问题是关于密码散列算法(见密码和加密标签)。 2. 你正在使用欧洲央行。糟糕的开发人员,没有甜甜圈。 3. 您使用的是静态的硬编码密钥。再说一次,不好。 4.您没有将IV存储在加密中,这意味着解密将永远无法工作(对于非ECB模式)......
  • 有用的评论 - 你能重写它以适应你指定的条件吗?虽然我不同意题外话的部分 - 小伙子想知道如何用河豚加密,他不是吗?不知道他的代码,我只是试图给他一个实用程序,允许他使用河豚算法加密和解密给定的数据。非 ECB 模式是什么意思,因为我在一些大型应用程序中使用了非常相似的代码并且没有遇到任何问题 - 我错过了什么吗? :S 希望不会!
  • 首先,不,他说的不是encryption, he asked about hashing。所以这绝对是题外话。至于其他问题,它是不安全的:OneTwoThree
  • 如果您需要更多反馈,请发送至codereview.stackexchange.com
  • mcrypt 将在 php 7.1 上被弃用,以支持 OpenSSL
猜你喜欢
  • 2016-02-29
  • 2013-01-04
  • 1970-01-01
  • 1970-01-01
  • 2013-02-06
  • 2013-03-08
  • 1970-01-01
  • 1970-01-01
  • 2019-03-26
相关资源
最近更新 更多