효율성 향상: Google Authenticator 인증 클라이언트 GoldenPassport 오픈 소스

7220 단어
최근 운비 학생들은 보안을 높이기 위해 Google Authenticator로 서버에 이중 인증을 했다. 이후 서버에 로그인하려면 먼저 동적 비밀번호를 입력하고 서버 비밀번호를 입력해야 한다.Google Authenticator는 소프트 토큰에 해당합니다. 그에 대해 잘 모르는 학생들은 이 글을 볼 수 있습니다. 구글 검증(Google Authenticator)의 실현 원리는 무엇입니까?
운비 학생의 출발점은 좋았지만, 내가 원래 쓴 각종 자동 로그인 서버의 스크립트는 모두 효력을 잃었다.알이 아픈 것은 내가 지금 서버에 로그인하는 절차가 바뀌었다는 것이다.
  • 핸드폰 꺼내기(내 것은 아이폰)
  • 잠금 해제, 지문 잠금 해제에 실패한 경우 비밀번호 입력 잠금 해제
  • Authenticator 클라이언트를 열고 Verification Code 업데이트를 1s
  • 정도 기다립니다.
  • Verification Code를 기억하고 Mac에 입력
  • 서버 암호를 입력하고 로그인...

  • 원래 나는 내가 한 명령만 실행하면 끝난다. 왜냐하면 나는 항상 각종 다른 서버에 로그인해야 하기 때문에 이런 방식이 업무 효율에 미치는 영향은 가히 짐작할 수 있다.
    현재 Google 공식 클라이언트는 Android와 iOS만 있습니다. 그래서 PC를 대상으로 하는지 찾아보기 시작했습니다. Windows 시스템을 대상으로 하는 WinAuth가 Google Authenticator를 지원하는 것을 발견했습니다. 저는 일을 하든 집에서 Mac을 사용하기 때문에 이 WinAuth는 사용할 수 없습니다. 나중에 GitHub에서 MacAuthenticator 도구를 찾아서 다운로드해서 사용할 수 있습니다.적어도 Mac은 Verification 코드를 받을 수 있어 휴대전화에 의존할 필요가 없지만 여전히 효율 문제를 해결할 수 없고 그 도구를 종료할 수 없다니...
    손쉬운 도구가 없으니 내가 직접 개발해야 할 것 같아서 내가 필요로 하는 기능을 간단하게 설계했다.
  • QR코드에서 Authentication 코드, 즉otpauth 프로토콜의 그 secret
  • 를 직접 식별하는 것을 지원합니다
  • Authentication Code 관리를 지원하며 이러한 기본 기능을 저장, 추가, 삭제해야 한다
  • 내가 원하는 Verification Code
  • 를 편리하게 받을 수 있음
  • 인증 코드를 손으로 베끼지 않고 자동 복사
  • 를 클릭
  • 인증코드를 직접 채우는 글로벌 단축키를 지원하므로 번거로운 포인트 마우스가 필요 없음(마우스를 사용하지 않고 키보드에 의존하는 작업용)
  • 셸 스크립트에서 인증 코드를 얻을 수 있습니다 (이렇게 해야만 제가 이전에 쓴 자동화 도구가 정상적으로 작동할 수 있습니다.)
  • 기술 조사 연구


    GitHub에 이미 MacAuthenticator 개원 프로젝트(OC 기반)가 있기 때문에 기술 실현에 아무런 장애가 없을 것이다.
    언어적으로는 14년 때'The Swift Programming Language'번역에 참여한 적이 있지만 아직 Swift를 사용해 본 적이 없기 때문에 Swift 개발을 통해 공부하기로 했다.
    otp 프로토콜에 있어 Google은 알고리즘을 개발했다. 구글-authenticator, 마침 iOS 버전도 있는데 OC 기반이지만 Swift 호출에 문제가 없기 때문에 핵심 프로토콜의 처리는 직접 가져오면 된다.
    어떻게 생성된 Verification 코드를 다른 응용 프로그램에 호출합니까?생각해 보니 HTTP 기반의 호출이 비교적 간단하기 때문에 내장된 HTTP 서버를 실현해야 한다.cocapods에 가서 찾아보니 Swifter가 비교적 적합하다는 것을 발견했다.
    macOS에서의 응용 프로그램은 제가 처음 접했지만 Windows 플랫폼에서 데스크톱 클래스의 응용을 많이 개발했습니다. 이 응용 프로그램은 배우면서 감각적인 문제가 크지 않습니다. (실제로 할 때 각종 구덩이를 밟는 것을 발견했습니다.) 인터넷에서 빠른 입문 자료를 찾았는데 아주 좋은 자료를 발견했습니다. 추천: Weather Bar

    최종 성과


    Golden Passport는 GitHub에 올렸습니다. 프로젝트 홈페이지에 간단한 사용 설명이 있습니다. 저는 구체적인 기능을 소개하지 않고 기본적으로 제 요구에 따라 실현했습니다.
    거의 모든 기능이 이 메뉴에서 해결되었다.
    QR코드에서 OTP 주소를 식별하고 QR코드가 없으면 직접 입력해도 됩니다.
    Shell 스크립트와 통합된 HTTP 인터페이스는 다음과 같습니다.
    # you can get the url from `http://localhost:17304/`
    code=$(curl 'http://localhost:17304/code/[email protected]')
    # ues the verification code
    echo $code
    

    기술점


    개발 과정에서 많은 구덩이를 밟았고 많은 난점을 만났다. (주로 참고할 수 있는 자료가 적다.) 여기서 간단하게 정리하고 원본에 관심이 있는 학생은 GitHub에 가서 Fork를 하자.

    Google 기반 OTP 라이브러리 Verification Code 생성

    let data = OTPAuthURL.base32Decode(otpData.secret)
    let gen = TOTPGenerator(secret: data,
                            algorithm: TOTPGenerator.defaultAlgorithm(),
                            digits: TOTPGenerator.defaultDigits(),
                            period: TOTPGenerator.defaultPeriod())
    let code = gen?.generateOTP(for: Date())  //  code 
    

    상태 표시줄 아이콘이 명확하지 않은 문제


    만약에 당신의statusIcon이 18*18의 png이라면 인터넷의 예를 참조하여 하면 상태 표시줄의 아이콘이 상당히 모호하고 시스템이 가지고 있는 선명함보다 훨씬 못하다는 것을 발견할 수 있습니다. 만약에 당신이 사용하는 png이 비교적 큰 그림이라면 상태 표시줄에 전혀 표시되지 않는 것을 발견할 수 있습니다. 이 문제를 해결하는 관건은 그림의 크기를 지정하는 것입니다.
    statusIcon = NSImage(named: "statusIcon")  // 48 * 48 
    statusIcon.size = NSMakeSize(20, 20)  //  
    

    상태 표시줄 단추에 이벤트 바인딩


    시스템 상태 표시줄 단추 대상을 얻은 후에 이벤트를 연결하여 메뉴를 표시해야 합니다. 오랫동안 괴롭혀서 끝났습니다. 주로 action이라는 곳에 걸려 있습니다. 인터넷에서 이 방면에 대한 자료는 상당히 적습니다. Swift3에서 저희가 Selector를 만드는 정확한 자세는 #selector( ) 동시에 statusItem.target = self 를 지정해야 합니다.
    statusItem = NSStatusBar.system().statusItem(withLength: NSSquareStatusItemLength)
    statusItem.target = self
    statusItem.action = #selector(openMenu)
    

    전역 단축키 바인딩


    이 방면의 자료가 정말 적다 ~
    let opts = NSDictionary(object: kCFBooleanTrue, forKey: kAXTrustedCheckOptionPrompt.takeUnretainedValue() as NSString) as CFDictionary
    guard AXIsProcessTrustedWithOptions(opts) == true else { return }
    monitor = NSEvent.addGlobalMonitorForEvents(matching: .keyDown, handler: self.handleKeydownEvent)
    

    창 기본 가운데 표시

    httpPortConfigWindow.showWindow(nil)
    httpPortConfigWindow.window?.makeKeyAndOrderFront(nil)
    httpPortConfigWindow.window?.center()
    NSApp.activate(ignoringOtherApps: true)
    

    서로 다른 구성 요소 간의 메시지 상호작용


    Foundation 라이브러리는 우리에게 관찰자 모델을 바탕으로 하는 NotificationCenter 을 제공하여 사용하기에 상당히 편리하다.
    //  A 
    let notificationCenter = NotificationCenter.default
    notificationCenter.addObserver(self,
                                   selector: #selector(verifyCodeAdded),
                                   name: NSNotification.Name(rawValue: "VerifyKeyAdded"),
                                   object: nil)
    //  B 
    let notificationCenter = NotificationCenter.default
    notificationCenter.post(name: NSNotification.Name(rawValue: "VerifyKeyAdded"), object: nil)
    

    클립보드로 컨텐트 복사

    let pasteboard = NSPasteboard.general()
    pasteboard.clearContents()
    pasteboard.setString(codeInfo.value, forType: NSStringPboardType)
    

    호출 시스템 창 열기, 그림 형식만 선택 가능

    let openPanel = NSOpenPanel()
    openPanel.allowedFileTypes = NSImage.imageTypes()
    

    파일에서 QR코드 식별


    인터넷은 대부분 iOS가 QR코드를 스캔하는 예시로 OSX에서 파일에서 식별하는 방법을 한참 동안 모색한 후에야 실현되었다.
    let ciImage = CIImage(contentsOf: openPanel.url!)
    let detector = CIDetector(ofType: CIDetectorTypeQRCode, context: nil, options: [CIDetectorAccuracy: CIDetectorAccuracyLow])
    let results = detector?.features(in: ciImage!)
    if (results?.count)! > 0 {
        let qrFeature = results?.last as! CIQRCodeFeature
        let data = qrFeature.messageString   //  
        ...
    }
    

    수확


    Golden Passport는 제가 개발한 첫 번째 macOS 응용 프로그램으로 데스크톱 응용 프로그램의 개발 절차를 잘 알고 있습니다. 창 유형의 응용은 이미 큰 지장이 없습니다.윈도의 데스크톱 응용 프로그램 개발 체험에 비해 OSX가 많이 떨어진 것 같다. 이것도 자신이 OSX에 익숙하지 않은 것과 관련이 있다.
    많은 Swift 문법의 구덩이를 밟았는데 지금은 Swift3를 사용하고 있습니다. 인터넷에서 찾은 일부 자료가 반드시 Swift3에 대한 코드가 아니라 가져와서 꼭 사용하지 않습니다. Swift의 이런 호환성 문제는 여전히 사람을 혐오스럽게 합니다.Swift4도 곧 나올 예정입니다. 여전히 호환성 문제가 있습니다.
    Cocoa 프레임워크에 익숙하지 않아 NSXX의 API가 어떻게 사용되는지 모르는 경우가 적지 않다. 또한 NS의 많은 API가 Swift에서 사용법이 바뀌었다. GitHub 덕분에 GitHub의 코드 검색 기능을 통해 다른 사람의 프로젝트의 예시 코드를 많이 찾을 수 있다. Swift의 문법과 결합하면 개발 과정에서 부딪히는 일부 기능성 문제는 기본적으로 해결할 수 있다.
    Xcode의 프로젝트 의존 관리 도구를 익혔습니다:cocoapods와 Swift Package Manager, 자자손손손의 무한한 프로젝트 의존에 대해 익히려면 프로젝트 의존 관리 도구가 필요합니다.Golden Passport 프로젝트는 Swift Package Manager가 혼합 언어의 프로젝트 의존 관리를 지원하지 않기 때문에 코코포스로 프로젝트 의존을 관리했습니다.
    Golden Passport의 핵심 기능은 제가 주말을 이용하여 꼬박 2일여 동안 고생한 것입니다. 마치 흑마에 참가한 느낌입니다. 자신에게 익숙하지 않은 것을 하라고 강요합니다. 지금 배워서 지금 하세요. 짧은 시간 안에 도대체 어떻게 할 수 있는지 보세요. 그 순간을 끝내면 성취감이 가득합니다.

    결어


    소스 주소: GoldenPassport, Star 환영합니다.
    컴파일된 도구는 GitHub의 Releases에서 다운로드할 수 있습니다. 이 도구가 다른 사람에게 도움이 된다면 더할 나위 없이 좋습니다.
    Google Authenticator를 도입하여 효율이 떨어지는 문제를 완벽하게 해결하고 원래의 자동화 스크립트도 정상적으로 사용할 수 있게 되었습니다. 이 프로젝트는 일단락된 셈입니다.정신을 차리고 빅데이터를 계속 연구해야겠어) 도망가..

    좋은 웹페이지 즐겨찾기