ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Serializable and Encryption data
    Computer Language/C# 2018. 3. 23. 15:59
    728x90

    Tool test 중 Login정보를 저장했다가 다시 실행 시 load해달라는 요청이 있었습니다.


    사용자 입장에서는 굉장히 편리한 기능이죠. 자동 로그인정도는 아니지만...


    기존에 사용자 data는 class로 관리하던터라 직렬화로 저장해버리면 되겠다는 생각에 바로 적용해보았습니다.


    직렬화를 위해서는 Class에 [Serializable] 라고 선언해 주기면 하면 됩니다.


    [Serializable]

    public class User {

    public sring data { get; set; }

    }


    직렬화로 저장 및 호출은 정말 함수 호출로 간단하게 되더군요.


    // Save Data

    User user_info = new User();

    user_info.data = "test"


    FileStream fs = new FileStream("login.dat", FileMode.OpenOrCreate);

    BinaryFormatter bf = new BinaryFormatter();

    bf.Serialize(fs, user_info);

    fs.Close();


    //Load Data

    fs = new FileStream("login.dat", FileMode.Open);

    BinaryFormatter bf = new BinaryFormatter();

    user_info = (User)bf.Deserialize(fs);

    fs.Close();


    역시 C#이 이런건 막강해서 좋습니다. C같으면 library구하던지 별도 class로 코딩했어야 하는데...


    그런데 문제는 저장된 data에 password가 적나라하게 노출이 됩니다. Local에서 돌아간다고는 하지만 보안문제로 연결될 수있죠...


    누가 뭐라고 하기전에 얼른 고쳐봅니다.


    암호화 관련해서 찾아보니 CryptoStream이라는게 있네요. 역시 MS..


    MSDN은 여기

    https://msdn.microsoft.com/en-us/library/system.security.cryptography.cryptostream.aspx



    MSDN예제는 프로그램 실행 중에 만들었다가 삭제하는 로직이라 파일 저장하려는 목적이랑은 달랐죠.


    핵심은 encryption을 위한 Key와 IV를 가지고 있어야 한다는 겁니다.  MSDN보면서도 이부분이 햇갈렸는데 아래 블로그에 잘 설명되어 있네요.


    구글링해서 사용법을 찾아보니 그렇게 어렵지는 않습니다. 몇개 예제 중 가장 도움이 된 블로그 링크입니다.

    http://jongwan.com/c-php-rijndael-256bit-%EC%95%94%EB%B3%B5%ED%98%B8%ED%99%94/#comment-3222


    제가 실제 사용한 예제입니다.

    // Key정보를 보관하고 있어야 Decription시 사용이 가능함.

    public static byte[] encrypt_key = Encoding.UTF8.GetBytes("abcdefg_abcdefg_");

    public static byte[] encrypt_IV = Encoding.UTF8.GetBytes("abcdefg_");


    // Save Encrypted Data

    RijndaelManaged rijn = new RijndaelManaged();

    rijn.Mode = CipherMode.ECB;

    rijn.Padding = PaddingMode.Zeros;

    rijn.BlockSize = 256;

    using (ICryptoTransform encryptor = rijn.CreateEncryptor(encrypt_key, encrypt_IV))

    {

    // save login value

    FileStream fs = new FileStream("login.dat", FileMode.OpenOrCreate);

    using (Stream cryptoStream = new CryptoStream(fs, encryptor, CryptoStreamMode.Write))

    {

    BinaryFormatter bf = new BinaryFormatter();

    bf.Serialize(cryptoStream, user_info);

    }

    }

    rijn.Clear();



    //Load Decrypted Data

    using (ICryptoTransform decryptor = rijn.CreateDecryptor(encrypt_key, encrypt_IV))

    {

    fs = new FileStream("login.dat", FileMode.Open);

    BinaryFormatter bf = new BinaryFormatter();

    using (Stream cryptoStream = new CryptoStream(fs, decryptor, CryptoStreamMode.Read))

    {

    user_info = (User)bf.Deserialize(cryptoStream);

    }

    }

    rijn.Clear();



    저장된 파일을 열어보면 잘 암호화 되있는걸 확인 하실수 있습니다.


    실행중인 프로그램의 메모리를 열어보는건 아직 막을순 없는데 이건 차후 공부해서 다시 정리하도록 하겠습니다.





    'Computer Language > C#' 카테고리의 다른 글

    Loading Form  (0) 2018.03.13
    Window 서비스 제어  (1) 2010.10.27
    기초강좌 링크  (0) 2008.03.11

    댓글

Designed by black7375.