From ca088528a7329e6a2f8d97760a04b2fdaa885f10 Mon Sep 17 00:00:00 2001 From: Eshan Ahmed Neog Date: Fri, 11 Apr 2025 23:09:18 +0530 Subject: [PATCH] Fix: Secure password storage using bcrypt hashing (Fixes #9) --- ComplaintBox.cpp | 28 +++++++++++++++++++++------- include/bcrypt/BCrypt.hpp | 32 ++++++++++++++++++++++++++++++++ lib/bcrypt.lib | Bin 0 -> 95730 bytes 3 files changed, 53 insertions(+), 7 deletions(-) create mode 100644 include/bcrypt/BCrypt.hpp create mode 100644 lib/bcrypt.lib diff --git a/ComplaintBox.cpp b/ComplaintBox.cpp index 6abd894..446f019 100644 --- a/ComplaintBox.cpp +++ b/ComplaintBox.cpp @@ -1,4 +1,5 @@ #include "ComplaintBox.h" +#include "bcrypt/BCrypt.hpp" #include #include #include @@ -50,8 +51,13 @@ void ComplaintBox::registerUser(bool isAdmin) { cout << PURPLE << "Enter password: " << RESET; cin >> pass; + // Hashing the password using bcrypt + string hashedPassword = BCrypt::generateHash(pass); + string table = isAdmin ? "adminusers" : "users"; - string sql = "INSERT INTO " + table + " (username, password) VALUES ('" + uname + "', '" + pass + "');"; + string sql = "INSERT INTO " + table + " (username, password) VALUES ('" + uname + "', '" + hashedPassword + "');"; + + if (sqlite3_exec(db, sql.c_str(), 0, 0, &errMsg) != SQLITE_OK) { cout << RED << "Error: " << errMsg << RESET << endl; @@ -69,13 +75,21 @@ bool ComplaintBox::loginUser(bool isAdmin) { cin >> pass; string table = isAdmin ? "adminusers" : "users"; - string sql = "SELECT * FROM " + table + " WHERE username = '" + uname + "' AND password = '" + pass + "';"; - bool success = false; + string sql = "SELECT password FROM " + table + " WHERE username = '" + uname + "';"; + string storedHash; + bool found = false; + + sqlite3_exec(db, sql.c_str(), [](void *data, int argc, char **argv, char **) -> int { + if (argc > 0 && argv[0]) { + *((string*)data) = argv[0]; + return 0; + } + return 1; + }, &storedHash, &errMsg); + + // Validating password using bcrypt + bool success = BCrypt::validatePassword(pass, storedHash); - sqlite3_exec(db, sql.c_str(), [](void *successPtr, int, char **, char **) -> int { - *(bool*)successPtr = true; - return 0; - }, &success, &errMsg); if (success) { cout << GREEN << "Login successful!\n" << RESET; diff --git a/include/bcrypt/BCrypt.hpp b/include/bcrypt/BCrypt.hpp new file mode 100644 index 0000000..07e5c53 --- /dev/null +++ b/include/bcrypt/BCrypt.hpp @@ -0,0 +1,32 @@ +#ifndef __BCRYPT__ +#define __BCRYPT__ + +#ifdef _WIN32 +#include "winbcrypt.h" +#else + +#include "bcrypt.h" +#include +#include + +class BCrypt { +public: + static std::string generateHash(const std::string & password, int workload = 12){ + char salt[BCRYPT_HASHSIZE]; + char hash[BCRYPT_HASHSIZE]; + int ret; + ret = bcrypt_gensalt(workload, salt); + if(ret != 0)throw std::runtime_error{"bcrypt: can not generate salt"}; + ret = bcrypt_hashpw(password.c_str(), salt, hash); + if(ret != 0)throw std::runtime_error{"bcrypt: can not generate hash"}; + return std::string{hash}; + } + + static bool validatePassword(const std::string & password, const std::string & hash){ + return (bcrypt_checkpw(password.c_str(), hash.c_str()) == 0); + } +}; + +#endif + +#endif // __BCRYPT__ diff --git a/lib/bcrypt.lib b/lib/bcrypt.lib new file mode 100644 index 0000000000000000000000000000000000000000..43b2186e753da79f55fd5a785932609a36fea4b5 GIT binary patch literal 95730 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 literal 0 HcmV?d00001