【问题标题】:Elixir's comeonin does not seem to be checking hashes correctlyElixir 的 Comeonin 似乎没有正确检查哈希
【发布时间】:2023-03-27 22:23:01
【问题描述】:

所以我最近决定在新的一年学习 Elixir,并且一直在阅读 Phoenix 框架关于如何在 Elixir 中进行 Web 开发的书。

到目前为止,我真的很喜欢它,并且已经开始喜欢这种语言。不过,我在使用 Come-on-in 包时遇到了一些问题。

有人正在编译它,这很好。但我想知道它是否会导致问题,问题是我无法弄清楚如何调试这个问题。

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 没有正确比较密码。任何帮助将不胜感激,谢谢!

【问题讨论】:

  • 你说“不起作用”是什么意思?你有错误吗?我不是加密专家,但根据我自己的测试,我不相信"$12$aa4dos3r4YwX7HKgj.JiL.bEzg42QjxBvWwm5M" 是一个有效的 bcrypt 字符串。这是复制粘贴错误还是您的数据库中的实际情况?
  • Err 那是我粘贴时出错,现在更新了。但是是的,这就是我的数据库中的内容,带有新的更新版本。
  • 在书中的某一时刻,他们告诉您将config :comeonin, bcrypt_log_rounds: 4, pbkdf2_rounds: 1 转换为config/test.exs。在您已经将用户和密码插入数据库之后,您是否可以将其放入config/dev.exs 甚至config/config.exs?还是有可能您输入了错误的密码?你可以在项目中使用iex -S mix 来做hash = Comeonin.Bcrypt.hashpwsalt("password"); Comeonin.Bcrypt.checkpw("password", hash) 吗?
  • 嗯,我明白你在说什么,但这实际上比我在 Elixir 测试部分的位置要早几章。我也做了 iex -S 混合,这很好用。奇怪的是,我正在通过IO.puts "Given Pass" IO.puts given_pass IO.puts "User password hash" IO.puts user.password_hash 检查输入,它看起来是正确的。
  • 所以有趣的是,如果我检查Comeonin.Bcrypt.checkpw("password", "$2b$12$aa4dos3r4YwX7HKgj.JiL.bEzg42QjxBvWwm5M") 之类的密码,它确实会损坏,这就是我正在检查的内容。

标签: hash elixir phoenix-framework


【解决方案1】:

我遇到的问题与 Elixir 或 Comeonin 库无关!

我只允许 45 的 Varchar 作为我的密码,并且它正在截断响应。我只是把它留在这里,以防将来有人做这种愚蠢的事情!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-25
    • 2010-09-08
    • 2016-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    相关资源
    最近更新 更多