즐겁게 개발을...

개발보다 게임이 더 많이 올라오는 것 같은...

개발/C#

[2021.04] C#에서 이중 인증 중 OTP 활용 방법

다물칸 2021. 4. 6. 14:25
728x90
반응형

개발환경: VisualStudio 2017, Devexpress 20.x

 

왜이리 한글 문서들로 정리된 문서가 없는지 또 작성해본다. 보통 이중인증 보다는 투-팩터 인증이라는 단어를 많이 사용한다. (나만 그런가?) 요즘 사이버 보안이 잘 뚫리다 보니 아이디/패스워드 로그인 체계에 덧 붙여서 이중 또는 다중 인증을 사용토록 하는게 요즘 인/허가 가이드의 보안 방침이다. 

 

이중 인증의 방식은 공인인증, 사설인증, 생체인증, 간편인증, ... 진짜 많다. 

 

그 중 본문에서는 시간정보와 비밀키를 이용한 OTP를 다뤄볼까 한다. 

OTP를 계산하는 방식은 동일하기 때문에 어떤 OTP앱을 사용해도 동일하게 인증 체크가 가능하다. 

개념만 알면 엄청 단순해서 글 작성이 안된 것일까? 아니면 많이 사용하지 않아서일까?

 

참고URL을 바탕으로 나만의 클래스를 만들었다. 다만 QR코드 생성 등은 아직 C#으로 옮겨오지 못했다. 

참고 URL

gigi.nullneuron.net/gigilabs/using-time-based-one-time-passwords-for-two-factor-authentication/

 

Using Time-Based One-Time Passwords for Two-Factor Authentication - Gigi Labs

Introduction Two-factor authentication (2FA) is becoming more and more important, as its adoption is driven by a need for major software companies to secure their systems against threats, as well as due to legal requirements of strong customer authenticati

gigi.nullneuron.net

사용패키지: 

github.com/kspearrin/Otp.NET

 

kspearrin/Otp.NET

A .NET implementation of TOTP and HOTP for things like two-factor authentication codes. - kspearrin/Otp.NET

github.com

Otp.NET에 들어가거나 Nuget 패키지에서 "Otp.NET"을 찾아 설치한다.

 

코드는 심플하다.

 

using OtpNet;

// 시크릿키를 랜덤으로 개인별로 만들고
public string GetBase32Secret()
{
    var secret = KeyGeneration.GenerateRandomKey(20);
    return Base32Encoding.ToString(secret);
}

public bool CheckOTP(string Base32Secret, string InputOTPCode)
{
     var secret = Base32Encoding.ToBytes(Base32Secret);
     var totp = new Totp(secret);
     return totp.VerifyTotp(InputOTPCode, out long timeStepMatched, VerificationWindow.RfcSpecifiedNetworkDelay);
 }

랜덤으로 만들어진 키와 라벨(보통 어플리케이션 이름)을 이용해서 QR코드를 생성하고 QR코드를 통해 OTP앱을 이용해 등록하면 매 시간 (30초) 마다 OTP코드가 생성이 된다. 

 

QR코드 생성기는 이 URL을 타고 들어가면 JQuery를 이용해서 서버없이 로컬에서도 실행이 가능한 html파일이 있다.

stefansundin.github.io/

 

Stefan Sundin's code and programs.

Stefan Sundin's code and programs.

stefansundin.github.io

 

인증 어플리케이션에서도 시크릿키를 이용해 인증해야 하기 때문에 개인별로 발급된(랜덤으로 생성된) 키를 개인과 매핑해서 관리되어야 할 것 같다. 

 

자.. 이제 테스트를 해보자. 

 

위에 QR코드 생성기는 아쉽게도 기본으로 제공되는 WebBrowser콘트롤(IE)에서는 제대로 동작하지 않아서 크로미움 컨트롤을 이용해보자. 

 

Nuget 패키지에서 "CefSharp.Winform"을 설치한다. 

 

그리고 폼하나 추가해서 다음 코드를 넣어보자.

public ChromiumWebBrowser CBrowser;

private void form1_Load(object sender, EventArgs e) 
{
    string URL = Path.Combine(Application.StartupPath, "index.html";
    try 
    {
        Cef.Initialize(new CefSettings());
    } catch {}
    CBrowser = new ChromiumWebBrowser(URL);
    this.Controls.Add(CBroser);
    CBroser.Dock = DockStyle.Fill;
}

private void BtnGenerateKey_Click(object sender, EventArgs e)
{
    txtSecret.Text = GetBase32Secret();
    Clipboard.SetText(txtSecret.Text);
}

private void BtnVerifyOTP_Click(object sender, EventArgs e) 
{
    string verify = CheckOTP(txtSecret.Text, txtOTP.Text) ? "'검증완료'" : "'검증실패'";
    XtraMessageBox.Show(verify + " 되었습니다.", "검증결과");
}

 

실행하면 이런 느낌으로 개발해봤다. "키생성"버튼으로 키를 랜덤생성하고 아래 "Secret -Required" 란에 클립보드에 복사된 키를 붙여넣으면 QR코드가 완성이 된다. 

(index.html 파일을 수정해서 아래처럼 보이게 했다.)

이제 QR코드를 구글OTP 또는 마이크로소프트 OTP, Authy OTP 앱을 이용해서 등록해보자. 

아쉽게도 모바일 앱내에서 캡쳐가 되지 않아서 URL하나 첨부한다.

 

나온 OTP코드를 저 위에 넣어서 검증버튼을 클릭하면 검증결과가 메시지로 출력된다. 

 

OTP 앱의 장/단점

 

구글 OTP - 가장 보편적으로 많이 사용하던 앱. 핸드폰을 분실하거나 훼손됐을 경우 OTP 복구가 되지 않는다.

Authy OTP - 구글 OTP의 기본기능 외에 2차인증을 통해 복구기능 및 다중기기에 OTP를 등록해서 사용할 수 있다.

 

반응형