我想在将数据存储到数据库之前使用node.js bcrypt来哈希密码.
此链接提供文档. https://github.com/kelektiv/node.bcrypt.js
以下是散列密码的示例.
var bcrypt = require('bcrypt');
const saltRounds = 10;
const myPlaintextPassword = 's0/\/\P4$$w0rD';
var salt = bcrypt.genSaltSync(saltRounds);
var hash = bcrypt.hashSync(myPlaintextPassword, salt);
// Store hash in your password DB.
Run Code Online (Sandbox Code Playgroud)
这是检查密码的代码.
// Load hash from your password DB.
bcrypt.compareSync(myPlaintextPassword, hash); // true
Run Code Online (Sandbox Code Playgroud)
这是我不明白的.在bcrypt.compareSync,为什么没有参数salt?由于散列是从salt生成的,为什么比较明文密码不涉及散列中使用的原始盐?
似乎org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder没有返回生成的密码 salt:
public String encode(CharSequence rawPassword) {
String salt;
if(this.strength > 0) {
if(this.random != null) {
salt = BCrypt.gensalt(this.strength, this.random);
} else {
salt = BCrypt.gensalt(this.strength);
}
} else {
salt = BCrypt.gensalt();
}
return BCrypt.hashpw(rawPassword.toString(), salt);
}
Run Code Online (Sandbox Code Playgroud)
问题:这是为什么目的而设计的?如何使用它,因为它不返回应该存储用于密码检查的salt?
它工作了一段时间,但现在由于某种原因它产生了异常.我有自定义用户实体,它扩展了FOS用户:
namespace AppBundle\Entity;
use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="AppBundle\Repository\UserRepository")
* @ORM\Table(name="fos_user")
*/
class User extends BaseUser
{
...
}
Run Code Online (Sandbox Code Playgroud)
我的自定义类中没有setSalt().正如我在转储SQL查询中看到的那样,其他非自定义字段(email_canonical,enabled,password,...)设置正确.我还能检查什么?
UPDATE
我做了作曲家更新.这是我的composer.json
"require": {
"php": ">=5.5.9",
"symfony/symfony": "3.2.*",
"doctrine/orm": "^2.5",
"doctrine/doctrine-bundle": "^1.6",
"doctrine/doctrine-cache-bundle": "^1.2",
"symfony/swiftmailer-bundle": "^2.3",
"symfony/monolog-bundle": "^2.8",
"symfony/polyfill-apcu": "^1.0",
"sensio/distribution-bundle": "^5.0",
"sensio/framework-extra-bundle": "^3.0.2",
"incenteev/composer-parameter-handler": "^2.0",
"friendsofsymfony/user-bundle": "~2.0@dev",
"hwi/oauth-bundle": "^0.5.1",
"twig/extensions": "^1.4"
},
Run Code Online (Sandbox Code Playgroud) 使用golang.org/x/crypto/bcrypt和GORM(http://gorm.io/docs/)我正在尝试加密密码。问题在于,每种加密方式每次都不同,因此它永远无法与数据库中的加密方式匹配。
var result []string
password := []byte(data.Password)
encryptedPassword, err := bcrypt.GenerateFromPassword(password, bcrypt.DefaultCost) // different every time
db.Where(&User{Username: strings.ToLower(data.Username)}).First(&user).Pluck("password", &result)
encryptionErr := bcrypt.CompareHashAndPassword(encryptedPassword, []byte(result[0]))
if encryptionErr == nil { // passwords match! }
Run Code Online (Sandbox Code Playgroud)
我已经确认每次输入都是相同的,并且数据库提供的密码是正确的。
我在这里做错了什么?
我正在使用 :
FOSuserbundle安装得很好,并且就像一个护身符。我注意到在数据库中的用户表中,“盐”列始终为空:
以下是我的security.yml文件的摘录:
security:
encoders:
FOS\UserBundle\Model\UserInterface: bcrypt
Run Code Online (Sandbox Code Playgroud)
为了记录,我添加了2个用户,并添加了命令“ fos:user:create”。
这正常吗?
在此代码中,第一个函数Findaccount()将在数据库中查找电子邮件地址和以哈希形式存在的密码。所以CompareHashAndPassword()比较哈希和密码。
现在在handler.go文件中,我调用loginData()了一个允许用户登录的函数。我在这里遇到了问题。我调用了database.Findaccount(email, password, hash)函数,但它只是验证电子邮件地址,不验证
正确的密码,并给我false消息。
但是如果我这样调用函数database.Findaccount(email, "1234", hash),它会同时验证电子邮件和密码。
如何解决这个问题,因为我将无法记住每个密码。
数据库
func Findaccount(myEmail, myPassword, hash string) bool {
collection := Connect.Database("WebApp2").Collection("dataStored")
if err := collection.FindOne(context.TODO(), bson.M{"email": myEmail}).Decode(&Account); err != nil {
fmt.Println("Enter the correct email or password")
}
err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(myPassword))
return err == nil
}
Run Code Online (Sandbox Code Playgroud)
处理程序
func HashPassword(password string) (string, error) {
bytes, err := bcrypt.GenerateFromPassword([]byte(password), 14)
return string(bytes), err
}
func loginData(w http.ResponseWriter, …Run Code Online (Sandbox Code Playgroud) go ×2
symfony ×2
bcrypt ×1
doctrine-orm ×1
encryption ×1
java ×1
node.js ×1
passwords ×1
spring ×1
symfony-3.4 ×1