PostgreSQL认证插件密码PBKDF2算法疑问

环境信息

  • EMQX 版本:4.4.3
  • 操作系统及版本:CentOS7.8
  • Docker部署

问题描述

我使用 Django 作为后端。 在统一django和emqx的认证时,希望使用django自带的认证方式,即PBKDF2_SHA256,在数据库中表示为:pbkdf2_sha256$260000${salt}${hash},dklen为32:

在auth.pgsql.auth_query中,我从数据库中查询password和salt,分别用password和salt变量替换,查询语句如下:

EMQX配置如下:

EMQX_AUTH__PGSQL__AUTH_QUERY="select split_part(users.password,'$',-1) as password,split_part(users.password,'$',3) as salt from users where username = '%u' limit 1"
EMQX_AUTH__PGSQL__PASSWORD_HASH="pbkdf2,sha256,260000,32"

请问如此配置auth.pgsql.password_hash是否正确呢?是否需要在sha256前后增加salt?

这是 EQMX 内部的加密算法调试,可以使用

./bin/emqx console 

启动。输入下面的命令,把你的设备密码(pwd)和盐(salt)替代掉,看下输出的结果是否可以和数据库对的上

{ok, Hash} = pbkdf2:pbkdf2(sha256,<<"pwd">>, <<"salt">>, 260000,32).
pbkdf2:to_hex(Hash).

并且我尝试了这种算法,260000 的轮次太多了,以至于我的电脑需要约 7 秒才能算出来,不推荐使用这么慢的算法来处理设备登录,很多设备登录的时间可能超时就 5 秒,7 秒可能导致设备直接挂掉登录流程。
这个命令在emqx控制台中执行

timer:tc(fun() -> {ok, Hash} = pbkdf2:pbkdf2(sha256,<<"pwd">>, <<"salt">>, 260000,32), pbkdf2:to_hex(Hash) end).

可以看到执行所需的时间,我算了一次,时间是 7539069,当我把轮次换成10,时间降低了很多

timer:tc(fun() -> {ok, Hash} = pbkdf2:pbkdf2(sha256,<<"pwd">>, <<"salt">>, 10,32), pbkdf2:to_hex(Hash) end).    
{768,
 <<"30b224bf5a7bcc543ba083fff0f16b924104cb97ba6e592f3c52f59ed676140d">>}
1 个赞