我的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
有人有想法吗?
答案 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本身完全相同的方式提供实现,这对任何人都没有帮助。