Gerar senhas aleatórias é um dos exercícios iniciais para quem deseja avançar em segurança de sistemas. Nós já fizemos um artigo explicando como você pode gerar senhas, para mais detalhes leia a postagem completa: 23 Formas de Gerar e Guardar SENHAS FORTES; veja as explicações de comandos.
Nesse artigo conheceremos a lógica de gerar senhas com C++. Será um código simples usando somente senhas alfanuméricas, mas você pode melhorar adicionando caracteres especiais para tornar o código ainda mais completo.
Vamos ao passo a passo!
Nesse exemplo vamos organizar nosso código para caso quisermos adicionarmos futuramente para algum projeto, logo, criaremos um “header único”(só um arquivo: .hpp
), ou seja, a classe e a execução no mesmo arquivo:
vim genpass.hpp
#pragma once
#include <iostream>
#include <memory> // Opcional
class GenPass {};
Vamos agora adicionar 2 membros privados para usarmos na nossa função-membro, são eles:
std::string pass
- Que armazerará a string que será retornada para o objeto;const std::string charset
- A constante que possuirá os caracteres alfanuméricos, tanto com minúsculas como MAIÚSCULAS, além dos números;#pragma once
#include <iostream>
#include <memory>
class GenPass {
std::string pass;
const std::string charset = "abcdefghijklmnopqrstuvwxyz"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"0123456789";
};
Essa função-membro receberá como argumento o tamanho da senha, você poderia escolher um valor mínimo padrão, mas vou deixar possível qualquer tamanho, mas é bom lembrar que senhas fortes possuem no mínimo 8 caracteres!
charset
de forma aleatória;pass
o caractere até atingir o máximo informado no argumento;std::string gen_pass(int length){
this->pass.reserve(length);
srand(static_cast<unsigned int>(time(nullptr)));
for (int i = 0; i < length; ++i) {
this->pass += this->charset[
rand() % this->charset.length()
];
}
return pass;
}
genpass.hpp
finalAo final nosso arquivo completo ficará assim:
#pragma once
#include <iostream>
#include <memory>
class GenPass {
std::string pass;
const std::string charset = "abcdefghijklmnopqrstuvwxyz"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"0123456789";
public:
std::string gen_pass(int length){
this->pass.reserve(length);
srand(static_cast<unsigned int>(time(nullptr)));
for (int i = 0; i < length; ++i) {
this->pass += this->charset[
rand() % this->charset.length()
];
}
return pass;
}
};
Vamos criar um novo arquivo main.cpp
e incluiremos nosso genpass.hpp
, e chamaremos a função-membro gen_pass()
com a quantidade de caracteres que queremos que nossa senha possua, nesse exemplo: Gerando uma senha alfanumérica com 8 caracteres!
#include "genpass.hpp"
int main(){
auto g = std::make_unique<GenPass>();
std::cout << g->gen_pass(8) << '\n';
return 0;
}
Compile e rode:
g++ main.cpp && ./a.out
. Provável e similar saída:
skkb8Bms
Se quiser gerar com: 16, 32, 64 e 128 caracteres, respectivamente:
std::cout << g->gen_pass(16) << '\n';
std::cout << g->gen_pass(32) << '\n';
std::cout << g->gen_pass(64) << '\n';
std::cout << g->gen_pass(128) << '\n';
Simples e fácil, né?! Agora você já pode usar esse header único e adicionar aos seus projetos!