이것은 일상적인 암호문을 사용자에게서 입력받을때 사용하는 범용적인
termios 사용 예를 만들어 본겁니다.

이 함수를 만드는데는 조건이 여러가지 보안정도에 따라서 보다 철저한 관리가 필요하기도 합니다.

현재 만든 예제는 다음과 같은 조건을 고려하여 만들었습니다
간단한 기능이지만 보안상 중요한 이유로 좀더 세밀한 계획이 있어야 겠지요.

1. 암호를 적절히 사용후에 메모리에 흔적을 남기지 말것.
2. 암호문을 입력받을때 암호문 자체를 ECHO 시키지 말것.
3. 최근 암호입력시에 이전의 암호문은 자동으로 메모리에서 흔적을 없앨것.

코드:

/*
Copyright (c) Information Equipment co.,LTD.
All right reserved
Code by JaeHyuk Cho <mailto:minzkn@infoeq.com>

CVSTAG="$Header$"
*/

#ifndef __DEF_mzengine_getpassword_c__
#define __DEF_mzengine_getpassword_c__ "getpassword.c"

#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <termios.h>

#define __DEF_GETPASSWORD_MAX_BUFFER__ (256)

static char __g_mzengine_password__[ __DEF_GETPASSWORD_MAX_BUFFER__ ];

void mzengine_getpassword_release(void)
{
(void)memset((void *)(&__g_mzengine_password__[0]), 0, sizeof(__g_mzengine_password__));
}

char * mzengine_getpassword(const char *s_Prompt)
{
char *s_Result;
struct termios s_StoreTermios, s_Termios;
int s_ReadBytes, s_Offset;
s_Result = (char *)0;
mzengine_getpassword_release();
if(s_Prompt != (char *)0)(void)fprintf(stdout, "%s", s_Prompt);
fflush(stdout);
if((tcgetattr(STDIN_FILENO, (struct termios *)(&s_StoreTermios)) != (-1)) &&
    (tcgetattr(STDIN_FILENO, (struct termios *)(&s_Termios)) != (-1)))
{
#if defined(IUCLC) && defined(IXANY) /* This is not POSIX : IUCLC, IXANY */
  s_Termios.c_iflag &= ~(IUCLC|IXON|IXOFF|IXANY);
#else
  s_Termios.c_iflag &= ~(IXON|IXOFF);
#endif
  s_Termios.c_lflag &= ~(ECHO|ECHOE|ECHOK|ECHONL|TOSTOP);
  if(tcsetattr(STDIN_FILENO, TCSANOW, (struct termios *)(&s_Termios)) != (-1))
  {
   s_ReadBytes = read(STDIN_FILENO, (void *)(&__g_mzengine_password__[0]), sizeof(__g_mzengine_password__) - 1);
   if(s_ReadBytes > 0)
   {
    for(s_Offset = 0;s_Offset < s_ReadBytes;s_Offset++)
    {
     if((__g_mzengine_password__[s_Offset] == '\r') || (__g_mzengine_password__[s_Offset] == '\n'))break;
    }
    (void)memset((void *)(&__g_mzengine_password__[s_Offset]), 0, sizeof(__g_mzengine_password__) - s_Offset);
    s_Result = (char *)(&__g_mzengine_password__[0]);
   }
  }
  (void)tcsetattr(STDIN_FILENO, TCSANOW, (struct termios *)(&s_StoreTermios));
}
if(s_Prompt != (char *)0)(void)fprintf(stdout, "\n");
fflush(stdout);
return(s_Result);
#endif
}

#endif

/* End of source */
2007/05/07 10:02 2007/05/07 10:02
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://blog.minzkn.com/rss/response/61

댓글+트랙백 ATOM :: http://blog.minzkn.com/atom/response/61

트랙백 주소 :: http://blog.minzkn.com/trackback/61

트랙백 RSS :: http://blog.minzkn.com/rss/trackback/61

트랙백 ATOM :: http://blog.minzkn.com/atom/trackback/61

댓글을 달아 주세요

댓글 RSS 주소 : http://blog.minzkn.com/rss/comment/61
댓글 ATOM 주소 : http://blog.minzkn.com/atom/comment/61