【问题标题】:Angular JS Cryptography. pbkdf2 and iterationAngular JS 密码学。 pbkdf2 和迭代
【发布时间】:2017-03-20 10:23:30
【问题描述】:

我想使用 sha512 和迭代计数将我的字符串转换为 PBKDF2。我在nodejs中使用“pbkdf2”模块。我怎样才能在 Angular JS 中实现同样的效果。

【问题讨论】:

    标签: angularjs node.js cryptography pbkdf2 webcrypto-api


    【解决方案1】:

    您可以在所有现代浏览器 (http://caniuse.com/#feat=cryptography) 中使用带有本机支持的内置 WebCryptographyApi

    这是从herehere 提取(和修改)的示例

    function deriveAKey(password, salt, iterations, hash) {
    
        // First, create a PBKDF2 "key" containing the password
        window.crypto.subtle.importKey(
            "raw",
            stringToArrayBuffer(password),
            {"name": "PBKDF2"},
            false,
            ["deriveKey"]).
        then(function(baseKey){
            // Derive a key from the password
            return window.crypto.subtle.deriveKey(
                {
                    "name": "PBKDF2",
                    "salt": stringToArrayBuffer(salt),
                    "iterations": iterations,
                    "hash": hash
                },
                baseKey,
                {"name": "AES-CBC", "length": 128}, // Key we want.Can be any AES algorithm ("AES-CTR", "AES-CBC", "AES-CMAC", "AES-GCM", "AES-CFB", "AES-KW", "ECDH", "DH", or "HMAC")
                true,                               // Extractable
                ["encrypt", "decrypt"]              // For new key
                );
        }).then(function(aesKey) {
            // Export it so we can display it
            return window.crypto.subtle.exportKey("raw", aesKey);
        }).then(function(keyBytes) {
            // Display key in Base64 format
            var keyS = arrayBufferToString(keyBytes);
            var keyB64 = btoa (keyS);
            console.log(keyB64);
        }).catch(function(err) {
            alert("Key derivation failed: " + err.message);
        });
    }
    
    //Utility functions
    
    function stringToArrayBuffer(byteString){
        var byteArray = new Uint8Array(byteString.length);
        for(var i=0; i < byteString.length; i++) {
            byteArray[i] = byteString.codePointAt(i);
        }
        return byteArray;
    }
    
    function  arrayBufferToString(buffer){
        var byteArray = new Uint8Array(buffer);
        var byteString = '';
        for(var i=0; i < byteArray.byteLength; i++) {
            byteString += String.fromCodePoint(byteArray[i]);
        }
        return byteString;
    }
    

    用法

    var salt = "Pick anything you want. This isn't secret.";
    var iterations = 1000;
    var hash = "SHA-512";
    var password = "password";
    
    deriveAKey(password, salt, iterations, hash);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 2018-12-24
      • 2016-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多