Travis ci travisci:php7.2don';不支持Argon2i

Travis ci travisci:php7.2don';不支持Argon2i,travis-ci,Travis Ci,我与Travis CI的项目中有一个错误: 不支持Argon2i算法。请安装LibNaude扩展 或者升级到PHP7.2+ 但是,PHP 7.2版本中存在Argon2i,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/bina

我与Travis CI的项目中有一个错误:

不支持Argon2i算法。请安装LibNaude扩展
或者升级到PHP7.2+

但是,PHP 7.2版本中存在Argon2i,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

有人有主意吗?

我最近在一个Symfony 4项目中遇到了同样的问题,并在Travis的Github上发布了一条消息

然而,问题似乎不是来自Travis,而是来自PHP7.2默认构建本身

引用我自己的话:

我在本地使用了一个预配置的PHP,所以我只是从源代码中编译了PHP7.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
然后我尝试使用
ARGON2I
算法,如官方文件中所述:

虽然对
BCRYPT
没有任何问题:

$ ./php -r 'echo password_hash("test", PASSWORD_BCRYPT) . "\n";'
$2y$10$wsWe3BhyzenVqDs6JV/fPOB0XKh0oTuGdrgLp61MnUPzOUdw4jZey
这很奇怪。我希望这个算法是默认PHP7.2构建的一部分,就像其他哈希算法一样。文件中似乎没有任何相反的指示。我会调查的。也许我理解错了。。。但对我来说这看起来像个bug,因为他们说
PASSWORD\u ARGON2I
是PHP核心的一部分


编辑:
鉴于此,7.2似乎确实没有在其默认版本中实现
PASSWORD\u AGRON2I
算法。PHP必须使用选项
-with-password-argon2
进行编译,如中所述。

我最近在一个Symfony 4项目中遇到了同样的问题,并在Travis的Github上发布了一条消息

然而,问题似乎不是来自Travis,而是来自PHP7.2默认构建本身

引用我自己的话:

我在本地使用了一个预配置的PHP,所以我只是从源代码中编译了PHP7.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
然后我尝试使用
ARGON2I
算法,如官方文件中所述:

虽然对
BCRYPT
没有任何问题:

$ ./php -r 'echo password_hash("test", PASSWORD_BCRYPT) . "\n";'
$2y$10$wsWe3BhyzenVqDs6JV/fPOB0XKh0oTuGdrgLp61MnUPzOUdw4jZey
这很奇怪。我希望这个算法是默认PHP7.2构建的一部分,就像其他哈希算法一样。文件中似乎没有任何相反的指示。我会调查的。也许我理解错了。。。但对我来说这看起来像个bug,因为他们说
PASSWORD\u ARGON2I
是PHP核心的一部分


编辑:
鉴于此,7.2似乎确实没有在其默认版本中实现
PASSWORD\u AGRON2I
算法。PHP必须使用选项
-with-password-argon2
进行编译,如中所述。

PHP 7.2默认情况下似乎没有argon2i密码哈希器,这是一个编译选项,但TravisCi在其PHP图像中不使用它,然后我们可以通过添加一个库(最初在PHP<7.2版本中使用)来避免此错误,如中所述,但不是直接在composer.json中,在.travis.yml文件中调用它:

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

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

我们必须下载libnail库的源代码,因为ubuntu14.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

默认情况下,PHP 7.2似乎没有argon2i密码哈希器,这是一个编译选项,但TravisCi在其PHP图像中不使用它,那么我们可以通过添加一个库(最初在PHP<7.2版本中使用)来避免此错误,该库如中所述,但不能直接在composer.json中使用,请在.travis.yml文件中调用它:

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

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

我们必须下载libnail库的源代码,因为ubuntu14.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

这确实是一个愚蠢的PHP丢球。幸运的是,有一个合理的解决方法——虽然libargon2在默认情况下没有编译(因为它在PHP所属的所有平台上都不可用),但libnaude是,尽管libnaude没有提供
密码\u ARGON2I
常量,但它有,它使用Argon2密码哈希算法的Argon2id变量,它比PHP 7.2 Argon2i更强大,但与它不兼容。您可以这样使用它:

$hash = sodium_crypto_pwhash_str(
    $password, 
    SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE,
    SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE
);
您可以使用via composer在PHP7.2之前的PHP版本中获得此函数


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

这确实是PHP的一个愚蠢的失误。幸运的是,有一个合理的解决方法——虽然libargon2在默认情况下没有编译(因为它在PHP所属的所有平台上都不可用),但libnaude是,尽管libnaude没有提供
密码\u ARGON2I
常量,但它有,它使用Argon2密码哈希算法的Argon2id变量,它比PHP 7.2 Argon2i更强大,但与它不兼容。您可以这样使用它:

$hash = sodium_crypto_pwhash_str(
    $password, 
    SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE,
    SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE
);
您可以使用via composer在PHP7.2之前的PHP版本中获得此函数


我认为,在Symfony中,透明回退是一个错失的机会——它最终无法以与PHP本身完全相同的方式提供实现,这对任何人都没有帮助。

是的,composer做了一个测试:
argon2ipswordEncoder::isSupported()
,但返回false。我同意你的看法,我知道Argon2i在PHP核心中。。。最后,我们需要用“-with-password-argon2”编译PHP来启用它。()是,编写器执行测试:
Argon2iPass