From: Jean Flach Date: Fri, 16 Feb 2018 09:31:00 +0000 (+0100) Subject: Code style X-Git-Tag: v2.9.0~155^2~3 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0a0795f09d1ccb3109f33394d4e580245b0096ba;p=icinga2 Code style --- diff --git a/lib/base/tlsutility.cpp b/lib/base/tlsutility.cpp index cb7a76f57..6ad0c5ad2 100644 --- a/lib/base/tlsutility.cpp +++ b/lib/base/tlsutility.cpp @@ -810,28 +810,34 @@ std::string to_string(const errinfo_openssl_error& e) return "[errinfo_openssl_error]" + tmp.str() + "\n"; } -bool ComparePassword(const String hash, const String password, const String salt) +bool ComparePassword(const String& hash, const String& password, const String& salt) { - String otherHash = HashPassword(password, salt); + String otherHash = PBKDF2_SHA256(password, salt, 1000); + VERIFY(otherHash.GetLength() == 64 && hash.GetLength() == 64); const char *p1 = otherHash.CStr(); const char *p2 = hash.CStr(); + /* By Novelocrat, https://stackoverflow.com/a/25374036 */ volatile char c = 0; - for (size_t i=0; i<64; ++i) + for (size_t i = 0; i < 64; ++i) c |= p1[i] ^ p2[i]; return (c == 0); } -String HashPassword(const String& password, const String& salt, const bool shadow) +/* Returns a String in the format $algorithm$salt$hash or returns an empty string in case of an error */ +String CreateHashedPasswordString(const String& password, const String& salt, int algorithm) { - if (shadow) - //Using /etc/shadow password format. The 5 means SHA256 is being used - return String("$5$" + salt + "$" + PBKDF2_SHA256(password, salt, 1000)); - else - return PBKDF2_SHA256(password, salt, 1000); + // We currently only support SHA256 + if (algorithm != 5) + return String(); + + if (salt.FindFirstOf('$') != String::NPos) + return String(); + + return String("$5$" + salt + "$" + PBKDF2_SHA256(password, salt, 1000)); } } diff --git a/lib/base/tlsutility.hpp b/lib/base/tlsutility.hpp index 3d7b29dbd..31bb4e466 100644 --- a/lib/base/tlsutility.hpp +++ b/lib/base/tlsutility.hpp @@ -56,8 +56,8 @@ String SHA1(const String& s, bool binary = false); String SHA256(const String& s); String RandomString(int length); bool VerifyCertificate(const std::shared_ptr& caCertificate, const std::shared_ptr& certificate); -bool ComparePassword(const String hash, const String password, const String Salt); -String HashPassword(const String& password, const String& salt, const bool shadow = false); +bool ComparePassword(const String& hash, const String& password, const String& Salt); +String CreateHashedPasswordString(const String& password, const String& salt, int algorithm = 5); class openssl_error : virtual public std::exception, virtual public boost::exception { }; diff --git a/lib/cli/apiusercommand.cpp b/lib/cli/apiusercommand.cpp index 6eb5c3bf3..188691ae0 100644 --- a/lib/cli/apiusercommand.cpp +++ b/lib/cli/apiusercommand.cpp @@ -44,7 +44,7 @@ void ApiUserCommand::InitParameters(boost::program_options::options_description& { visibleDesc.add_options() ("user", po::value(), "API username") - ("passwd", po::value(), "Password in clear text") + ("password", po::value(), "Password in clear text") ("salt", po::value(), "Optional salt (default: 8 random chars)") ("oneline", "Print only the password hash"); } @@ -63,8 +63,8 @@ int ApiUserCommand::Run(const boost::program_options::variables_map& vm, const s } else user = vm["user"].as(); - if (!vm.count("passwd")) { - Log(LogCritical, "cli", "Password (--passwd) must be specified."); + if (!vm.count("password")) { + Log(LogCritical, "cli", "Password (--password) must be specified."); return 1; } @@ -76,7 +76,11 @@ int ApiUserCommand::Run(const boost::program_options::variables_map& vm, const s return 1; } - String hashedPassword = HashPassword(passwd, salt, true); + String hashedPassword = CreateHashedPasswordString(passwd, salt, 5); + if (hashedPassword == String()) { + Log(LogCritical, "cli") << "Failed to hash password \"" << passwd << "\" with salt \"" << salt << "\""; + return 1; + } if (vm.count("oneline")) std::cout << '"' << hashedPassword << "\"\n"; diff --git a/lib/remote/apiuser.cpp b/lib/remote/apiuser.cpp index 0e92f9149..3fa025d83 100644 --- a/lib/remote/apiuser.cpp +++ b/lib/remote/apiuser.cpp @@ -30,8 +30,12 @@ void ApiUser::OnConfigLoaded(void) { ObjectImpl::OnConfigLoaded(); - if (this->GetPasswordHash().IsEmpty()) - SetPasswordHash(HashPassword(GetPassword(), RandomString(8), true)); + if (GetPasswordHash().IsEmpty()) { + String hashedPassword = CreateHashedPasswordString(GetPassword(), RandomString(8), 5); + VERIFY(hashedPassword != String()); + SetPasswordHash(hashedPassword); + SetPassword("********"); + } } ApiUser::Ptr ApiUser::GetByClientCN(const String& cn) diff --git a/test/remote-user.cpp b/test/remote-user.cpp index 1c327bacb..2979285b9 100644 --- a/test/remote-user.cpp +++ b/test/remote-user.cpp @@ -36,7 +36,7 @@ BOOST_AUTO_TEST_CASE(password) String passwd = RandomString(16); String salt = RandomString(8); user->SetPassword("ThisShouldBeIgnored"); - user->SetPasswordHash(HashPassword(passwd, salt, true)); + user->SetPasswordHash(CreateHashedPasswordString(passwd, salt, true)); BOOST_CHECK(user->GetPasswordHash() != passwd);