J'ai la chance de l'utiliser et de résumer ce que j'ai étudié. Il semble qu'il utilise les fonctions de Linux, donc les personnes qui l'ont utilisé dans d'autres langues pourront probablement l'utiliser de la même manière.
<détails> <résumé> Mon environnement de test </ résumé> Ubuntu 18.04.3 LTS Compilateur gcc 7.4.0
Il existe deux fonctions, la fonction crypt () et la fonction crypt_r (), mais la fonction crypt \ _r () est la version réentrante de la fonction crypt (). Autrement dit, la fonction crypt () n'est pas sécurisée multithread, tandis que la fonction crypt_r () est sécurisée multithread. J'expliquerai chacune des deux fonctions après avoir donné des exemples d'utilisation.
** Remarque: ** Les spécifications de la fonction crypt diffèrent selon le système d'exploitation, donc si vous voulez connaître le contenu exact, lisez le manuel en utilisant la commande man 3 crypt
.
Le contenu suivant est pour GNU / Linux (Ubuntu 18.0.4).
La déclaration du prototype est la suivante.
char *crypt(const char *key, const char *salt);
key est la chaîne que vous souhaitez hacher,
salt est une chaîne de caractères utilisée pour le hachage.
La valeur de retour est Clé hachée, si l'ID n'est pas spécifié Si id est spécifié, (chaîne de sel) + "$" + (clé hachée). (L'identifiant sera décrit plus tard.)
crypt_test.c
#include<crypt.h>
#include<stdio.h>
#include<string.h>
#define BUFSIZE 1024
int main(void){
char key[BUFSIZE] = "key"; //La chaîne que vous souhaitez hacher
char salt_origin[BUFSIZE] = "example"; //Fil de sel
char salt[BUFSIZE];
char encrypted[BUFSIZE]; //Pour stocker les résultats
sprintf(salt, "$6$%s", salt_origin); //Mise en forme du sel, spécification d'identifiant (décrite plus loin)
strcpy(encrypted, crypt(key, salt)); //La variable chiffrée
//Chaîne"$6$example$(Clé hachée)"Est stocké
printf("%s\n", encrypted);
}
Ajoutez l'option -lcrypt lors de la compilation.
La déclaration du prototype est la suivante.
char *crypt_r(const char *key, const char *salt, struct crypt_data *data);
La structure crypt_data est définie dans le fichier d'en-tête crypt.h et est utilisée pour stocker les résultats de hachage.
Les variables de la structure crypt_data doivent avoir leurs variables membres initialisées définies sur 0 avant de passer la variable de structure lors de la première utilisation de la fonction crypt_r (). Les clés après le hachage sont stockées dans la variable membre keyched.
crypt_r_test.c
#define _GNU_SOURCE // crypt_r()Pour utiliser la fonction, utilisez cette définition de macro
//Doit être répertorié avant tout fichier inclus
#include<crypt.h>
#include<stdio.h>
#define BUFSIZE 1024
int main(void){
char key[BUFSIZE] = "key"; //La chaîne que vous souhaitez hacher
char salt_origin[BUFSIZE] = "example"; //Sel.
char salt[BUFSIZE];
struct crypt_data data; //Structure requise pour stocker les résultats de hachage
data.initialized = 0; // crypt_r()Doit être fait avant d'utiliser la fonction.
sprintf(salt, "$5$%s", salt_origin); //spécification d'identifiant((Voir ci-dessous)
crypt_r(key, salt, &data);
printf("%s\n", data.keysched); //La variable membre keyched
//Chaîne"$5$example$(Clé hachée)"Est stocké
}
Ajoutez l'option -lcrypt lors de la compilation.
Pour utiliser la fonction crypt_r (), la définition de macro #define _GNU_SOURCE
doit être ** faite ** avant d'inclure un fichier d'en-tête.
Il est prudent de l'écrire au début du code source.
Lorsque vous utilisez un fichier d'en-tête que vous avez défini vous-même, vous pouvez l'écrire immédiatement après la garde d'inclusion.
Les caractères spécifiables sont [a-zA-Z0-9./]. Alphabets inférieurs, alphabets supérieurs, nombres, "." Et "/".
En ajustant le format du sel passé à la fonction crypt, vous pouvez ** spécifier l'algorithme de hachage **.
Faites du sel comme $ (id) $ (chaîne de sel) $
.
id est un nombre pour spécifier l'algorithme de hachage. (L'algorithme de hachage sera décrit plus tard)
(À propos, la marque $ à la fin de la chaîne de sel peut être omise.)
Exemple. Salt =" $ 5 $ exemple ";
Dans cet exemple, l'algorithme de hachage est spécifié par SHA-256 et "exemple" est spécifié comme chaîne de caractères salt.
Si seule une chaîne de caractères est transmise sans spécifier d'identifiant, elle sera hachée par la méthode DES.
--Table de correspondance entre l'id et l'algorithme de hachage
id | Algorithme de hachage |
---|---|
1 | MD5 |
2a | Blowfish(Il peut ne pas être disponible selon le système d'exploitation) |
5 | SHA-256 |
6 | SHA-512 |
S'il n'est pas spécifié, ce sera DES. DES utilise seulement 2 caractères pour Salt et ne reconnaît que 8 caractères pour les mots de passe, il est donc très vulnérable et son utilisation n'est pas recommandée.
--Nombre de caractères dans la chaîne hachée
Algorithme de hachage | Nombre de caractères dans la chaîne hachée |
---|---|
MD5 | 22 caractères |
SHA-256 | 43 caractères |
SHA-512 | 86 caractères |
--Nombre de caractères dans le sel DES: fixé à 2 caractères (seuls les 2 premiers caractères de la chaîne de sel sont vus, les caractères suivants sont ignorés) MD5: jusqu'à 8 caractères (voir uniquement les 8 premiers caractères de la chaîne de sel, les caractères suivants sont ignorés)
À propos de la sécurité de l'algorithme de hachage DES<MD5<SHA-256<SHA-512 Et, plus le numéro d'identification est grand, plus la sécurité est élevée.
N'oubliez pas l'option ** -lcrypt ** lors de la compilation.
Veuillez signaler toute erreur.
https://linuxjm.osdn.jp/html/LDP_man-pages/man3/crypt.3.html https://blog.amedama.jp/entry/unix-crypt-3
Recommended Posts