खोज…


टिप्पणियों

वेबक्रिप्टो एपीआई आमतौर पर केवल "सुरक्षित" मूल पर उपलब्ध हैं, जिसका अर्थ है कि दस्तावेज़ को एचटीटीपीएस या स्थानीय मशीन ( localhost , file: या ब्राउज़र एक्सटेंशन) से लोड किया जाना चाहिए।

ये एपीआई W3C वेब क्रिप्टोग्राफी एपीआई कैंडिडेट सिफारिश द्वारा निर्दिष्ट किए गए हैं

क्रिप्टोग्राफिक रूप से यादृच्छिक डेटा

// Create an array with a fixed size and type.
var array = new Uint8Array(5);

// Generate cryptographically random values
crypto.getRandomValues(array);

// Print the array to the console
console.log(array);

crypto.getRandomValues(array) का उपयोग निम्न वर्गों के उदाहरणों के साथ किया जा सकता है ( बाइनरी डेटा में आगे वर्णित है) और दिए गए पर्वतमाला (दोनों सिरे समावेशी) से मान उत्पन्न करेगा:

  • Int8Array : -2 7 से 2 7 -1
  • Uint8Array : 0 से 2 8 -1
  • Int16Array : -2 15 से 2 15 -1
  • Uint16Array : 0 से 2 16 -1
  • Int32Array : -2 31 से 2 31 -1
  • Uint32Array : 0 से 2 31 -1

डाइजेस्ट बनाना (जैसे SHA-256)

// Convert string to ArrayBuffer. This step is only necessary if you wish to hash a string, not if you aready got an ArrayBuffer such as an Uint8Array.
var input = new TextEncoder('utf-8').encode('Hello world!');

// Calculate the SHA-256 digest
crypto.subtle.digest('SHA-256', input)
// Wait for completion
.then(function(digest) {
  // digest is an ArrayBuffer. There are multiple ways to proceed.

  // If you want to display the digest as a hexadecimal string, this will work:
  var view = new DataView(digest);
  var hexstr = '';
  for(var i = 0; i < view.byteLength; i++) {
    var b = view.getUint8(i);
    hexstr += '0123456789abcdef'[(b & 0xf0) >> 4];
    hexstr += '0123456789abcdef'[(b & 0x0f)];
  }
  console.log(hexstr);

  // Otherwise, you can simply create an Uint8Array from the buffer:
  var digestAsArray = new Uint8Array(digest);
  console.log(digestAsArray);
})
// Catch errors
.catch(function(err) {
  console.error(err);
});

वर्तमान मसौदा कम से कम SHA-1 , SHA-256 , SHA-384 और SHA-512 प्रदान करने का सुझाव देता है, लेकिन यह कोई सख्त आवश्यकता नहीं है और परिवर्तन के अधीन है। हालांकि, SHA परिवार को अभी भी एक अच्छा विकल्प माना जा सकता है क्योंकि यह संभवतः सभी प्रमुख ब्राउज़रों में समर्थित होगा।

आरएसए कुंजी जोड़ी बनाना और पीईएम प्रारूप में परिवर्तित करना

इस उदाहरण में आप सीखेंगे कि RSA-OAEP कुंजी जोड़ी कैसे उत्पन्न करें और इस कुंजी जोड़ी से निजी कुंजी को base64 में कैसे परिवर्तित करें ताकि आप इसे OpenSSL आदि के साथ उपयोग कर सकें। कृपया ध्यान दें कि इस प्रक्रिया का उपयोग सार्वजनिक कुंजी के लिए भी किया जा सकता है। नीचे उपसर्ग और प्रत्यय का उपयोग करने के लिए:

-----BEGIN PUBLIC KEY-----
-----END PUBLIC KEY-----

नोट: यह उदाहरण पूरी तरह से इन ब्राउज़रों में परीक्षण किया गया है: क्रोम, फ़ायरफ़ॉक्स, ओपेरा, विवाल्डी

function arrayBufferToBase64(arrayBuffer) {
    var byteArray = new Uint8Array(arrayBuffer);
    var byteString = '';
    for(var i=0; i < byteArray.byteLength; i++) {
        byteString += String.fromCharCode(byteArray[i]);
    }
    var b64 = window.btoa(byteString);

    return b64;
}

function addNewLines(str) {
    var finalString = '';
    while(str.length > 0) {
        finalString += str.substring(0, 64) + '\n';
        str = str.substring(64);
    }

    return finalString;
}

function toPem(privateKey) {
    var b64 = addNewLines(arrayBufferToBase64(privateKey));
    var pem = "-----BEGIN PRIVATE KEY-----\n" + b64 + "-----END PRIVATE KEY-----";
    
    return pem;
}

// Let's generate the key pair first
window.crypto.subtle.generateKey(
    {
        name: "RSA-OAEP",
        modulusLength: 2048, // can be 1024, 2048 or 4096
        publicExponent: new Uint8Array([0x01, 0x00, 0x01]),
        hash: {name: "SHA-256"} // or SHA-512
    },
    true,
    ["encrypt", "decrypt"]
).then(function(keyPair) {
    /* now when the key pair is generated we are going
       to export it from the keypair object in pkcs8
    */
    window.crypto.subtle.exportKey(
        "pkcs8",
        keyPair.privateKey
    ).then(function(exportedPrivateKey) {
        // converting exported private key to PEM format
        var pem = toPem(exportedPrivateKey);
        console.log(pem);
    }).catch(function(err) {
        console.log(err);
    });
});

बस! अब आपके पास PEM प्रारूप में पूरी तरह से काम करने वाली और अनुकूलनीय RSA-OAEP निजी कुंजी है जिसे आप जहां चाहें उपयोग कर सकते हैं। का आनंद लें!

CryptoKey को PEM कुंजी जोड़ी परिवर्तित करना

तो, क्या आपने कभी सोचा है कि वेब क्रिप्टोग्राफी एपीआई में ओपनएसएसएल द्वारा उत्पन्न अपनी पीईएम आरएसए कुंजी जोड़ी का उपयोग कैसे करें? अगर जवाब हां है। महान! आप पता लगाने जा रहे हैं।

नोट: इस प्रक्रिया का उपयोग सार्वजनिक कुंजी के लिए भी किया जा सकता है, आपको केवल उपसर्ग और प्रत्यय बदलने की आवश्यकता है:

-----BEGIN PUBLIC KEY-----
-----END PUBLIC KEY-----

यह उदाहरण मानता है कि आपके पास अपनी RSA कुंजी जोड़ी PEM में उत्पन्न हुई है।

function removeLines(str) {
    return str.replace("\n", "");
}

function base64ToArrayBuffer(b64) {
    var byteString = window.atob(b64);
    var byteArray = new Uint8Array(byteString.length);
    for(var i=0; i < byteString.length; i++) {
        byteArray[i] = byteString.charCodeAt(i);
    }

    return byteArray;
}

function pemToArrayBuffer(pem) {
    var b64Lines = removeLines(pem);
    var b64Prefix = b64Lines.replace('-----BEGIN PRIVATE KEY-----', '');
    var b64Final = b64Prefix.replace('-----END PRIVATE KEY-----', '');

    return base64ToArrayBuffer(b64Final);
}

window.crypto.subtle.importKey(
    "pkcs8",
    pemToArrayBuffer(yourprivatekey),
    {
        name: "RSA-OAEP",
        hash: {name: "SHA-256"} // or SHA-512
    },
    true,
    ["decrypt"]
).then(function(importedPrivateKey) {
    console.log(importedPrivateKey);
}).catch(function(err) {
    console.log(err);
});

और अब आप कर रहे हैं! आप WebCrypto API में अपनी आयातित कुंजी का उपयोग कर सकते हैं।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow