crypt(3)¸¦ ÀÌ¿äÇÑ ¾Ïȣȭ
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®
ÇöÀçÀ§Ä¡ : article>used_crypt



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.
¼Ò°³±Û¿¡¼­ ¹ßÇûµíÀÌ crypt ´Â ´Ü¹æÇâ ÇØ½¬ ÇÔ¼ö¸¦ »ç¿ëÇϹǷÎ, µ¥ÀÌŸ¸¦ º¹È£È­ Çϴ¹æ¹ýÀº ½±Áö°¡ ¾Ê´Ù. ±×·¯¹Ç·Î º¸Åë µ¥ÀÌŸ¸¦ º¹È£È­ÇÒ Çʿ䰡 ¾ø´Â "ÀÎÁõ" ºÐ¾ß¿¡ ÁÖ·Î ¾²ÀδÙ. ±×·± ÀÌÀ¯·Î ¾Ïȣȭ¿Í µ¿½Ã¿¡ º¹È£È­ ±îÁö ½Å°æ¼­¾ß ÇÑ´Ù¸é, RSA °°Àº °ø°³Å° ±â¹ÝÀÇ ¾Ë°í¸®ÁòÀ» »ç¿ëÇØ¾ß ÇÒ°ÍÀÌ´Ù. ¿©±â¿¡ ´ëÇØ¼­´Â ³ªÁß¿¡? ¾ê±â¸¦ ÇØº¸µµ·Ï ÇϰڴÙ.

¾î¶µç À§¿¡¼­ ¸»ÇßµíÀÌ, ¾ÏȣȭµÈ µ¥ÀÌŸ¸¦ Å©·¢Çس»´Â °è»êÀÌ ¾î·Æ´Ù »ÓÀÌÁö ºÒ°¡´ÉÇѰÍÀº ¾Æ´Ï¹Ç·Î ÃæºÐÇÑ ½Ã°£°ú ½Ã½ºÅÛÀÇ ¼º´É¸¸ µÞ¹ÙÄ§ÇØ µÐ´Ù¸é, ÆÐ½º¿öµå Å©·¢ÀÌ °¡´ÉÇÏ´Ù. ±×·± ÀÌÀ¯·Î ÃÖ½ÅÀÇ Unix(Linux Æ÷ÇÔ)´Â crypt ¿¡ MD5 ±îÁö »ç¿ëÇØ¼­ Å©·¢ÀÌ ´õ¿í ¾î·Æ°Ô ¸¸µé°í ÀÖ´Ù.
crypt ÀÇ ÇÔ¼ö¿øÇüÀº ´ÙÀ½°ú °°´Ù.
char *crypt (const char *key, const char *salt)
key °ªÀº ¾Ïȣȭ ½Ã۰íÀÚ ÇÏ´Â ¹®ÀÚ¿­ÀÌ´Ù. ¿©±â¼­ ÁÖ¸ñÇÒ²² salt ÀÌ´Ù. salt °ªÀº 2°³ÀÇ ¹®ÀÚ¿­·Î ÀÌ·ç¾îÁö´Âµ¥ [a-zA-Z0-9./] ÀÇ ¹®ÀÚµé·Î ±¸¼ºµÈ´Ù. ±×·¯¹Ç·Î °è»êÀ» ÇØº¸¸é ÇϳªÀÇ ¹®ÀÚ¿­Àº 4096((26*2+10+2) ^ 2) °¡ÁöÀÇ °¢ÀÚ ´Ù¸¥ salt °ªÀ» °¡Áú¼ö ÀÖ°Ô µÈ´Ù. crypt ÇÔ¼ö´Â ÀÌ salt °ªÀ» ÀÌ¿ëÇØ¼­ ¹®ÀÚ¿­À» ¾Ïȣȭ ÇÑ´Ù.
salt °ªÀ» ÀÌ¿ëÇÑ ¾Ïȣȭ ¹æ¹ý¿¡ ´ëÇØ¼­´Â crypt(3) ÀÇ man page ¸¦ Âü°íÇϱ⠹ٶõ´Ù.
±×·³ ¿¹Á¦¸¦ ÅëÇØ¼­ crypt ÇÔ¼öÀÇ »ç¿ë¹ý¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸°Ú´Ù. ·£´ýÇÑ salt °ªÀ» »ç¿ëÇϱâ À§Çؼ­ random(3), srandom(3)À» »ç¿ëÇß´Ù.

¿¹Á¦
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <sys/types.h>

void get_salt(char **seed);
int main(int argc, char **argv)
{
    char *seed;
    if (argc != 2)
    {
        printf("Usage : ./crypt [passwd]\n");
        exit(0);
    }

    seed = (char *)malloc(3);
    memset(seed, '\0', 3);
    get_salt(&seed);

    printf("¿ø  ¹® : %s\n", argv[1]);
    printf("¾ÏÈ£¹® : %s\n", crypt(argv[1], seed));

    free(seed);
}

void get_salt(char **seed)
{
    time_t now_time;

    char first_seed[3];
    char *salt_set="./abcdefghijklmnopqrstuvwxyz"
                   "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
                   "0123456789";
    memset(first_seed, '\0', 3);
    time(&now_time);

    srandom((unsigned int)now_time);
    first_seed[0] = salt_set[random() % 64];
    first_seed[1] = salt_set[random() % 64];

    memcpy(*seed, first_seed, 3);
}

random ÇÔ¼ö´Â random seed °ª¿¡ ÀÇÇØ¼­ µ¹·ÁÁö´Â °ªÀÌ °áÁ¤µÈ´Ù. Áï °°Àº random seed °ªÀ» °¡Áö°Ô µÈ´Ù¸é °°Àº °ªÀ» µ¹·ÁÁØ´Ù. ÀÌ·¯ÇÑ random seed ´Â srandom(3) ÇÔ¼ö¸¦ ÅëÇØ¼­ ¸¸µé¾î ÁÖ°Ô µÈ´Ù. srandom À» »ç¿ëÇÏÁö ¾ÊÀ»°æ¿ì random seed °ªÀº ±âº»ÀûÀ¸·Î 1·Î ¼¼ÆÃµÇ°Ô µÈ´Ù. ±×·¯¹Ç·Î srandom À» »ç¿ëÇÏÁö ¾Ê´Â´Ù¸é random À» »ç¿ëÇÑ´Ù°í ÇÏ´õ¶óµµ ¾ðÁ¦³ª °°Àº °ª¸¸À» µ¹·ÁÁÖ°Ô µÈ´Ù. À§¿¡¼­´Â random seed °ªÀ» ´Ù¸£°Ô ÁÖ±â À§Çؼ­ time(2) ÇÔ¼ö¸¦ »ç¿ëÇÏ¿´´Ù. ÀÌ·¸°Ô µÇ¸é ÇÁ·Î±×·¥À» ½ÇÇàÇÒ¶§¸¶´Ù. À¯ÀÏÇÑ random seed °ªÀ» »ç¿ëÇÒ¼ö ÀÖ°Ô µÈ´Ù.
´Ü, time ÇÔ¼öÀÇ °æ¿ì ½Ã°£À» "ÃÊ" ´ÜÀ§·Î °è»êÇϱ⠶§¹®¿¡ 1ÃÊ ½Ã°£¾È¿¡ ÇÁ·Î±×·¥À» ´Ù½Ã ½ÇÇà½Ã۸é random ÇÑ °ªÀ» ¾òÀ»¼ö ¾ø°Ô µÉ°ÍÀÌ´Ù.
À§ÀÇ ¼Ò½º¸¦ ÄÄÆÄÀϽÃ۱â À§Çؼ­´Â crypt ¶óÀ̺귯 ¸¦ Æ÷ÇÔ½ÃÄÑÁà¾ß ÇÑ´Ù.
[yundream@localhost test]$ gcc -o crypt crypt.c -lcrypt
À§ÀÇ ÇÁ·Î±×·¥À» ½ÇÇà½ÃŰ¸é ¾Æ·¡¿Í °°Àº °á°ú¸¦ ¾òÀ»¼ö ÀÖÀ»°ÍÀÌ´Ù.
[yundream@localhost test]# ./crypt school
¿ø  ¹® : school
¾ÏÈ£¹® : f9okROpUA9F0c
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.