Hash 长生不老药&x27;s comeonin似乎没有正确地检查哈希
所以我最近决定在新的一年里学习长生不老药,并且一直在阅读Phoenix framework关于如何在长生不老药中进行web开发的书 到目前为止,我真的很喜欢它,并且已经开始喜欢它了。不过,我遇到了一些关于“进来”软件包的问题 其中一个正在编译,这很好。但是我想知道它是否会引起问题,问题是我在找出如何调试这个问题时遇到了困难Hash 长生不老药&x27;s comeonin似乎没有正确地检查哈希,hash,elixir,phoenix-framework,Hash,Elixir,Phoenix Framework,所以我最近决定在新的一年里学习长生不老药,并且一直在阅读Phoenix framework关于如何在长生不老药中进行web开发的书 到目前为止,我真的很喜欢它,并且已经开始喜欢它了。不过,我遇到了一些关于“进来”软件包的问题 其中一个正在编译,这很好。但是我想知道它是否会引起问题,问题是我在找出如何调试这个问题时遇到了困难 defmodule Rumbl.Auth do import Plug.Conn def init(opts) do Keyword.fetch!(opts
defmodule Rumbl.Auth do
import Plug.Conn
def init(opts) do
Keyword.fetch!(opts, :repo)
end
def call(conn, repo) do
user_id = get_session(conn, :user_id)
user = user_id && repo.get(Rumbl.User, user_id)
assign(conn, :current_user, user)
end
def login(conn, user) do
conn
|> assign(:current_user, user)
|> put_session(:user_id, user.id)
|> configure_session(renew: true)
end
def logout(conn) do
configure_session(conn, drop: true)
end
import Comeonin.Bcrypt, only: [checkpw: 2, dummy_checkpw: 0]
def login_by_username_and_pass(conn, username, given_pass, opts) do
repo = Keyword.fetch!(opts, :repo)
user = repo.get_by(Rumbl.User, username: username)
cond do
user && checkpw(given_pass, user.password_hash) ->
{:ok, login(conn, user)}
user ->
{:error, :unauthorized, conn}
true ->
dummy_checkpw()
{:error, :not_found, conn}
end
end
end
这就是代码,所有内容都在编译,我可以看到它被正确地发送。但由于某些原因,密码从未被解析。我使用密码“password”创建了另一个用户,甚至做了如下操作:
checkpw("password", "$2b$12$aa4dos3r4YwX7HKgj.JiL.bEzg42QjxBvWwm5M")
只是想看看我是不是在传递信息,显然这是我数据库中的散列,这也不起作用。我不知道我做错了什么,或者因为这是我第一次使用Bcrypt,如果我使用库本身的话,我不能100%确定盐渍是如何工作的
我正在使用以下内容对密码进行哈希运算:
defp put_pass_hash(changeset) do
case changeset do
%Ecto.Changeset{valid?: true, changes: %{password: pass}} ->
put_change(changeset, :password_hash, Comeonin.Bcrypt.hashpwsalt(pass))
_ ->
changeset
end
end
我已经检查了我能想到的所有东西,看起来都是正确的,但是出于某种原因,Comeonin没有正确地比较密码。任何帮助都将不胜感激,谢谢 我遇到的问题与长生不老药或科莫宁图书馆无关
我只允许我的密码使用45的Varchar,这会截断响应。我打算把这个放在这里,以防将来有人做这种傻事 你说“不行”是什么意思?你有错误吗?我不是加密专家,但根据我自己的测试,我不相信
“$12$aa4dos3r4YwX7HKgj.JiL.bEzg42QjxBvWwm5M”
是有效的bcrypt字符串。这是一个复制粘贴错误,还是数据库中实际存在的错误?呃,粘贴时是一个错误,现在已更新。是的,这就是我的数据库中的新版本。在书中的某一点上,他们告诉你做一些类似于config:comeonin,bcrypt\u log\u rounds:4,pbkdf2\u rounds:1
到config/test.exs
。在将用户和密码插入数据库后,是否可以将其放入config/dev.exs
甚至config/config.exs
?或者你有没有可能输入了错误的密码?你能做到hash=Comeonin.Bcrypt.hashpwsalt(“密码”);Comeonin.Bcrypt.checkpw(“密码”,散列)在项目内部使用iex-S mix
?Hrmm我明白你的意思,但这一点实际上比我在Elixir测试部分的位置提前了几章。我也做了iex-S的混音,效果很好。奇怪的是,我正在通过IO.puts“给定密码”IO.puts“给定密码”IO.puts“用户密码散列”IO.puts User.password\U散列检查输入,它看起来是正确的。因此,有趣的是,如果我检查密码,如Comeonin.Bcrypt.checkpw(“密码”,“2b$12$aa4dos3r4YwX7HKgj.JiL.bEzg42QjxBvWwm5M”)
它确实坏了,这就是我正在检查的。