2016-08-22 77 views
0

使用加密时存在问题。我很确定我的问题是在saveAccounts函数中的第75行。我相信在这一点上,account var将由getAccounts函数中指定的空[]组成[因为在'storage'中''accounts''没有'getItemSync'。我感觉这个问题与该数据的格式,我试图加密,但我不能换我的头周围。一直麻烦了一段时间的拍摄。天满错误报告低于我的代码。crypto:var keyWords = key.words:TypeError:无法读取未定义的属性'words'

console.log('starting password manager'); 
var crypto = require("crypto-js"); 
var storage = require('node-persist'); 
storage.initSync(); 

var argv = require('yargs') 
    .command('create', 'Create a new account', function(yargs){ 
     yargs.options({ 
      name: { 
       demand: true, 
       alias: 'n', 
       description: "Account name (eg: Github, SnapChat).", 
       type: 'string' 
      }, 
      username: { 
       demand: true, 
       alias: 'u', 
       description: "Please provide a username for your account.", 
       type: 'string' 
      }, 
      password: { 
       demand: true, 
       alias: 'p', 
       description: "Please provide a password for your account.", 
       type: 'string' 
      }, 
      masterPassword: { 
       demand: true, 
       alias: 'm', 
       description: "Please provide a MASTER password.", 
       type: 'string' 
      } 
     }).help('help'); 
    }) 
    .command('get', 'Get an existing account', function(yargs){ 
     yargs.options({ 
      name: { 
       demand: true, 
       alias: 'n', 
       description: "Account name (eg: Github, SnapChat).", 
       type: 'string' 
      }, 
      masterPassword: { 
       demand: true, 
       alias: 'm', 
       description: "Please provide a MASTER password.", 
       type: 'string' 
      } 
     }).help('help'); 
    }) 
    .help('help') 
    .argv; 


var command = argv._[0]; 


function getAccounts (masterPassword){ 
    console.log("function getAccounts has been run"); 
    var encryptedAccount = storage.getItemSync('accounts'); 
    var accounts = []; 
    // decrypt 
    if (typeof encryptedAccount !== 'undefined') { 
     var bytes = crypto.AES.decrypt(encryptedAccount, masterPassword); 
     accounts = JSON.parse(bytes.toString(crypto.enc.Utf8)); 
    } 

    // return accoutns array 
    return accounts; 
} 

function saveAccounts (accounts, masterPassword){ 
    console.log("function saveAccounts has been run"); 
    // encrypt accounts 
    var encryptedAccounts = crypto.AES.encrypt(JSON.stringify(accounts), masterPassword); 
    // setItemSync 
    storage.setItemSync('accounts', encryptedAccounts.toString()); 
    // return accounts 
    return accounts; 
} 


function createAccount(account, masterPassword){ 
    var accounts = getAccounts(masterPassword); 

    accounts.push(account); 
    console.log("back to function createAccount"); 
    saveAccounts(account, masterPassword); 
} 


function getAccount(accountName, masterPassword){ 
    var accounts = getAccounts(masterPassword); 
    var matchedAccount; 

    accounts.forEach(function(account){ 
     if (account.name === accountName) { 
      matchedAccount = account; 
     } 
    }); 

    return matchedAccount; 
} 




if (command === "create") { 
    var createdAccount = createAccount({ 
     name: argv.name, 
     username: argv.username, 
     password: argv.password 
    }, argv.masterPassword); 
    console.log('Account created!'); 
    console.log(createdAccount); 
} else if (command === "get") { 
    if (masterPassword !== argv.m || typeof masterPassword === undefined) { 
     console.log("Your password was incorrect."); 
    } else { 
    var accountReturned = getAccount(argv.name, argv.masterPassword); 
     if(typeof(accountReturned) === undefined){ 
      console.log("This account doesn't exist."); 
     } else { 
     console.log("Your account info:"); 
     console.log(accountReturned); 
     } 
    } 
} 

全错误代码如下所示

starting password manager 
function getAccounts has been run 
back to function createAccount 
function saveAccounts has been run 
/media/david/08053ee9-7733-4986-97be-f5cac7a80746/david/Projects/Node-Password-Manager/node_modules/crypto-js/aes.js:96 
       var keyWords = key.words; 
           ^

TypeError: Cannot read property 'words' of undefined 
    at Object.C_algo.AES.BlockCipher.extend._doReset (/media/david/08053ee9-7733-4986-97be-f5cac7a80746/david/Projects/Node-Password-Manager/node_modules/crypto-js/aes.js:96:32) 
    at Object.CryptoJS.lib.Cipher.C_lib.Cipher.BufferedBlockAlgorithm.extend.reset (/media/david/08053ee9-7733-4986-97be-f5cac7a80746/david/Projects/Node-Password-Manager/node_modules/crypto-js/cipher-core.js:119:19) 
    at Object.CryptoJS.lib.Cipher.C_lib.BlockCipher.Cipher.extend.reset (/media/david/08053ee9-7733-4986-97be-f5cac7a80746/david/Projects/Node-Password-Manager/node_modules/crypto-js/cipher-core.js:457:27) 
    at Object.CryptoJS.lib.Cipher.C_lib.Cipher.BufferedBlockAlgorithm.extend.init (/media/david/08053ee9-7733-4986-97be-f5cac7a80746/david/Projects/Node-Password-Manager/node_modules/crypto-js/cipher-core.js:104:19) 
    at Object.subtype.init (/media/david/08053ee9-7733-4986-97be-f5cac7a80746/david/Projects/Node-Password-Manager/node_modules/crypto-js/core.js:68:46) 
    at Object.subtype.init (/media/david/08053ee9-7733-4986-97be-f5cac7a80746/david/Projects/Node-Password-Manager/node_modules/crypto-js/core.js:68:46) 
    at Object.subtype.init (/media/david/08053ee9-7733-4986-97be-f5cac7a80746/david/Projects/Node-Password-Manager/node_modules/crypto-js/core.js:68:46) 
    at Object.C_lib.Base.create (/media/david/08053ee9-7733-4986-97be-f5cac7a80746/david/Projects/Node-Password-Manager/node_modules/crypto-js/core.js:95:32) 
    at Object.CryptoJS.lib.Cipher.C_lib.Cipher.BufferedBlockAlgorithm.extend.createEncryptor (/media/david/08053ee9-7733-4986-97be-f5cac7a80746/david/Projects/Node-Password-Manager/node_modules/crypto-js/cipher-core.js:63:26) 
    at Object.CryptoJS.lib.Cipher.C_lib.SerializableCipher.Base.extend.encrypt (/media/david/08053ee9-7733-4986-97be-f5cac7a80746/david/Projects/Node-Password-Manager/node_modules/crypto-js/cipher-core.js:669:37) 
+0

我很好奇,为什么当节点有一个内置的'crypto'模块时使用第三方模块? – mscdex

+0

只是通过锻炼。不适合专业人士使用。练习更多的是了解如何使用节点和JavaScript。我不确定为什么练习要求使用npm crypto-js,如果有更好的方法去做。该教程可能有点旧了。 –

+1

你在'saveAccounts(account,masterPassword);'行中忘了's',但除此之外,你的代码看起来很好 –

回答

0

您应该比较的typeof字符串 - “未定义” See typeof docs

else if (command === "get") { 
if (masterPassword !== argv.m || typeof masterPassword === 'undefined') { 
    console.log("Your password was incorrect."); 
} else { 
var accountReturned = getAccount(argv.name, argv.masterPassword); 
    if(typeof(accountReturned) === 'undefined'){ 
     console.log("This account doesn't exist."); 
    } else { 
    console.log("Your account info:"); 
    console.log(accountReturned); 
    } 
} 

我正在研究我认为的同一个Udemy课程。祝你好运!

0

我有同样的问题,并尝试不同的事情后,我发现错误是加密对象的类型。 --->$crypto.encrypt("string","string")。就那么简单。当您尝试使用对象而不是字符串进行解密时,会出现该错误。

相关问题