Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hash 长生不老药&x27;s comeonin似乎没有正确地检查哈希_Hash_Elixir_Phoenix Framework - Fatal编程技术网

Hash 长生不老药&x27;s comeonin似乎没有正确地检查哈希

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

所以我最近决定在新的一年里学习长生不老药,并且一直在阅读Phoenix framework关于如何在长生不老药中进行web开发的书

到目前为止,我真的很喜欢它,并且已经开始喜欢它了。不过,我遇到了一些关于“进来”软件包的问题

其中一个正在编译,这很好。但是我想知道它是否会引起问题,问题是我在找出如何调试这个问题时遇到了困难

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”)
它确实坏了,这就是我正在检查的。