Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions config/config.sample.php
Original file line number Diff line number Diff line change
Expand Up @@ -1421,6 +1421,38 @@
*/
'tempdirectory' => '/tmp/nextcloudtemp',

/**
* Hashing
*
* Nextcloud uses the Argon2 algorithm (available with PHP >= 7.2 if compiled
* with it) to create hashes by its own and exposes its configuration options as
* following. The default depends on the PHP build. More information can be
* found at: https://www.php.net/manual/en/function.password-hash.php
*/

/**
* The allowed maximum memory in KiB to be used by the algorithm for computing a
* hash. The smallest possible value is 8. Values that undershoot the minimum
* will be ignored in favor of the default.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shall we just add a big note here to only set this if you are on php7.2 or later?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not necessary – apart of using the constant. Code wouldn't pick Argon2 if it was not available. There are actually PHP 7.2 builds without Argon2, you cannot just rely on the version.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Then reword it differently. But setting those options if you don't have argon2 basically will do 💥 we just need to be sure nobody does that

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Then reword it differently.

Will do

ut setting those options if you don't have argon2 basically will do boom we just need to be sure nobody does that

no, nothing will happen when these options are set. Unless you mean the constants specifically. I take them all out.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I meant the constants.
I'm fine with leaving the constants in. Because they might change over time. And if people set them without argon2 support they will know soon enough. But we should just have a clear warning :)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Because they might change over time

They actually did already, afaik. But anyway, setting there the constants does not make sense anyway, as this is implicit. A URL is given to find more info and also that we rely on defaults. Should be sufficient.

*/
'hashingMemoryCost' => 65536,

/**
* The allowed maximum time in seconds that can be used by the algorithm for
* computing a hash. The value must be an integer, and the minimum value is 1.
* Values that undershoot the minimum will be ignored in favor of the default.
*/
'hashingTimeCost' => 4,

/**
* The allowed number of CPU threads that can be used by the algorithm for
* computing a hash. The value must be an integer, and the minimum value is 1.
* Rationally it does not help to provide a number higher than the available
* threads on the machine. Values that undershoot the minimum will be ignored
* in favor of the default.
*/
'hashingThreads' => 1,

/**
* The hashing cost used by hashes generated by Nextcloud
* Using a higher value requires more time and CPU power to calculate the hashes
Expand Down
14 changes: 14 additions & 0 deletions lib/private/Security/Hasher.php
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,20 @@ class Hasher implements IHasher {
public function __construct(IConfig $config) {
$this->config = $config;

if (\defined('PASSWORD_ARGON2I')) {
// password_hash fails, when the minimum values are undershot.
// In this case, ignore and revert to default
if ($this->config->getSystemValueInt('hashingMemoryCost', PASSWORD_ARGON2_DEFAULT_MEMORY_COST) >= 8) {
$this->options['memory_cost'] = $this->config->getSystemValueInt('hashingMemoryCost', PASSWORD_ARGON2_DEFAULT_MEMORY_COST);
}
if ($this->config->getSystemValueInt('hashingTimeCost', PASSWORD_ARGON2_DEFAULT_MEMORY_COST) >= 1) {
$this->options['time_cost'] = $this->config->getSystemValueInt('hashingTimeCost', PASSWORD_ARGON2_DEFAULT_TIME_COST);
}
if ($this->config->getSystemValueInt('hashingThreads', PASSWORD_ARGON2_DEFAULT_MEMORY_COST) >= 1) {
$this->options['threads'] = $this->config->getSystemValueInt('hashingThreads', PASSWORD_ARGON2_DEFAULT_THREADS);
}
}

$hashingCost = $this->config->getSystemValue('hashingCost', null);
if(!\is_null($hashingCost)) {
$this->options['cost'] = $hashingCost;
Expand Down