Travis CI:PHP 7.2不支持Argon2i

时间:2017-12-04 13:42:41

标签: travis-ci

我的Travis CI项目出现错误:

  

不支持Argon2i算法。请安装libsodium扩展名
    或者升级到PHP 7.2+。

但是,Argon2i存在于PHP 7.2版本中,Travis CI安装了PHP 7.2版本:

$ phpenv global 7.2 2>/dev/null

7.2 is not pre-installed; installing
Downloading archive: https://s3.amazonaws.com/travis-php-archives/binaries/ubuntu/14.04/x86_64/php-7.2.tar.bz2
$ curl -s -o archive.tar.bz2 $archive_url && tar xjf archive.tar.bz2 --directory /

$ phpenv global 7.2

$ php --version
PHP 7.2.0 (cli) (built: Dec  2 2017 17:12:55) ( ZTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.2.0, Copyright (c) 1999-2017, by Zend Technologies
    with Xdebug v2.6.0-dev, Copyright (c) 2002-2017, by Derick Rethans

有人有想法吗?

3 个答案:

答案 0 :(得分:3)

我最近在Symfony 4项目中遇到了同样的问题,并在Travis'上发布了issue。 Github上。

然而,问题似乎不是来自Travis,而是来自PHP 7.2默认构建本身。

引用自己:

  

我在本地使用预配置的PHP,因此确保我只是从源代码编译PHP 7.2。

$ ./php -v
PHP 7.2.0 (cli) (built: Dec  6 2017 15:26:29) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2017 Zend Technologies
     

然后我尝试使用官方docs中描述的ARGON2I算法:

$ ./php -r 'echo password_hash("test", PASSWORD_ARGON2I) . "\n";'
Warning: Use of undefined constant PASSWORD_ARGON2I - assumed 
'PASSWORD_ARGON2I' (this will throw an Error in a future version of PHP) in Command line code on line 1
Warning: password_hash() expects parameter 2 to be integer, string given in Command line code on line 1
     

BCRYPT没有任何问题:

$ ./php -r 'echo password_hash("test", PASSWORD_BCRYPT) . "\n";'
$2y$10$wsWe3BhyzenVqDs6JV/fPOB0XKh0oTuGdrgLp61MnUPzOUdw4jZey
     

这很奇怪。我希望这个算法成为默认PHP 7.2构建的一部分,就像其他哈希算法一样。似乎没有任何迹象表明文档中的相反情况。我会调查一下。也许我理解错了......但这对我来说似乎是一个错误,因为他们说here PASSWORD_ARGON2I是PHP核心的一部分。

编辑:

根据Sheppard's comment,确实7.2确实没有在其默认构建中实现PASSWORD_AGRON2I算法。 PHP必须使用选项-with-password-argon2进行编译,如https://wiki.php.net/rfc/argon2_password_hash中所述。

答案 1 :(得分:1)

默认情况下,PHP 7.2无法使用argon2i密码,它是一个编译选项,但是TravisCi不会在他们的PHP图像中使用它,那么我们可以通过添加库来避免这个错误(最初在PHP< 7.2版本中使用)在https://symfony.com/blog/new-in-symfony-3-4-argon2i-password-hasher中进行了修改,但直接在我们的composer.json中没有,请在.travis.yml文件中调用它:

before_install:
  # Fix Argon2i password hasher in TravisCi PHP version
  - composer require paragonie/sodium_compat

编辑:

由于Symfony已更新,之前的解决方案不再有效,我选择直接添加带有PECL的libsodium扩展。我认为这种方法更好,因为我们安装并启用了PHP扩展。

我们必须下载libsodium库的源代码,因为ubuntu 14.04没有库,然后编译它,并用pecl编译PHP扩展,并启用它。

效果很好,但比以前的解决方案花费的时间更多。

before_install:
  # Manually compile the libsodium library
  - sudo apt-get update -qq
  - sudo apt-get install build-essential git -y
  - git clone -b stable https://github.com/jedisct1/libsodium.git
  - cd libsodium && sudo ./configure && sudo make check && sudo make install && cd ..
  - '[[ "$TRAVIS_PHP_VERSION" == "nightly" ]] || phpenv config-rm xdebug.ini'
  - composer self-update

install:
  # Manually install libsodium, because the TravicCi image doesn't provide PHP7.2 with libsodium
  - pecl install libsodium
  - echo "extension=sodium.so" >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini

答案 2 :(得分:1)

这确实是PHP的愚蠢丢球。幸运的是有一个合理的解决方法 - 虽然默认情况下没有编译libargon2(因为它在PHP的所有平台上都不可用),但libsodium是,虽然libsodium不提供PASSWORD_ARGON2I常量,但它有sodium_crypto_pwhash function,它使用Argon2密码散列算法的Argon2id变体,它比PHP 7.2 Argon2i更强,但与它不兼容。你这样使用它:

$hash = sodium_crypto_pwhash_str(
    $password, 
    SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE,
    SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE
);

您可以使用the paragonie/sodium_compat library通过composer在PHP 7.2之前的PHP版本中获得此功能。

我认为通过这种透明的回退是Symfony错失的机会 - 它最终未能以与PHP本身完全相同的方式提供实现,这对任何人都没有帮助。