我之所以学习灵丹妙药只是因为互联网上的很多文章都承诺它的响应时间不到一毫秒。我昨天构建了我的第一个应用程序,但我发现它的性能比rails更快。发生了什么?
让我解释一下我的应用。它实现了ecto-secure-password
包提供的基本身份验证机制:
defmodule HelloPhoenix.User do
use HelloPhoenix.Web, :model
use SecurePassword
schema "users" do
field :first_name, :string
field :last_name, :string
field :username, :string
has_secure_password
end
end
这是我的控制人员:
defmodule HelloPhoenix.SessionController do
use HelloPhoenix.Web, :controller
def create(conn, %{ "session" => %{ "username" => username, "password" => password }}) do
if user = HelloPhoenix.User.authenticate(HelloPhoenix.Repo.get_by(HelloPhoenix.User, username: username), password) do
conn
|> put_session(:user_id, user.id)
|> json(UserSerializer.run(user))
else
conn
|> put_status(422)
|> json(%{})
end
end
end
所以,我使用这些命令:
MIX_ENV=prod mix compile
MIX_ENV=prod mix phoenix.server
失败的响应时间&成功的认证大约是~130ms,而轨道响应时间大约是150ms。我做错了什么?
答案 0 :(得分:5)
它“慢”,因为密码散列函数(在这种情况下为bcrypt)故意慢,以避免暴力攻击。我不认为你应该担心它,因为你只需要在用户登录时散列,而不是每次请求。另一方面,攻击者每次尝试密码时都需要付出代价。
但是,建议在运行测试代码时减少轮次,因为在每个请求上创建用户会使测试速度变慢。慢速测试使开发人员不经常运行它们,这是不好的。
ecto-secure-password
使用comeonin
,因此,如果您想在测试环境中加快速度(不在生产中使用它,因为它根本不安全) ,您可以将其配置为仅使用几轮。
将此附加到config / test.exs:
config :comeonin, :bcrypt_log_rounds, 4
config :comeonin, :pbkdf2_rounds, 1
瞧,生产是有保障的,而你的测试仍然很快(我的测试从15秒到<1秒)。
答案 1 :(得分:1)
自comeonin
库的v5版本开始,哈希实现已拆分为各个库,因此提供的配置将需要根据所使用的哈希库进行更改:
config :bcrypt_elixir, :log_rounds, 1
config :pbkdf2_elixir, :rounds, 1
config :argon2_elixir,
t_cost: 1,
m_cost: 8
答案 2 :(得分:-2)
我明白了。原因是bcrypt
。我不知道为什么它很慢,但如果我把它从循环中删除,一切都很快