我正在尝试找到一个bcrypt可以在Delphi中使用的实现.关于Googling给我带来的唯一有用的东西就是这个下载页面,其中包含一个叫做winapi单元的翻译标题bcrypt.h.但是,当我查看它提供的功能时,bcrypt.h似乎实际上没有任何方式使用Blowfish算法来散列密码!
我在C中找到了一些bcrypt实现,我可以从中构建DLL并链接到它们,除了它们似乎都需要*nix或GCC特定的,所以这也不起作用!
这有点让我感到困扰.我认为找到一个实现很容易,但事实上似乎并非如此.有谁知道我可以在哪里买到一个?
所以我试图建立一个非常基本的用户登录。我正在尝试创建一个用户,然后使用这些凭据登录并取回 JSON Web 令牌。我被卡住的地方是尝试比较密码然后发送响应。
脚步:
创建用户:
登录
用户模型
email:{
type: String,
required: true,
unique: true
},
password: {
type: String,
required: true
}
Run Code Online (Sandbox Code Playgroud)
用户路线
var express = require('express');
var router = express.Router();
var jwt = require('jsonwebtoken');
var bcrypt = require('bcryptjs');
// Create User
...
bcrypt.genSalt(10, function(err, salt) {
bcrypt.hash("superSecret", salt, function(err, hash) {
user.password = hash;
user.save();
res.json({success: true, message: 'Create user successful'});
});
});
...
// Login
... …Run Code Online (Sandbox Code Playgroud) 我编写了自己的密码编码器,它实现了PasswordEncoderInterface:
class BCryptPasswordEncoder implements PasswordEncoderInterface {
protected $encoder;
public function __construct(BCryptEncoder $encoder) {
$this->encoder = $encoder;
}
public function encodePassword($raw, $salt) {
return $this->encoder->encodeString($raw, $salt);
}
public function isPasswordValid($encoded, $raw, $salt) {
return $this->encoder->encodeString($raw, $salt) == $encoded;
}
}
Run Code Online (Sandbox Code Playgroud)
编码器注册为具有id的服务bcrypt.password.encoder.但我不知道,如何告诉symfony使用它.目前app/config/security.yml看起来像这样:
security:
encoders:
Symfony\Component\Security\Core\User\User: plaintext
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
providers:
neo4j:
id: security.user.provider.neo4j
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
secured_area:
provider: neo4j
pattern: ^/.*
form_login:
check_path: /login_check
login_path: /login
logout:
path: /logout …Run Code Online (Sandbox Code Playgroud) 随着最近(例如LinkedIn)关于密码的讨论,我正在研究密码哈希实现.喝完两杯咖啡和早上读书后,我不再是一个密码学家了.我真的不想假装自己.
使用整数唯一用户ID失败是否有效?(crypt()只使用16位?)
如果我只是一遍又一遍地在哈希上运行sha256(),直到一秒钟用完就能击败蛮力攻击?
如果我必须问这些问题我应该使用bcrypt吗?
目标很简单,如果我的用户的哈希密码被泄露了:
我在#1中读到的是哈希计算必须是昂贵的 - 例如,计算一两秒或者可能需要一点或内存(以阻止硬件解密).
bcrypt有这个内置的,如果我理解正确的话,scrypt更具有前瞻性,并且包含最低内存使用要求.
但是,通过"重新散布"sha256()的结果,需要多次使用几秒钟,然后将最终循环计数与哈希值一起存储以便稍后检查提供的密码,这是一种同样有效的方法吗?
对于#2,为每个密码使用唯一的盐很重要.目前尚不清楚的是盐必须是随机的(或大的).如果目标是避免使用"mypassword"作为密码的每个人拥有相同的哈希,那么仅仅这样做是不够的?:
hash = sha256_hex( unique_user_id + user_supplied_password );
Run Code Online (Sandbox Code Playgroud)
甚至这个,虽然我不确定它会给我什么:
hash = sha256_hex( sha256( unique_user_id ) + user_supplied_password );
Run Code Online (Sandbox Code Playgroud)
使用用户ID可以看到的唯一好处,除了我知道它是唯一的,是避免必须保存盐与哈希.没有多大优势.使用用户的ID作为盐是否存在真正的问题?它没有完成#2吗?
我假设如果有人可以窃取我的用户的哈希密码,那么我必须假设他们可以得到他们想要的任何东西 - 包括生成哈希的源代码.那么,在散列之前向密码添加额外的随机字符串(相同的字符串)是否有任何好处?那是:
# app_wide_string = one-time generated, random 64 7-bit *character* string.
hash = sha256_hex( unique_user_id + app_wide_string + user_supplied_password );
Run Code Online (Sandbox Code Playgroud)
我已经看到了这个建议,但我不明白我从那个用户的盐中得到了什么.如果有人想强行攻击他们会知道"app_wide_string"并在运行他们的字典攻击时使用它,对吗?
如上所述,是否有充分的理由使用bcrypt滚动我自己?也许我问这些问题的理由足够了吗?
顺便说一句 - 我只是计算了我现有的散列函数和我的笔记本电脑,我每秒可以生成大约7000个哈希值.不太经常建议的一两秒钟.
一些相关链接:
当我尝试运行我的应用时,我一直收到此错误:
C:/ruby-2.0.0-p195-i386-mingw32/lib/ruby/gems/2.0.0/gems/activesupport-4.0.0.rc1 /lib/active_support/dependencies.rb:228:in`requirement':无法加载此类文件 - 2 .0/bcrypt_ext(LoadError)
任何接受者? - 我试图使用设计宝石进行基本的用户身份验证..
我正在尝试使用bcrypt-nodejs我的sequelize模型的包,并且想要遵循一个教程将哈希合并到我的模型中,但是我收到了一个错误generateHash.我似乎无法弄清楚这个问题.有没有更好的方法来加入bcrypt?
错误:
/Users/user/Desktop/Projects/node/app/app/models/user.js:26
User.methods.generateHash = function(password) {
^
TypeError: Cannot set property 'generateHash' of undefined
at module.exports (/Users/user/Desktop/Projects/node/app/app/models/user.js:26:27)
at Sequelize.import (/Users/user/Desktop/Projects/node/app/node_modules/sequelize/lib/sequelize.js:641:30)
Run Code Online (Sandbox Code Playgroud)
模型:
var bcrypt = require("bcrypt-nodejs");
module.exports = function(sequelize, DataTypes) {
var User = sequelize.define('users', {
annotation_id: {
type: DataTypes.INTEGER,
autoIncrement: true,
primaryKey: true
},
firstName: {
type: DataTypes.DATE,
field: 'first_name'
},
lastName: {
type: DataTypes.DATE,
field: 'last_name'
},
email: DataTypes.STRING,
password: DataTypes.STRING,
}, {
freezeTableName: true
});
User.methods.generateHash = function(password) {
return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null); …Run Code Online (Sandbox Code Playgroud) 在我将 bcrypt 添加到我的 package.json 之前,一切正常。现在,我收到以下错误消息。
这是我的 package.json 的摘录:
"dependencies": {
"bcrypt": "3.0.6",
"express": "^4.17.1",
"mongodb": "^3.3.1",
"nodemailer": "^6.3.0",
"pm2": "^3.5.1",
"redis": "^2.8.0",
"xlsx": "^0.15.0"
},
Run Code Online (Sandbox Code Playgroud)
这是我的 dockerfile。我正在使用官方节点高山图像。我想知道 alpine 是否已经安装了 phyton。
FROM node:13.5.0-alpine
WORKDIR /usr/app
COPY ./src .
RUN npm install
Run Code Online (Sandbox Code Playgroud)
我在运行 docker-compose 时收到此错误消息:
node-pre-gyp WARN Using request for node-pre-gyp https download
node-pre-gyp WARN Tried to download(404): https://github.com/kelektiv/node.bcrypt.js/releases/download/v3.0.6/bcrypt_lib-v3.0.6-node-v79-linux-x64-musl.tar.gz
node-pre-gyp WARN Pre-built binaries not found for bcrypt@3.0.6 and node@13.5.0 (node-v79 ABI, musl) (falling back to source compile with node-gyp)
gyp ERR! find …Run Code Online (Sandbox Code Playgroud) 我一直在研究bcrypt哈希,当然这个方案的一大好处是它的"适应性".但是,它是如何自适应的,而不仅仅是增加你对SHA-1哈希的迭代量?比如说,而不是SHA-1哈希值1000次,你将它增加到10,000次迭代.这不是达到了同样的目标吗?什么使bcrypt更具适应性?
我正在尝试使用Sinatra和BCrypt实现看似非常简单的身份验证方法,但很明显我错过了一些东西......
用户预先分配了一个临时密码,该密码以明文形式存储在数据库中.
我对临时密码进行身份验证,然后创建一个salt和password_hash并将它们作为字符串写入db(在本例中为mongo).
要进行身份验证,我从db和用户密码中获取salt以进行比较.
post "/password_reset" do
user = User.first(:email => params[:email], :temp_password => params[:temp_password])
if dealer != nil then
password_salt = BCrypt::Engine.generate_salt
password_hash = BCrypt::Engine.hash_secret(params[:password], password_salt)
user.set(:password_hash => password_hash)
user.set(:password_salt => password_salt)
end
end
post "/auth" do
@user = User.first(:email => params[:email])
@user_hash = BCrypt::Password.new(@user.password_hash) #because the password_hash is stored in the db as a string, I cast it as a BCrypt::Password for comparison
if @user_hash == BCrypt::Engine.hash_secret(params[:password], @user.password_salt.to_s) then
auth = true
else
auth = false
end
end …Run Code Online (Sandbox Code Playgroud) 我打电话bcrypt.checkpw检查未加密的密码匹配与存储在凭证数据库中的散列密码,但接收
TypeError:必须在检查之前对Unicode对象进行编码
我该如何解决这个问题?有什么建议吗?
我安装了python 2.7.6,和bcrypt 3.1.1
我有以下代码:
def check_password(password, hashed_password)
if not bcrypt.checkpw(password, hashed_password):
raise InvalidCredentials("403 Forbidden")
else:
return true
Run Code Online (Sandbox Code Playgroud)
并收到以下错误:
文件"/home/qt/virtualenv/lib/python2.7/site-packages/bcrypt/ init .py",第100行,在checkpw
引发TypeError("Unicoed-objects必须在检查之前编码")
TypeError:Unicode-objects必须在检查前进行编码
我调查了一下bcrypt/__init__.py,但我不确定为什么
def checkpw(password, hashed_password):
if (isinstance(password, six.text_type) or
isinstance(hashed_password, six.text_type)):
raise TypeError("Unicode-objects must be encoded before checking")
Run Code Online (Sandbox Code Playgroud) bcrypt ×10
node.js ×3
hash ×2
python ×2
ruby ×2
alpine-linux ×1
cryptography ×1
delphi ×1
devise ×1
docker ×1
encryption ×1
express ×1
gem ×1
javascript ×1
passwords ×1
salt ×1
security ×1
sequelize.js ×1
symfony ×1