[Langage C] Comment utiliser la fonction crypt sous Linux [Hachage de mot de passe]

0. Introduction

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).

1. fonction crypt ()

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.)

1.1 Exemple d'utilisation de la fonction crypt ()

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.

2. fonction crypt_r ()

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.

Définition de la structure crypt_data struct crypt_data { char keysched[16 * 8]; char sb0[32768]; char sb1[32768]; char sb2[32768]; char sb3[32768]; char crypt_3_buf[14]; char current_salt[2]; long int current_saltbits; int direction, initialized; };

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.

2.1. Exemple d'utilisation de la fonction crypt_r ()

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.

2.2. À propos de \ _GNU \ _SOURCE

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.

ou La définition de macro peut également être effectuée à partir de la ligne de commande, vous pouvez donc le faire ici. Vous pouvez passer l'option `-D [= valeur]` au moment de la compilation. Par exemple, passer l'option -DN = 2 au moment de la compilation a la même signification que d'écrire «#define N 2» dans le code source. Dans ce cas, au lieu d'écrire `#define _GNU_SOURCE` au début du code source, vous pouvez ajouter l'option -D_GNU_SOURCE` au moment de la compilation. Si vous utilisez Makefile, cela peut être très bien.

3. À propos du sel

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.

3.1.ID de sel et algorithme de hachage

--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.

4. À la fin

N'oubliez pas l'option ** -lcrypt ** lors de la compilation.

Veuillez signaler toute erreur.

5. Référence

https://linuxjm.osdn.jp/html/LDP_man-pages/man3/crypt.3.html https://blog.amedama.jp/entry/unix-crypt-3

Recommended Posts

[Langage C] Comment utiliser la fonction crypt sous Linux [Hachage de mot de passe]
Comment utiliser le contrôleur audio C216 sur Arch Linux
Comment utiliser la fonction zip
[Linux] Comment utiliser la commande echo
Comment utiliser la bibliothèque C en Python
(Rappelez-vous rapidement) Comment utiliser la ligne de commande LINUX
[Astuces] Comment utiliser l'iPhone comme caméra Web sous Linux
Comment utiliser le décorateur
Comment limiter la publication de l'API dans la bibliothèque partagée en langage C de Linux
Comment utiliser GitHub sur un serveur multi-personnes sans mot de passe
[Hyperledger Iroha] Remarques sur l'utilisation du SDK Python
Ajouter un utilisateur Linux, comment utiliser la commande useradd (spécifier le mot de passe)
Remarques sur l'utilisation de la guimauve dans la bibliothèque de schémas
[Linux] [C / C ++] Comment obtenir la valeur d'adresse de retour d'une fonction et le nom de fonction de l'appelant
Comment utiliser le module optparse
Comment utiliser Dataiku sous Windows
Remarques sur l'utilisation de pywinauto
Comment installer VMware-Tools sur Linux
Comment utiliser l'homebrew dans Debian
Comment utiliser lentement le langage informatique 2
Comment utiliser la fonction zip de python
Comment utiliser lentement le langage informatique
Comment utiliser le module ConfigParser
[Python] Explique comment utiliser la fonction format avec un exemple
Comment utiliser la fonction de rendu définie dans .mako (.html) directement dans mako
Comment utiliser le pipeline Spark ML
Comment installer aws-session-manager-plugin sur Manajro Linux
Comment utiliser mecab, neologd-ipadic sur colab
Comment utiliser Google Test en langage C
[python] Comment utiliser __command__, explication des fonctions
Je veux utiliser Linux sur mac
Comment mettre à jour PHP sur Amazon Linux 2
Comment utiliser l'Assistant Google sur Windows 10
Comment afficher des pictogrammes sur Manjaro Linux
Mémorandum sur l'utilisation du python gremlin
Comment faire fonctionner Linux depuis la console
Comment mettre à jour la sécurité sur CentOS Linux 8
Comment utiliser le débogueur IPython (ipdb)
Comment trouver des fichiers volumineux sous Linux
De l'introduction de l'API GoogleCloudPlatform Natural Language à son utilisation
[Python] Explique comment utiliser la fonction range avec un exemple concret
[Python] Comment utiliser la fonction enumerate (extraire le numéro d'index et l'élément)
Comment utiliser MkDocs pour la première fois
Comment utiliser Python Kivy ④ ~ Exécution sur Android ~
Comment utiliser la bibliothèque de dessins graphiques Bokeh
Comment utiliser l'API Google Cloud Translation
Comment utiliser l'API du guide des programmes NHK
[Algorithm x Python] Comment utiliser la liste
[Python] Comment utiliser la fonction de hachage et taple.
Comment installer Camunda Modeler sur Manjaro Linux
Sous Linux (Ubuntu), réglez le Trackpad et réglez la fonction sur un balayage à trois doigts
Je souhaite utiliser la fonction d'activation Mish
linux / c> lien> Obtenir le résultat de l'exécution de la commande shell dans le programme C> On m'a appris à utiliser popen ()
Comment afficher la date de modification d'un fichier en langage C jusqu'à nanosecondes
Réfléchissez à la programmation de Python sur votre iPad
Débutants! Commandes et utilisation de base de Linux!