Articles of pbkdf2

我应该提供什么“消化”论据?

我以前在login和注册function中有以下代码: var crypto = require('crypto'); … … this.hash = crypto.pbkdf2Sync(password, this.salt, 1000, 64).toString('hex'); 而且我已经注册用户。 昨天我更新了npm,现在显示错误: events.js:182 throw er; // Unhandled 'error' event ^ TypeError: The "digest" argument is required and must not be undefined at pbkdf2 (crypto.js:635:11) at Object.exports.pbkdf2Sync (crypto.js:628:10) at model.UserSchema.methods.validPassword (/opt/myapp/models/Users.js:35:23) at /opt/myapp/config/passport.js:16:23 at model.Query.<anonymous> (/opt/myapp/node_modules/mongoose/lib/model.js:3745:16) at /opt/myapp/node_modules/kareem/index.js:277:21 at /opt/myapp/node_modules/kareem/index.js:131:16 at _combinedTickCallback (internal/process/next_tick.js:131:7) […]

php和node.js之间的pbkdf2差异

我使用Node.js使用pbkdf2生成密码散列并将它们存储到数据库中。 另外我正在做一些用PHP制作的网页,让你用户重置他们的密码,所以除非我在node.js中使用web服务来构build哈希,我想在2个系统中运行该algorithm。 不幸的是,似乎我得到了不同的结果,我不能混合这两个库。 我在node.js中使用的代码使用模块password-hash-and-salt,基本上调用crypto.pbkdf2,而php使用hash_pbkdf2。 这些是我用来testing它的脚本: PHP: <?php $password = $argv[1]; $iterations = 10000; $length = 64; $salt = mcrypt_create_iv($length, MCRYPT_DEV_URANDOM); $key = hash_pbkdf2("sha256", $password, $salt, $iterations, $length,true); echo "HASH: pbkdf2\\$" . $iterations . "\\$" . bin2hex($key) . "\\$" . bin2hex($salt). "\n"; echo "Key length: " . strlen(bin2hex($key)) . "\n"; echo "Hash length: " . strlen(bin2hex($salt)) […]

没有callback提供给pbkdf2

我有这个代码,它在我的开发计算机上工作得很好,但不在服务器上。 db.admin.verify([req.body.username]).then(function(data){ if (data[0].length == 0){ //if there is no user with that username console.log("bad username"); res.status(401).send('Incorrect username or password'); } var creds = data[0][0]; return myCrypt.pbkdf2(req.body.password, creds.salt).then(function(key){ if (creds.password === key.toString('base64')){ //correct password console.log("correct pw"); return db.admin.getUser([req.body.username]) } else { console.log("bad pw"); res.status(401).send('Incorrect password or username'); } }); }).then(function(dbData){ var user = dbData[0][0]; var […]

如何使用nodejsvalidationSymfony2 sha512密码

我需要能够在nodevalidation一些用sha512编码使用Symfony2生成和存储的密码。 我可以检索hash和salt就好了,但使用crypto我不能pipe理生成一个哈希使用盐匹配存储在数据库中的一个。 Symfony security.yml security: encoders: "FOS\UserBundle\Model\UserInterface": sha512 散列存储在数据库中 6zxwRZc4EPXKxQes9avs0ZyCRFkC4dtpXrT983ML8VLvv9WhRnAi282bwuFuj3LHPQBGmqD1BfCLDUXGdHIjZQ== 储存在DB中的盐 qu7rjvaietws8kg4cgsggksookwsws8 由于节点端有盐,所以我使用的是crypto.pbkdf2Sync ,在configuration中没有设置迭代,它看起来像Symfony的默认值是1000.默认长度是40,但是存储的哈希长度是128,所以使用128作为长度(尝试40没有成功)。 我还尝试了Symfony 2 MessageDigestPasswordEncoder使用的5000次迭代,并将原始密码与salt合并为symfony raw_password{salt}但没有成功。 如果我使用pbkdf2Sync生成一个长度为40的密钥(按照symfony的默认值),然后使用它来更新一个用crypto.createHash var hash = user.password; var salt = user.salt; console.log(hash); console.log(crypto.pbkdf2Sync("password", salt, 1000, 128 >> 1, "sha512").toString("base64")); 生成的散列的大小和格式与存储在数据库中的散列的大小相匹配,但是它们不匹配是我的问题的值。 我也试着dynamic生成多个迭代值,没有任何运气。 产量 6zxwRZc4EPXKxQes9avs0ZyCRFkC4dtpXrT983ML8VLvv9WhRnAi282bwuFuj3LHPQBGmqD1BfCLDUXGdHIjZQ== 5QPz3zXwhak/bTD2S9IFEEFmiJ8q/fqIlSF6cWin7dqmh92EFNXjw/FLtQw7NX3LVehwcXKjfypo2EhJxiLouQ== w9+8xjklvGq9CuiqY8tEoxEetLV9lbhLJ/KaFQEooUFJrGT9/EdsVd/sSRJ+DXjsH4RQeaqsmftmuzLPgVv5MA== 我怎样才能生成散列,使其符合Symfony 2使用的方式?

Rfc2898DeriveBytes在javascript中的等价物?

我已经看到C#代码可以使用如下代码encryption和解密密码: http://wp7-travel.googlecode.com/svn/trunk/SilverlightPhoneDatabase/Cryptography.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Security.Cryptography; using System.IO; using System.Reflection; namespace SilverlightPhoneDatabase { /// <summary> /// Class used to encrypt the database /// </summary> public static class Cryptography { /// <summary> /// Incrypt the input using password provided /// </summary> /// <param name="input">Input string to encrypt</param> /// <param name="password">Password […]

Nodejs crypto.pbkdf2结果不同于CryptoJS.PBKDF2

我在前端(CryptoJS)和后端(Node.js)上使用PBKDF2,两个派生密钥必须相同,所以我使用相同的salt,相同的algorithm,相同的迭代次数,相同的密码,但派生的密钥是不同。 这是浏览器/ cryptoJS代码,在注释示例盐和密钥。 (hex) <script type="text/javascript" src="pbkdf2.js"></script> <script type="text/javascript" src="sha512.js"></script> <script> var salt = CryptoJS.lib.WordArray.random(128 / 8); var key512Bits = CryptoJS.PBKDF2('anacleto', salt, { hasher:CryptoJS.algo.SHA512, keySize: 512 / 32, iterations: 1 }); console.log(salt.toString(CryptoJS.enc.Hex)); // 1427f23fd32f8f9902768e7ab7c7ffad console.log(key512Bits.toString(CryptoJS.enc.Hex)); // de3259de39fcc55531b91b4ffb2a6c29005c674cc95b3ec5bdf18412b6087d05921f3a0e4148fc34c88a04e980481d397a4c2b143edc0cb1bb5d7434ca3b4c25 </script> 这是nodeJS代码 var crypto = require('crypto'); var salt_hex = '1427f23fd32f8f9902768e7ab7c7ffad'; var key_hex = 'de3259de39fcc55531b91b4ffb2a6c29005c674cc95b3ec5bdf18412b6087d05921f3a0e4148fc34c88a04e980481d397a4c2b143edc0cb1bb5d7434ca3b4c25'; var salt = new […]

crypto.pbkdf2是asynchronous的,我如何将其视为同步?

我在node.js中使用pbkdf2来散列密码。 我的问题是,我正在响应身份validation请求,我正在进行身份validation,如果传递的凭据是正确的。 我假设pbkdf2是asynchronous的,因为它可能需要大量的时间(取决于迭代的大小)。 然而,将剩余的authentication逻辑转移到一个单独的方法来利用callback看起来有点难看。 有没有比使用计时器或将所有连续validation逻辑放入单独函数更好的方法? 我知道大多数人会说我应该使用callback,但在我的使用情况下,这是没有道理的。 直到我将pbkdf2应用到传递的密码之后,我才能继续进行身份validation。

Node中密码存储的密码学最佳实践

我正在寻找一个简单,安全的解决scheme来存储用户的密码,使用节点。 我是一个密码学新手,但一直试图从网上调查一起解决scheme。 我正在寻找validation,我想出的是一个具有基本(而不是银行,医院等)安全需求的Web应用程序的可靠解决scheme。 这里是: var crypto = require('crypto'); var SALT_LENGTH = 64; var KEY_LENGTH = 64; var ITERATIONS = 1000; function createHashedPassword(plainTextPassword, cb) { crypto.randomBytes(SALT_LENGTH, function (err, salt) { console.time('password-hash'); crypto.pbkdf2(plainTextPassword, salt, ITERATIONS, KEY_LENGTH, function (err, derivedKey) { console.timeEnd('password-hash'); return cb(null, {derivedKey: derivedKey, salt: salt, iterations: ITERATIONS}); }); }); }; …以下是我所做的select, 什么哈希algorithm使用? 基于这篇广泛引用的文章 ,它看起来像领先的竞争者是PBKDF2,bcrypt和scrypt。 我select了PBKDF2,因为它已经在Node中build立了支持。 […]

使用pbkdf2的SALT和HASH

我正在使用以下方法从nodejs中的encryption库中创build一个腌制和散列的密码: crypto.randomBytes(size, [callback]) crypto.pbkdf2(password, salt, iterations, keylen, callback) 对于randomBytes调用(创buildSALT)我应该使用什么大小? 我听说过128位盐,也许高达256位。 它看起来像这个函数使用字节的大小,所以我可以假设大小为32(256位)就足够了? 对于pbkdf2调用,什么是很好的迭代次数,key(keylen)的长度是多less? 此外,对于存储,我已经看到了盐,长度,迭代和derviedkey存储在同一列的例子。 我正在使用一个例子来分隔4 :: ,即: salt::derivedKey::keyLength::iterations 这样做,我可以分开::以获得4个值,所以我可以根据提供的密码生成派生的密钥,看看它是否匹配。 这是存储这个的正确方法吗? 还是应该在结合这些价值观时多一些“欺骗”?