29

我已经尝试了几天在我的 Windows 机器上安装 bcrypt,但没有成功。一个依赖项(Windows 7 SDK)不想安装,即使我已经尝试了来自网络的许多建议,它只是拒绝合作。

我需要一个很好的替代 bcrypt 的方法,它没有任何依赖关系。

4

5 回答 5

30

查看https://npmjs.org/package/bcryptjs,它与 bcrypt 完全兼容,只是没有依赖关系。

或者https://npmjs.org/package/simplecrypt如果您不想要加密样板并且只需要加密和解密字符串。

于 2013-11-06T21:24:32.177 回答
18

截至2020 年 4 月 24 日scrypt,在crypto模块中使用了一种很好的内置哈希密码方式

// Using the built in crypto module

const { scryptSync, randomBytes } = require("crypto");


// Any random string here (ideally should be atleast 16 bytes)

const salt = randomBytes(16).toString("hex")


// Pass the password string and get hashed password back
// ( and store only the hashed string in your database)

const getHash = (password) => scryptSync(password, salt, 32).toString("hex");

于 2020-04-24T09:30:04.827 回答
1

您应该真正使用内置的加密模块来满足您的加密需求。它基本上是与 OpenSSL 的绑定,这是一个快速、稳定、安全且经过严格审查的加密库。尝试实现自己的加密(或使用其他人未经验证的实现加密的尝试)是灾难的根源。

如果你想加密数据,你所要做的就是调用crypto.createCipher,它返回一个可读/可写的Stream。将数据写入流中,它将使用加密数据发出数据事件。

例如:

var stream = crypto.createCipher('aes192', 'mysecretpassword');
stream.on('data', function(enc) {
    // enc is a `Buffer` with a chunk of encrypted data
});

stream.write('some secret data');
stream.end();
于 2013-11-06T23:36:25.817 回答
1

如果有人遇到类似的问题,你可以试试bcyrptjs,它是用 JavaScript 编写的优化bcrypt,零依赖,也兼容 C++ bcrypt。

于 2019-04-19T23:06:27.767 回答
1

这是 @malik-bagwala 的改进版本,带有 JsDocs、类型和匹配密码功能。

import { randomBytes, scryptSync } from 'crypto';

// Pass the password string and get hashed password back
// ( and store only the hashed string in your database)
const encryptPassowrd = (password: string, salt: string) => {
  return scryptSync(password, salt, 32).toString('hex');
};

/**
 * Hash password with random salt
 * @return {string} password hash followed by salt
 *  XXXX till 64 XXXX till 32
 *
 */
export const hashPassword = (password: string): string => {
  // Any random string here (ideally should be atleast 16 bytes)
  const salt = randomBytes(16).toString('hex');
  return encryptPassowrd(password, salt) + salt;
};

// fetch the user from your db and then use this function

/**
 * Match password against the stored hash
 */
export const matchPassword = (passowrd: string, hash: string): Boolean => {
  // extract salt from the hashed string
  // our hex password length is 32*2 = 64
  const salt = hash.slice(64);
  const originalPassHash = hash.slice(0, 64);
  const currentPassHash = encryptPassowrd(passowrd, salt);
  return originalPassHash === currentPassHash;
};

于 2022-01-08T09:39:19.830 回答