return "[errinfo_openssl_error]" + tmp.str() + "\n";
}
+bool ComparePassword(const String hash, const String password, const String salt)
+{
+ String otherHash = HashPassword(password, salt);
+
+ const char *p1 = otherHash.CStr();
+ const char *p2 = hash.CStr();
+
+ volatile char c = 0;
+
+ 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)
+{
+ 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);
+}
+
}
String SHA256(const String& s);
String RandomString(int length);
bool VerifyCertificate(const std::shared_ptr<X509>& caCertificate, const std::shared_ptr<X509>& certificate);
+bool ComparePassword(const String hash, const String password, const String Salt);
+String HashPassword(const String& password, const String& salt, const bool shadow = false);
class openssl_error : virtual public std::exception, virtual public boost::exception { };
String passwd = vm["passwd"].as<std::string>();
String salt = vm.count("salt") ? String(vm["salt"].as<std::string>()) : RandomString(8);
- String hashedPassword = ApiUser::CreateHashedPasswordString(passwd, salt, true);
+ String hashedPassword = HashPassword(passwd, salt, true);
std::cout
<< "object ApiUser \"" << user << "\" {\n"
ObjectImpl<ApiUser>::OnConfigLoaded();
if (this->GetPasswordHash().IsEmpty())
- SetPasswordHash(CreateHashedPasswordString(GetPassword(), RandomString(8), true));
+ SetPasswordHash(HashPassword(GetPassword(), RandomString(8), true));
}
ApiUser::Ptr ApiUser::GetByClientCN(const String& cn)
return nullptr;
}
-bool ApiUser::ComparePassword(String password) const
-{
- Dictionary::Ptr passwordDict = this->GetPasswordDict();
- String thisPassword = passwordDict->Get("password");
- String otherPassword = CreateHashedPasswordString(password, passwordDict->Get("salt"), false);
-
- const char *p1 = otherPassword.CStr();
- const char *p2 = thisPassword.CStr();
-
- volatile char c = 0;
-
- for (size_t i=0; i<64; ++i)
- c |= p1[i] ^ p2[i];
-
- return (c == 0);
-}
-
Dictionary::Ptr ApiUser::GetPasswordDict(void) const
{
String password = this->GetPasswordHash();
return passwordDict;
}
-
-String ApiUser::CreateHashedPasswordString(const String& password, const String& salt, const bool shadow)
-{
- 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);
-
-}
virtual void OnConfigLoaded(void) override;
static ApiUser::Ptr GetByClientCN(const String& cn);
- static String CreateHashedPasswordString(const String& password, const String& salt, const bool shadow = false);
Dictionary::Ptr GetPasswordDict(void) const;
- bool ComparePassword(String password) const;
};
}
#include "base/objectlock.hpp"
#include "base/utility.hpp"
#include "base/logger.hpp"
+#include "base/tlsutility.hpp"
#include "base/exception.hpp"
#include "base/convert.hpp"
#include <boost/thread/once.hpp>
user = ApiUser::GetByName(username);
/* Deny authentication if 1) given password is empty 2) configured password does not match. */
- if (password.IsEmpty() || !user || !user->ComparePassword(password))
+ if (!user || password.IsEmpty())
user.reset();
+ else {
+ Dictionary::Ptr passwordDict = user->GetPasswordDict();
+ if (!ComparePassword(passwordDict->Get("password"), password, passwordDict->Get("salt")))
+ user.reset();
+ }
}
String requestUrl = request.RequestUrl->Format();
String passwd = RandomString(16);
String salt = RandomString(8);
user->SetPassword("ThisShouldBeIgnored");
- user->SetPasswordHash(ApiUser::CreateHashedPasswordString(passwd, salt, true));
+ user->SetPasswordHash(HashPassword(passwd, salt, true));
BOOST_CHECK(user->GetPasswordHash() != passwd);
BOOST_CHECK(passwdd);
BOOST_CHECK(passwdd->Get("salt") == salt);
- BOOST_CHECK(user->ComparePassword(passwd));
- BOOST_CHECK(!user->ComparePassword("wrong password uwu!"));
+ BOOST_CHECK(ComparePassword(passwdd->Get("password"), passwd, salt));
+ BOOST_CHECK(!ComparePassword(passwdd->Get("password"), "wrong password uwu!", salt));
#endif
}