C++ Random Password Generator
Clash Royale CLAN TAG#URR8PPP
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty margin-bottom:0;
up vote
7
down vote
favorite
I've created this C++ random password generator. You can set length, you can enable custom symbols. Then I went to this website: http://www.passwordmeter.com/ and started checking some generated passwords of mine.
Based on the formula here, I've created a simplified version of their grading system, and also created a function for it. Now I can just do password_score(generated_password)
and set a limit for the security of my password.
Here are some examples and how my program performs:
###
Generated password strength: 100/100
Password has been copied to clipboard!
### 1a,pA!T0c0&7 (PasswordMeter score: 100%)
###
Generated password strength: 100/100
Password has been copied to clipboard!
### 82F^Vh11Gl}1 (PasswordMeter score: 100%)
###
Generated password strength: 98/100
Password has been copied to clipboard!
### !3V44'w1 (PasswordMeter score: 100%)
###
Generated password strength: 64/100
Password has been copied to clipboard!
### $]1V9q (PasswordMeter score: 70%)
Am I doing it right? I know that there's always some room for improvement. I'll take any advice to make it better. Thanks!
string password_generator(const int length_of_password = 12, bool enable_symbols = false, bool copy_to_clipboard = false)
vector<char> password;
srand (static_cast<unsigned int>(time(nullptr)));
//generates lowercase letters
for(auto c = 1; c <= length_of_password; c = c + 4)
const auto v1 = rand() % 26;
password.push_back(v1 + 'a');
//generates uppercase letters
for(auto g = 3; g <= length_of_password; g = g + 4)
const auto v2 = rand() % 26;
password.push_back(v2 + 'A');
//generates numbers
for(auto k = 0; k <= length_of_password; k = k + 2)
const auto v3 = rand() % 10;
password.push_back(v3 + '0');
if(enable_symbols)
//generates symbols
for(auto g = 1; g <= length_of_password; g = g + 4)
const auto choice = rand() % 3;
if(choice == 0)
const auto v4 = rand() % 14;
password.push_back(v4 + '!');
if(choice == 1)
const auto v5 = rand() % 5;
password.push_back(v5 + '[');
if(choice == 2)
const auto v6 = rand() % 4;
password.push_back(v6 + '');
random_device r;
shuffle(password.begin(), password.end(), default_random_engine(r()));
string returning_password;
for(auto i = 0; i < length_of_password; i++)
returning_password.push_back(password[i]);
if(copy_to_clipboard)
to_clipboard(returning_password);
return returning_password;
Edit:
Here's a main file: (I've just started learning to work with argvs to there might be some mistakes.) (Most of the functions in this program are something I've created -made easier-, they're custom. I strongly recommend checking bottom GitHub link first.)
#include <duman.h>
using namespace std;
int main(const int argc, char* argv)
cerr << "###n";
if(argc > 1 && argc <= 2)
string(argv[1]) == "-l")
cerr << "Try to use the command as:n";
cerr << get_file_name(argv[0]) << " -8 -98 # for a password that has length of 8 and security score of minimum 98n";
cerr << "###n";
return 2;
if(argc > 2 && argc <= 3)
string(argv[2]).empty())
cerr << "Missing parameters! Use -h to see how to use this program!n";
cerr << "###n";
return 1;
raw_argument1.erase(raw_argument1.begin());
raw_argument2.erase(raw_argument2.begin());
const auto first_argument = stoi(raw_argument1);
const auto second_argument = stoi(raw_argument2);
auto seconds_since_start = 0;
const auto start = time(nullptr);
auto generated_password = password_generator(first_argument, true, true);
while(password_score(generated_password) < second_argument)
if(password_score(generated_password) >= second_argument)
break;
generated_password = password_generator(first_argument, true, true);
seconds_since_start += static_cast<int>(difftime(time(nullptr), start));
if(seconds_since_start > 50)
cerr << "Request timed out. Couldn't generate a password with the given parameters.n";
cerr << "###n";
return 1;
cerr << "Generated password strength: " << password_score(generated_password) << "/100n";
cerr << "Password has been copied to clipboard!n";
cerr << "###n";
return 0;
if(argc > 3)
cerr << "Unsupported number of parameters!n";
return 1;
cerr << "Commands:n";
cerr << "1. " << get_file_name(argv[0]) << " -length -security_level # Security level is XYZ out of 100n";
cerr << "2. " << get_file_name(argv[0]) << " -hn";
cerr << "3. " << get_file_name(argv[0]) << " -vn";
cerr << "###n";
duman.h
is a header file I've created for myself. So, whenever I solve a problem in someway I turn it into a function and save it in that header. You can reach it here: https://github.com/tkduman/duman.h
As I've written in readme, the solutions inside of that file are not the greatest. Pardon for my mistakes already.
c++ security
c++ security
c++ security
c++ security
edited Jan 5 at 16:27
asked Jan 5 at 16:09
TuÃÂberk Kaan Duman
1384
1384
add a comment |Â
1
Would you please be so kind to extend your code to a compilable and runnable program? You're lacking a lot of things, e.g. includes, amain
-function etc.
â Ben Steffan
Jan 5 at 16:19
@BenSteffan sorry, I'm new here. In stackoverflow if I post long code people get mad. Alright will fix it now.
â TuÃÂberk Kaan Duman
Jan 5 at 16:20
I believe, it's fixed now.
â TuÃÂberk Kaan Duman
Jan 5 at 16:27
1
1
Would you please be so kind to extend your code to a compilable and runnable program? You're lacking a lot of things, e.g. includes, a
main
-function etc.â Ben Steffan
Jan 5 at 16:19
Would you please be so kind to extend your code to a compilable and runnable program? You're lacking a lot of things, e.g. includes, a
main
-function etc.â Ben Steffan
Jan 5 at 16:19
@BenSteffan sorry, I'm new here. In stackoverflow if I post long code people get mad. Alright will fix it now.
â TuÃÂberk Kaan Duman
Jan 5 at 16:20
@BenSteffan sorry, I'm new here. In stackoverflow if I post long code people get mad. Alright will fix it now.
â TuÃÂberk Kaan Duman
Jan 5 at 16:20
I believe, it's fixed now.
â TuÃÂberk Kaan Duman
Jan 5 at 16:27
I believe, it's fixed now.
â TuÃÂberk Kaan Duman
Jan 5 at 16:27
add a comment |Â
1 Answer
1
active
oldest
votes
up vote
2
down vote
accepted
Advice 1
The most important issue with your password generator function is the fact that you keep creating the character vector over and over again. I suggest you roll a class that has that character vector as a field and construct it only once:
class password_generator
public:
password_generator()
... // Construct your alphabet.
private:
std::vector<char> m_alphabet;
;
Advice 2
if(choice == 0)
...
if(choice == 1)
...
Just use switch
here:
switch (rand() % 2)
case 0:
...
case 1:
...
case 2:
...
Advice 3
#include "stdafx.h"
: In the build settings of Visual Studio, search something like "Use precompiled headers"; set to No
. This will remove the need for including that header file.
Advice 4
#include <duman.h>
: this won't compile on Xcode. The convention is that you use <header>
for standard C++ library headers, and "header.h"
for your own header files.
Advice 5
using namespace std;
This one is a poor practice since it abuses your scope with bunch of identifiers/type names. Use instead:
#include "funky.hpp"
using funky::person;
using funky::darth_vader;
Advice 6
In your main
driver you output to cerr
. This is not what is expected of a command line program. *nix like OS'es has two "handles" one for standard output and one for standard error stream. Your conventional *nix guru will expect normal output to cout
and only error stuff to cerr
.
1. Great suggestion! Will do now. 2. Is it better performance wise? 3. That thing was annoying thanks. 4. Oh... didn't know that. I just put the file inside INCLUDE folders of Visual Studio and using it from there. 5. Well... alright. 6. I thought since cerr doesn't have any buffers it could give faster output. Obviously cout is there to "out"put.
â TuÃÂberk Kaan Duman
Jan 5 at 20:36
@TuÃÂberkKaanDuman 2.: Most definitely. When there is a match, other two values will not be tested. Also, I believe that for very largeswitch
statement, the compiler may perform binary search over case values.
â coderodde
Jan 5 at 20:53
add a comment |Â
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
2
down vote
accepted
Advice 1
The most important issue with your password generator function is the fact that you keep creating the character vector over and over again. I suggest you roll a class that has that character vector as a field and construct it only once:
class password_generator
public:
password_generator()
... // Construct your alphabet.
private:
std::vector<char> m_alphabet;
;
Advice 2
if(choice == 0)
...
if(choice == 1)
...
Just use switch
here:
switch (rand() % 2)
case 0:
...
case 1:
...
case 2:
...
Advice 3
#include "stdafx.h"
: In the build settings of Visual Studio, search something like "Use precompiled headers"; set to No
. This will remove the need for including that header file.
Advice 4
#include <duman.h>
: this won't compile on Xcode. The convention is that you use <header>
for standard C++ library headers, and "header.h"
for your own header files.
Advice 5
using namespace std;
This one is a poor practice since it abuses your scope with bunch of identifiers/type names. Use instead:
#include "funky.hpp"
using funky::person;
using funky::darth_vader;
Advice 6
In your main
driver you output to cerr
. This is not what is expected of a command line program. *nix like OS'es has two "handles" one for standard output and one for standard error stream. Your conventional *nix guru will expect normal output to cout
and only error stuff to cerr
.
1. Great suggestion! Will do now. 2. Is it better performance wise? 3. That thing was annoying thanks. 4. Oh... didn't know that. I just put the file inside INCLUDE folders of Visual Studio and using it from there. 5. Well... alright. 6. I thought since cerr doesn't have any buffers it could give faster output. Obviously cout is there to "out"put.
â TuÃÂberk Kaan Duman
Jan 5 at 20:36
@TuÃÂberkKaanDuman 2.: Most definitely. When there is a match, other two values will not be tested. Also, I believe that for very largeswitch
statement, the compiler may perform binary search over case values.
â coderodde
Jan 5 at 20:53
add a comment |Â
up vote
2
down vote
accepted
Advice 1
The most important issue with your password generator function is the fact that you keep creating the character vector over and over again. I suggest you roll a class that has that character vector as a field and construct it only once:
class password_generator
public:
password_generator()
... // Construct your alphabet.
private:
std::vector<char> m_alphabet;
;
Advice 2
if(choice == 0)
...
if(choice == 1)
...
Just use switch
here:
switch (rand() % 2)
case 0:
...
case 1:
...
case 2:
...
Advice 3
#include "stdafx.h"
: In the build settings of Visual Studio, search something like "Use precompiled headers"; set to No
. This will remove the need for including that header file.
Advice 4
#include <duman.h>
: this won't compile on Xcode. The convention is that you use <header>
for standard C++ library headers, and "header.h"
for your own header files.
Advice 5
using namespace std;
This one is a poor practice since it abuses your scope with bunch of identifiers/type names. Use instead:
#include "funky.hpp"
using funky::person;
using funky::darth_vader;
Advice 6
In your main
driver you output to cerr
. This is not what is expected of a command line program. *nix like OS'es has two "handles" one for standard output and one for standard error stream. Your conventional *nix guru will expect normal output to cout
and only error stuff to cerr
.
1. Great suggestion! Will do now. 2. Is it better performance wise? 3. That thing was annoying thanks. 4. Oh... didn't know that. I just put the file inside INCLUDE folders of Visual Studio and using it from there. 5. Well... alright. 6. I thought since cerr doesn't have any buffers it could give faster output. Obviously cout is there to "out"put.
â TuÃÂberk Kaan Duman
Jan 5 at 20:36
@TuÃÂberkKaanDuman 2.: Most definitely. When there is a match, other two values will not be tested. Also, I believe that for very largeswitch
statement, the compiler may perform binary search over case values.
â coderodde
Jan 5 at 20:53
add a comment |Â
up vote
2
down vote
accepted
up vote
2
down vote
accepted
Advice 1
The most important issue with your password generator function is the fact that you keep creating the character vector over and over again. I suggest you roll a class that has that character vector as a field and construct it only once:
class password_generator
public:
password_generator()
... // Construct your alphabet.
private:
std::vector<char> m_alphabet;
;
Advice 2
if(choice == 0)
...
if(choice == 1)
...
Just use switch
here:
switch (rand() % 2)
case 0:
...
case 1:
...
case 2:
...
Advice 3
#include "stdafx.h"
: In the build settings of Visual Studio, search something like "Use precompiled headers"; set to No
. This will remove the need for including that header file.
Advice 4
#include <duman.h>
: this won't compile on Xcode. The convention is that you use <header>
for standard C++ library headers, and "header.h"
for your own header files.
Advice 5
using namespace std;
This one is a poor practice since it abuses your scope with bunch of identifiers/type names. Use instead:
#include "funky.hpp"
using funky::person;
using funky::darth_vader;
Advice 6
In your main
driver you output to cerr
. This is not what is expected of a command line program. *nix like OS'es has two "handles" one for standard output and one for standard error stream. Your conventional *nix guru will expect normal output to cout
and only error stuff to cerr
.
Advice 1
The most important issue with your password generator function is the fact that you keep creating the character vector over and over again. I suggest you roll a class that has that character vector as a field and construct it only once:
class password_generator
public:
password_generator()
... // Construct your alphabet.
private:
std::vector<char> m_alphabet;
;
Advice 2
if(choice == 0)
...
if(choice == 1)
...
Just use switch
here:
switch (rand() % 2)
case 0:
...
case 1:
...
case 2:
...
Advice 3
#include "stdafx.h"
: In the build settings of Visual Studio, search something like "Use precompiled headers"; set to No
. This will remove the need for including that header file.
Advice 4
#include <duman.h>
: this won't compile on Xcode. The convention is that you use <header>
for standard C++ library headers, and "header.h"
for your own header files.
Advice 5
using namespace std;
This one is a poor practice since it abuses your scope with bunch of identifiers/type names. Use instead:
#include "funky.hpp"
using funky::person;
using funky::darth_vader;
Advice 6
In your main
driver you output to cerr
. This is not what is expected of a command line program. *nix like OS'es has two "handles" one for standard output and one for standard error stream. Your conventional *nix guru will expect normal output to cout
and only error stuff to cerr
.
answered Jan 5 at 20:28
coderodde
15.5k533114
15.5k533114
1. Great suggestion! Will do now. 2. Is it better performance wise? 3. That thing was annoying thanks. 4. Oh... didn't know that. I just put the file inside INCLUDE folders of Visual Studio and using it from there. 5. Well... alright. 6. I thought since cerr doesn't have any buffers it could give faster output. Obviously cout is there to "out"put.
â TuÃÂberk Kaan Duman
Jan 5 at 20:36
@TuÃÂberkKaanDuman 2.: Most definitely. When there is a match, other two values will not be tested. Also, I believe that for very largeswitch
statement, the compiler may perform binary search over case values.
â coderodde
Jan 5 at 20:53
add a comment |Â
1. Great suggestion! Will do now. 2. Is it better performance wise? 3. That thing was annoying thanks. 4. Oh... didn't know that. I just put the file inside INCLUDE folders of Visual Studio and using it from there. 5. Well... alright. 6. I thought since cerr doesn't have any buffers it could give faster output. Obviously cout is there to "out"put.
â TuÃÂberk Kaan Duman
Jan 5 at 20:36
@TuÃÂberkKaanDuman 2.: Most definitely. When there is a match, other two values will not be tested. Also, I believe that for very largeswitch
statement, the compiler may perform binary search over case values.
â coderodde
Jan 5 at 20:53
1. Great suggestion! Will do now. 2. Is it better performance wise? 3. That thing was annoying thanks. 4. Oh... didn't know that. I just put the file inside INCLUDE folders of Visual Studio and using it from there. 5. Well... alright. 6. I thought since cerr doesn't have any buffers it could give faster output. Obviously cout is there to "out"put.
â TuÃÂberk Kaan Duman
Jan 5 at 20:36
1. Great suggestion! Will do now. 2. Is it better performance wise? 3. That thing was annoying thanks. 4. Oh... didn't know that. I just put the file inside INCLUDE folders of Visual Studio and using it from there. 5. Well... alright. 6. I thought since cerr doesn't have any buffers it could give faster output. Obviously cout is there to "out"put.
â TuÃÂberk Kaan Duman
Jan 5 at 20:36
@TuÃÂberkKaanDuman 2.: Most definitely. When there is a match, other two values will not be tested. Also, I believe that for very large
switch
statement, the compiler may perform binary search over case values.â coderodde
Jan 5 at 20:53
@TuÃÂberkKaanDuman 2.: Most definitely. When there is a match, other two values will not be tested. Also, I believe that for very large
switch
statement, the compiler may perform binary search over case values.â coderodde
Jan 5 at 20:53
add a comment |Â
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f184374%2fc-random-password-generator%23new-answer', 'question_page');
);
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
1
Would you please be so kind to extend your code to a compilable and runnable program? You're lacking a lot of things, e.g. includes, a
main
-function etc.â Ben Steffan
Jan 5 at 16:19
@BenSteffan sorry, I'm new here. In stackoverflow if I post long code people get mad. Alright will fix it now.
â TuÃÂberk Kaan Duman
Jan 5 at 16:20
I believe, it's fixed now.
â TuÃÂberk Kaan Duman
Jan 5 at 16:27