Use a função crypt em C
-
Use a função
crypt
para fazer o hash de frases secretas para armazenamento -
Use rotinas estritas de tratamento de erros para garantir a execução bem-sucedida das funções
crypt
Este artigo irá explicar vários métodos de como usar a função crypt
em C.
Use a função crypt
para fazer o hash de frases secretas para armazenamento
crypt
é na verdade uma família de quatro funções que fornecem os métodos de hash de frase-senha para armazenamento no sistema ou autenticação. Observe que essas funções não são adequadas para hashing criptográfico de uso geral, já que o hashing de frase secreta precisa ser caro do ponto de vista computacional em comparação com os de uso geral projetados para ser rápidos e usar menos poder de processamento.
crypt
recebe dois argumentos char*
passados como parâmetros qualificados const
. O primeiro argumento aponta para a senha que precisa ser hash, e o segundo é a string especial chamada setting
, que deve ser gerada usando a função crypt_gensalt
. O argumento setting
fornece vários parâmetros para a função crypt
, como qual algoritmo de hash usar, o custo computacional do hash (o maior valor corresponde ao mais caro) e bytes de sal aleatórios. Observe que os bytes para salt devem ser criptograficamente aleatórios e podem ser obtidos separadamente dos utilitários de geração de números aleatórios específicos do sistema. O exemplo a seguir demonstra o caso em que o valor especial - ponteiro nulo é passado para crypt_gensalt
como o terceiro parâmetro para indicar a recuperação automática de bytes aleatórios.
Existem vários algoritmos hash disponíveis (totalmente detalhados nesta página), e eles são passados como identificadores de string exclusivos para a função crypt_gensalt
. Uma vez que crypt_gensalt
retorne a string setting
, ela pode ser passada para a função crypt
junto com a frase-senha, e o valor de retorno será a frase-senha hash que é um texto ASCII imprimível. Usamos o algoritmo bcrypt
identificado como cadeia de prefixo "$2b$"
no próximo código de amostra. Observe que o segundo argumento da função crypt_gensalt
especifica quão cara a geração de hash deve ser com o valor 0
especificando o nível padrão do algoritmo fornecido. Nesse caso, especificamos 15
, que é o valor recomendado para o algoritmo de hash bcrypt
.
#include "crypt.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
enum { MAX_LEN = 1024 };
int main(int argc, char *argv[]) {
char *text, *encrypted, *salt;
size_t len;
long lnmax;
text = malloc(MAX_LEN);
printf("Input string to be hashed: ");
if (fgets(text, MAX_LEN, stdin) == NULL) exit(EXIT_FAILURE);
len = strlen(text);
if (text[len - 1] == '\n') text[len - 1] = '\0';
salt = crypt_gensalt("$2b$", 15, NULL, 0);
encrypted = crypt(text, salt);
printf("Encrypted: %s", encrypted);
free(text);
exit(EXIT_SUCCESS);
}
Resultado:
Input string to be hashed: hello there
Encrypted: $2b$15$DkpZq2vJRQoBiK4slxfFa.Eml8PUtFB7CYYH1RJH6XML3ujhX8fqy
Use rotinas estritas de tratamento de erros para garantir a execução bem-sucedida das funções crypt
O código do exemplo anterior pega a string de entrada do usuário e aloca memória dinâmica para armazená-la. Portanto, precisamos garantir que a string seja lida sem quaisquer caracteres restantes no buffer stdio
. Para isso, chamamos fflush
em stdout
e, em seguida, chamamos fgets
para obter a string de entrada do usuário. Além disso, verifique todas as funções da biblioteca e chamadas do sistema para seus valores de retorno de erro e chame perror
para gerar a mensagem correspondente.
#include "crypt.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
enum { MAX_LEN = 1024 };
int main(int argc, char *argv[]) {
char *text, *encrypted, *salt;
size_t len;
long lnmax;
text = malloc(MAX_LEN);
if (text == NULL) {
perror("malloc");
exit(EXIT_FAILURE);
}
printf("Input string to be hashed: ");
fflush(stdout);
if (fgets(text, MAX_LEN, stdin) == NULL) exit(EXIT_FAILURE);
len = strlen(text);
if (text[len - 1] == '\n') text[len - 1] = '\0';
salt = crypt_gensalt("$2b$", 15, NULL, 0);
if (salt == NULL) {
perror("crypt_gensalt");
exit(EXIT_FAILURE);
}
encrypted = crypt(text, salt);
if (encrypted == NULL) {
perror("crypt_gensalt");
exit(EXIT_FAILURE);
}
printf("Encrypted: %s", encrypted);
free(text);
exit(EXIT_SUCCESS);
}
Resultado:
Input string to be hashed: hello there
Encrypted: $2b$15$DkpZq2vJRQoBiK4slxfFa.Eml8PUtFB7CYYH1RJH6XML3ujhX8fqy
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook