2016-08-21 3 views
2

나는 및 importKey 작업을 수행하기 위해 Cordova 및 forge library 및 브라우저의 Web Crypto API과 협력하고 있습니다. 그럼에도 불구하고 Android 기기의 Web Crypto API는 crypto.getRandomValues()이고 SubtleCrypto는 정의되지 않았습니다 (cryptotle). 그래서 Web Crypto API shrim과 그 종속성 Promiz을 추가하면이 참조가 누락되었다고 생각했지만 아무 것도 변경되지 않았습니다. 어떤 아이디어라도 제발?웹 암호화 API cryptotletle은 Apache Cordova에서 정의되지 않았습니다.

Chrome에서 PC에서 디버깅 52.0.2743.116은 전체 웹 암호화 API를 제공하지만 Android 4.4.4에서는 Chrome 버전 52.0.2743.98 인 Android 기기에서 사용할 수 있습니다. 웹 API는 crypto.getRandomValues ​​()에만 제한됩니다.

How to load a PKCS#12 Digital Certificate with Javascript WebCrypto API

코드 예제에서

I'am 기본적으로 재 작성 대답 :

나는 또한 많이했다

<script src="lib/promiz.min.js"></script> 
<script src="lib/webcrypto-shim.js"></script> 

자바 스크립트 파일

//working with forge without issue 
var pkcs12Der = forge.util.decode64(pk); 
var pkcs12Asn1 = forge.asn1.fromDer(pkcs12Der); 
var pkcs12 = forge.pkcs12.pkcs12FromAsn1(pkcs12Asn1, false, "password"); 
console.log(pkcs12); 

privateKey = null; 
// load keypair and cert chain from safe content(s) 
for (var sci = 0; sci < pkcs12.safeContents.length; ++sci) { 
    var safeContents = pkcs12.safeContents[sci]; 

    for (var sbi = 0; sbi < safeContents.safeBags.length; ++sbi) { 
     var safeBag = safeContents.safeBags[sbi]; 

     // this bag has a private key 
     if (safeBag.type === forge.pki.oids.keyBag) { 
      //Found plain private key 
      privateKey = safeBag.key; 
     } else if (safeBag.type === forge.pki.oids.pkcs8ShroudedKeyBag) { 
      // found encrypted private key 
      privateKey = safeBag.key; 
     } else if (safeBag.type === forge.pki.oids.certBag) { 
      // this bag has a certificate...   
     } 
    } 
} 

//function for importingKey 
function _importCryptoKeyPkcs8(privateKey, extractable) { 
    var privateKeyInfoDerBuff = _privateKeyToPkcs8(privateKey); 

    //import key will not work due to missing reference crypto.subtle 
    return window.crypto.subtle.importKey(
     'pkcs8', 
     privateKeyInfoDerBuff, { 
      name: "RSASSA-PKCS1-v1_5", 
      hash: { 
       name: "SHA-256" 
      } 
     }, 
     extractable, ["sign"]); 

} 

_importCryptoKeyPkcs8(privateKey, true). 
then(function(cryptoKey) { 
    //sign will not work due to missing reference crypto.subtle 
    window.crypto.subtle.sign({ 
       name: "RSASSA-PKCS1-v1_5" 
      }, 
      cryptoKey, 
      digestToSignBuf) 
     .then(function(signature2) { 

     }); 
}); 
+1

샘플 코드를 보여줄 수 있습니까? 특히 webcrypto-shim 라이브러리를 사용합니다. – e666

+0

@ e666 코드 샘플이 추가되었습니다. 정의되지 않은 window.crypto.subtle을 올바르게 참조하지 못합니다. – Marek

+1

이 작업을 위조 할 수 없습니까? 'window.crypto'가 전혀 필요하지 않습니까? –

답변

0

내부 내부 index.html을 cordova 앱의 Web Crypto API 관련 문제 열쇠를 가져 오거나 저장하는 해결책을 찾지 못했습니다.

이 JS-도서관하지만 제가 어제 발견하는 것이된다

https://github.com/wwwtyro/cryptico

어쩌면 당신은 당신의 코드를 변경하고 사용할 수 있습니다.