1

Google OTP 앱에서 QR 코드를 스캔하거나 발행자가 제공 한 키를 직접 입력 할 수 있습니다.Google OTP로 이중 인증 - QR 코드 대신 수동으로 키 입력

다음 스크린 샷에서 두 번째 방법에 따라 TOTP를 얻는 방법을 보여주는 Google 보안 설정 중 2FA 설정을 볼 수 있습니다.

Google 2FA settings - Google Authenticator setup

내 질문은 : 어떻게이 키가 생성된다?

내 웹 사이트 용 Google Authenticator로 2FA를 지원하려고하고 있는데 QR 코드를 생성하는 방법에 대한 많은 참고 자료 및 문서를 찾았지만 대체 방법에 대해서는 언급하지 않았습니다.

편집 :

조금 명확하게하기 위해, 내가 Grails의 3 웹 애플리케이션에 구글 인증 자와 2FA를 지원하고있다. 이미 각 사용자에 대해 비밀 키 (Base32 문자열)를 생성하고 사용자가 스캔 할 QR 코드를 제공하고 로그인시 TOTP를 확인함으로써 전체 사용자 흐름을 구현했습니다. 나는 의존성으로 사용 : 편리하게 QR 코드를 생성하는 GA에서 TOTP에 대해

  • org.grails.plugins:qrcode, qrcode Grails plugin을 사용자 비밀 키를 확인하기 위해

    • org.jboss.aerogear:aerogear-otp-java, aerogear OTP 내 질문에 두 가지 방법에 관한 것입니다

    Google OTP 앱에 새 항목 추가 : 1. QR 코드 (내 측면에서는 모두 정상입니다.) 2. 영문 이름과 함께 계정 이름을 직접 입력하십시오 (첫 번째 스크린 샷에서 Google 보안 설정에 코드가 제공됨).

    Google 2FA settings - Google Authenticator setup

    가 어떻게 생성 할 수 있으며, 1 스크린 샷 fzee로 시작하는 (예 : 코드를 제공하고, 2 차에 "키를 제공"이라는 : ​​

    당신은 안드로이드에 대한 GA에서 설명이되는 스크린 샷을 볼 수 있습니다 하나) 사용자에게? QR 코드로 인코딩 된 동일한 데이터 문자열의 인코딩이라고 확신하지만 어느 것이 (단지 Base32이 아닌지) 알지 못합니다.

  • +0

    https://stackoverflow.com/questions/47368154/how-to-make-google-authentication-scan-qr-code/47368506#47368506 여기에게 당신은 모두 –

    +0

    고마워하지만 내 문제는 QR 코드 지원 (생성, 스캔 등)에 관한 것이 아닙니다. 위에서 쓴대로 QR 코드 스캔과 관련된 전체 2FA 플로우를 이미 구현했습니다. 제 질문은 영숫자 키 (기본적으로 QR 코드 스캔과 동일한 결과를 제공)를 입력하는 Google OTP 앱이 지원하는 두 번째 입력 방법에 관한 것입니다. 어떻게 생성 할 수 있습니까? – ilPittiz

    답변

    0

    키 생성 위치를 추적하는 데 도움이 귀하의 사이트에이를 구현하기 위해 사용하려고하는 코드베이스 알려주세요 secret

    키는 생성 한 암호와 같아야합니다. Google 인증 프로그램을 열고 수동으로 키로 추가하여 테스트하십시오.

    체크 아웃 아래 링크에서 문서 : https://support.google.com/accounts/answer/1066447?co=GENIE.Platform%3DiOS&hl=en

    +0

    나는 실제보다 훨씬 더 큰 문제를 만들었다. 필자는 여러 소스를 참조로 사용했으며'키 '는'비밀'을 인코딩 한 결과라고 확신했다. 답변이 가장 간결하므로이 답변을 수락합니다. 그러나 답장을 보내 주신 모든 분들께 감사드립니다. – ilPittiz

    1

    Google 인증 자 설정 QR 코드는 다음 중 하나를 기반으로 생성되며 그 중 하나는 "비밀 키"이므로 사이트에 빌드하는 데 사용하는 코드베이스에 따라 "비밀 키"가 정상적으로 생성됩니다 먼저 그 키가 QR 코드를 생성하는 데 사용됩니다. 이 보면

    는 당신이 할 수있는 당신이 약

    여기
    // generate base32 secret 
    var secret = GA.encode('base 32 encoded user secret') || GA.secret(); 
    
    // get QRCode in SVG format 
    var qrCode = GA.qrCode('akanass', 'otp.js', secret); 
    

    https://github.com/njl07/otp.js/#qrcode-generation

    가 수동으로 QR 코드를 생성 할 수있는 또 다른 예를 들어 사이트입니다 내가 무슨 말을 볼 수 있습니다 모듈을 Node.js를 Label, User, Key and URL을 입력하면 QR 코드가 생성됩니다.

    https://dan.hersam.com/tools/gen-qr-code.html

    = 내가 당신이 그때 당신은 비밀 키가

    +0

    답장을 보내 주셔서 감사합니다. 내가 내 자신을 명확하게 충분히 설명하지 않았다고 생각해서 위의 질문을 편집했습니다.) – ilPittiz

    +0

    Base32 문자열을 사용해 보셨습니까? 그게 작동하지 않는다면'Base32.decode (secret)'시도 –

    +0

    예,'Base32' 인코딩은 실제로 제 1 테스트 였지만 실제로는 해결책이 아닙니다. 예를 들어 문자열 'otpauth : // TOTP/내 사이트 : [email protected] 비밀 = EFWYTW6H1INJ3XQZ 및 발급자 = MySite'가 매우 긴 스트링 (''N52HAYLVORUDULZPORXXI4BPJV4VG2LUMU5GK3LBNFWEA3LZONUXIZJOMNXW2P3TMVRXEZLUHVCUMV2ZKRLTMSBRJFHEUM2YKFNCM2LTON2WK4R5JV4VG2LUMU ======)으로 인코딩된다?. 너무 오랫동안 관리하려면 (그리고 바로 패딩이 있습니다) – ilPittiz

    0
    public class HomeController : Controller 
        { 
         private const string key = "key"; // any 10-12 char string for use as private key in google authenticator 
         public ActionResult Login() 
         { 
          return View(); 
         } 
    
         [HttpPost] 
         public ActionResult Login(LoginModel login) 
         { 
          string message = ""; 
          bool status = false; 
    
          //check username and password form our database here 
          //for demo I am going to use Admin as Username and Password1 as Password static value 
          if (login.Username == "sanket" && login.Password == "123") 
          { 
           status = true; // show 2FA form 
           message = "2FA Verification"; 
           Session["Username"] = login.Username; 
    
           //2FA Setup 
           TwoFactorAuthenticator tfa = new TwoFactorAuthenticator(); 
           string UserUniqueKey = login.Username + key; //as Its a demo, I have done this way. But you should use any encrypted value here which will be unique value per user 
           Session["UserUniqueKey"] = UserUniqueKey; 
           var setupInfo = tfa.GenerateSetupCode("Sanket Security", login.Username, UserUniqueKey, 300, 300); 
           ViewBag.BarcodeImageUrl = setupInfo.QrCodeSetupImageUrl; 
           ViewBag.SetupCode = setupInfo.ManualEntryKey; 
          } 
          else 
          { 
           message = "Invalid credential"; 
          } 
          ViewBag.Message = message; 
          ViewBag.Status = status; 
          return View(); 
         } 
    
         public ActionResult MyProfile() 
         { 
          if (Session["Username"] == null || Session["IsValid2FA"] == null || !(bool)Session["IsValid2FA"]) 
          { 
           return RedirectToAction("Login"); 
          } 
          ViewBag.Message = "Welcome " + Session["Username"].ToString(); 
          return View(); 
         } 
         public ActionResult Verify2FA() 
         { 
          var token = Request["passcode"]; 
          TwoFactorAuthenticator tfa = new TwoFactorAuthenticator(); 
          string UserUniqueKey = Session["UserUniqueKey"].ToString(); 
          bool isValid = tfa.ValidateTwoFactorPIN(UserUniqueKey, token); 
          if (isValid) 
          { 
           Session["IsValid2FA"] = true; 
           return RedirectToAction("MyProfile", "Home"); 
           token=string.Empty; 
          } 
          return RedirectToAction("Login", "Home"); 
         } 
        } 
    } 
    
    0
    And View 
    
    @model _2FAGoogleAuthenticator.ViewModel.LoginModel 
    
    @{ 
        ViewBag.Title = "Login"; 
    } 
    
    <h2>Login</h2> 
    
    @* Here we will add 2 form, 1 for Login and another one for 2FA token verification form *@ 
    @if (ViewBag.Status == null || !ViewBag.Status) 
    { 
        <!--Show login form here, Viewbag.Status is used for check is already veirfied from our database or not--> 
        <div>@ViewBag.Message</div> 
        <div> 
         @using (Html.BeginForm()) 
         { 
          <div class="form-group"> 
           <label for="Username">Username : </label> 
           @Html.TextBoxFor(a => a.Username, new { @class = "form-control"}) 
          </div> 
          <div class="form-group"> 
           <label for="Password">Password : </label> 
           @Html.TextBoxFor(a => a.Password, new { @class="form-control", type="password"}) 
          </div> 
          <input type="submit" value="Login" class="btn btn-default" /> 
         } 
        </div> 
    } 
    else 
    { 
        <!--Show 2FA verification form here--> 
        <div>@ViewBag.Message</div> 
        <div> 
         <img src="@ViewBag.BarcodeImageUrl"/> 
        </div> 
        <div> 
         **Manual Setup Code : @ViewBag.SetupCode** 
        </div> 
        <div> 
         @using (Html.BeginForm("Verify2FA","Home", FormMethod.Post)) 
         { 
          <input type="text" name="passcode" /> 
          <input type="submit" class="btn btn-success" /> 
         } 
        </div> 
    } 
    
    +0

    수동 설정 코드 : @ ViewBag.SetupCode보기에서이 줄은 응용 프로그램에서 제공하는 코드보다 코드를 생성하고 해당 코드를 입력하면 작동하지 않을 것입니다 ... 그리고 제발 ... 그것을 표시하고 도와 줘서 도움이된다. –