2017-04-12 6 views
1

이것은 아주 간단한 것처럼 보이지만 지금은 일주일 넘게이를 알아 내려고 노력하고 있으며 알아낼 수 없습니다. WinJS를 사용하여 Windows UWP 응용 프로그램을 만들고 있으며 사용자가 PIV (스마트 카드)/PIN 조합을 사용하여 응용 프로그램에 로그인하려고합니다. 기본적으로 앱이 시작되면 스마트 카드가 기기에 삽입되어 있는지 확인한 다음 PIN을 입력하라는 메시지를 표시합니다. 스마트 카드에 대해 PIN의 유효성을 검사하면 앱에 사용자가 로그인하게됩니다.Windows 용 스마트 카드를 사용하는 사용자 로그인 UWP 앱

현재 Windows 7 응용 프로그램을 사용하고 있으며이 코드를 변환하려고 시도했지만 사용 된 API는 Windows 용으로 유효하지 않습니다 UWP 애플 리케이션. 그 API에 관한 질문을 올렸지 만 어떤 응답도받지 못했습니다 (https://stackoverflow.com/questions/43344679/x509certificate2ui-class-equivalent-with-windows-uwp-and-winjs). Windows 7에서는 X509Certificate2UI (https://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509certificate2ui(v=vs.110).aspx) 클래스를 사용하여 사용자에게 PIN을 입력하는 인증서를 선택했습니다.

많은 연구를 거친 후 Windows UWP에서 나는 틀릴 수도 있다고 생각합니다. 스마트 카드 API (https://docs.microsoft.com/en-us/uwp/api/windows.devices.smartcards)를 사용해야합니다. 저는 지난 며칠 동안이 책을 읽었으며 다음과 같은 스마트 카드에 대한 여러 Microsoft 문서를 보았습니다 : https://docs.microsoft.com/en-us/windows/uwp/security/smart-cards 그러나 스마트 카드의 PIN에 대해 사용자가 입력 한 PIN의 유효성을 검사하는 방법을 찾을 수 없었습니다.

SmartCardProvisioning 클래스 (https://docs.microsoft.com/en-us/uwp/api/windows.devices.smartcards.smartcardprovisioning)에서 우리는 현재 PIN과 새 PIN을 묻는 requestPinChangeAsync() 메소드를 호출 할 수 있습니다. 현재 PIN을 묻고 PIN이 올바른지 여부를 알려주는 값만 반환한다는 점을 제외하고는 비슷한 기능을 찾고 있습니다.

나는 또한 Microsoft의 Hello (https://docs.microsoft.com/en-us/windows/uwp/security/microsoft-passport) API를 통해 읽었지만 스마트 카드와 함께 사용하는 방법을 보지 못했습니다.

스마트 카드/PIN 조합을 사용하여 앱에서 이중 인증을 사용하는 방법에 대해 올바른 방향을 제시해 줄 수 있습니까? 나는 과거의 며칠 동안 계속해서 구글 거품에 빠져 나와 나가기 위해 도움이 필요한 것처럼 보인다. 이 중복되지 않는 이유

감사

편집 설명 : 정말 아니 중복, 두 질문은 나에 의해 물었다 나는 질문의 BOD의 다른 게시물을 언급했다. 다른 게시물에서 WinJS를 사용하는 Windows UWP의 X509Certificate2UI 클래스에 해당하는 것을 찾고있었습니다. 더 많은 연구를 통해이 게시물로 이동하는 올바른 방법이 아닐 수도 있습니다. 누군가 PIV (스마트 카드) 및 PIN을 사용하여 이중 인증을 수행하는 올바른 방향으로 나를 안내 할 수 있는지보고 싶습니다. 카드와 관련된

편집 : 작동하는 코드 공유 : 다음은 작동하는 것으로 보이는 WinJS 코드입니다. 확실하지 않은 경우 더 좋은 방법이 있습니다.

if (certToUse != null) { 
    Windows.Security.Cryptography.Core.PersistedKeyProvider.openKeyPairFromCertificateAsync(certToUse, Windows.Security.Cryptography.Core.HashAlgorithmNames.sha256, Windows.Security.Cryptography.Core.CryptographicPadding.rsaPkcs1V15).then(function (keyPair) { 
     var buffer = 'data to sign' 
     var data = Windows.Security.Cryptography.CryptographicBuffer.convertStringToBinary(buffer, Windows.Security.Cryptography.BinaryStringEncoding.utf16BE) 
     Windows.Security.Cryptography.Core.CryptographicEngine.signAsync(keyPair, data).then(function (signed) { 
     var results = Windows.Security.Cryptography.Core.CryptographicEngine.verifySignature(keyPair, data, signed) 
      completeValidatePin = true 
      successCallback(true) 
     }, function (reason) { 
      completeValidatePin = true 
      errorCallback('User cancelled login') 
     }) 
    }, function (reason) { 
     completeValidatePin = true 
     errorCallback('Error using certificate') 
    }) 
    } else { 
    errorCallback('Certificate not found') 
    } 
+0

[Windows UWP 및 WinJS와 동일한 X509Certificate2UI 클래스]의 가능한 복제본 (http : // stackoverflow.com/questions/43344679/x509certificate2ui-class-equivalent-with-windows-uwp-and-winjs) –

+0

사실 중복이 아니 어서 두 질문 모두 나에게 물어 봤고 나는 그 질문의 뼈대에 다른 게시물을 언급했다. 다른 게시물에서 WinJS를 사용하는 Windows UWP의 X509Certificate2UI 클래스에 해당하는 것을 찾고있었습니다. 더 많은 연구를 통해이 게시물로 이동하는 올바른 방법이 아닐 수도 있습니다. 누군가 PIV (스마트 카드) 및 PIN을 사용하여 이중 인증을 수행하는 올바른 방향으로 나를 안내 할 수 있는지보고 싶습니다. 카드와 관련된 –

+0

아니요. 샘플을 살펴본 결과 인증서를 요청하고 사용자가 입력 한 PIN의 유효성을 검사 할 수있는 구체적인 방법이 없습니다. 이 샘플에서는 PIN을 변경하고 재설정하는 방법 만 보여줍니다. –

답변

0

현재 조사 중이며 좋은 해결책이 있는지 확인하려고합니다. CryptographicEngine.Sign는 PIN 대화 상자를 표시 할 수 없습니다 있도록

IReadOnlyList<Certificate> Certs; 
CertificateQuery CertQuery = new CertificateQuery(); 
CertQuery.HardwareOnly = true; 

Certs = await CertificateStores.FindAllAsync(CertQuery); 
string strEncrypt = "test"; 
IBuffer BufferToEncrypt = CryptographicBuffer.ConvertStringToBinary(strEncrypt, BinaryStringEncoding.Utf8); 

foreach (Certificate Cert in Certs) 
{ 
    if (Cert.HasPrivateKey && ((Cert.KeyStorageProviderName == "Microsoft Base Smart Card Crypto Provider") || Cert.KeyStorageProviderName == "Microsoft Smart Card Key Storage Provider")) 
    { 
     CryptographicKey Key = null; 

     try 
     {       
      Key = await PersistedKeyProvider.OpenKeyPairFromCertificateAsync(Cert, HashAlgorithmNames.Sha1, CryptographicPadding.RsaPkcs1V15);       

     } 
     catch (Exception ex) 
     { 
      // Could not open Smart Card Key Pair 
     } 

     if (Key != null) 
     { 
      try 
      {       
       // Try to Sign with Cert Private key 
       IBuffer EncryptedBuffer = CryptographicEngine.Sign(Key, BufferToEncrypt); 
      } 
      catch (Exception ex) 
      { 
       // Could not sign        
      } 
     } 
    } 
} 

불행하게도, OpenKeyPairFromCertificateAsync는 자동 컨텍스트 공급자를 만듭니다

내가 일을해야한다고 생각 다음과 같은 코드를 작성했다. 나는 그것을 좀더 들여다 봐야 할 것이다.