我想在数据库中存储散列密码(使用BCrypt).什么是好的类型,哪个是正确的长度?密码是否与BCrypt长度相同?
编辑
示例哈希:
$2a$10$KssILxWNR6k62B7yiX0GAe2Q7wwHlrzhF3LqtVvpyvHZf0MwvNfVu
在对一些密码进行哈希处理之后,似乎BCrypt总是生成60个字符的哈希值.
编辑2
很抱歉没有提及实施.我正在使用jBCrypt.
在存储之前对密码进行两次哈希处理的安全性是否比仅仅哈希一次更安全?
我在说什么是这样做的:
$hashed_password = hash(hash($plaintext_password));
Run Code Online (Sandbox Code Playgroud)
而不仅仅是这个:
$hashed_password = hash($plaintext_password);
Run Code Online (Sandbox Code Playgroud)
如果它不太安全,你能提供一个很好的解释(或链接到一个)吗?
此外,使用的哈希函数是否有所作为?如果混合使用md5和sha1(例如)而不是重复相同的散列函数,它会有什么不同吗?
注1:当我说"双重哈希"时,我正在谈论两次哈希密码以试图使其更加模糊.我不是在谈论解决碰撞的技术.
注2:我知道我需要添加一个随机盐来真正使其安全.问题是使用相同算法进行两次散列是否有助于或损害散列.
我不确定密码哈希是如何工作的(将在以后实现),但现在需要创建数据库模式.
我正在考虑将密码限制为4-20个字符,但据我所知,加密后的哈希字符串将具有不同的长度.
那么,如何将这些密码存储在数据库中?
我建立了一个带有Node.js + passport的站点,用于用户身份验证.
现在我需要迁移到Golang,并且需要使用db中保存的用户密码进行身份验证.
Node.js加密代码是:
var bcrypt = require('bcrypt');
bcrypt.genSalt(10, function(err, salt) {
if(err) return next(err);
bcrypt.hash(user.password, salt, function(err, hash) {
if(err) return next(err);
user.password = hash;
next();
});
});
Run Code Online (Sandbox Code Playgroud)
如何使用Golang与Node.js bcrypt创建相同的散列字符串?
Rails会话中的"数据"如下所示:
{"warden.user.user.key" => [[1], "long-random-string"]}
Run Code Online (Sandbox Code Playgroud)
1是用户ID.什么是长随机字符串?
这是由Rails或Devise处理/使用的东西吗?
我正在使用带有Spring安全性的BCryptPasswordEncoder.但问题是它为同一输入生成不同的编码密码.
String password = "123456";
PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String encodedPassword = passwordEncoder.encode(password);
System.out.print(encodedPassword);
Run Code Online (Sandbox Code Playgroud)
每次产生不同的输出.
根据我从盐析中理解的更加安全的加密密码,我会生成一个随机数(盐)并将其与散列密码一起存储在用户记录中(例如).我会将盐与明文连接起来密码,然后加密(哈希).产生的哈希将难以破解.将重复此过程以验证密码.
看看has_secure_password和bcrypt_ruby(披露:我不是安全专家)我不知道如何做到这一点,因为用户记录中存储的唯一内容是哈希密码.盐在哪里?
在rails中使用has_secure密码时,如何在创建密码摘要时更改BCrypt使用的默认成本因素?
我想这样做是因为所使用的默认成本因数-10-显然有点低(本文建议至少将其设置为12)。
我想知道如何使用,Hash::needsRehash()因为我正在努力看到使用文档的确切内容.
if (Hash::needsRehash($hashed)) {
$hashed = Hash::make('plain-text');
}
Run Code Online (Sandbox Code Playgroud)
究竟是什么原因导致Hash::needsRehash()返回true或false,如果散列密码在另一个散列(例如MD5,SHA1等)中,它是否返回true?
如果您的数据库在另一个算法中充满了哈希值并Hash::needsRehash()返回true,那么您将如何重新设置用户密码以使它们是最新的?你不能依赖"登录"密码,因为它需要先进行比较才能验证,对吧?
我想也许我在思考问题,但我现在很困惑.幸运的是我的用户密码仍在使用password_hash(),所以不应该是一个问题.
我使用加密https://nodejs.org/api/crypto.html进行密码加密和身份验证.我正在处理更改密码页面,并且在确定用户提供的密码是否具有与现有密码相同的哈希值时遇到问题.以下是我的代码.
var createSalt = function createSalt() {
return crypto.randomBytes(128).toString('base64');
};
var hashPwd = function hashPwd(salt, pwd) {
var hmac = crypto.createHmac('sha256', salt);
return hmac.update(pwd).digest('hex');
};
//use password , create salt, hash and compare with the existing
var salt = createSalt();
var passHash = hashPwd(salt,data.Password);
console.log('the password is', user.PassHash === passHash);
Run Code Online (Sandbox Code Playgroud)
我期待上面的控制台消息在现有用户密码匹配时打印为true.但是,这两个哈希似乎根本不匹配.请问我错过了什么?怎么做到这一点?我想确保用户密码与他现有的密码匹配后才能更改新密码.任何帮助,将不胜感激.