Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.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
Postgresql 带密码salt的纯ftpd和Postgreql身份验证_Postgresql_Salt_Saltedhash_Pureftpd - Fatal编程技术网

Postgresql 带密码salt的纯ftpd和Postgreql身份验证

Postgresql 带密码salt的纯ftpd和Postgreql身份验证,postgresql,salt,saltedhash,pureftpd,Postgresql,Salt,Saltedhash,Pureftpd,我最近开始了设置PureFTP服务器的任务。在工作中,我们使用Postgresql 8.4。这个模式基本上可以归结为 username text password character(40) password_salt text password存储为sha1(password+salt)的散列。使用Postgresql的pgcrypto,我可以提供用户名和密码,并查看用户是否具有身份验证: SELECT encode( digest( $password |

我最近开始了设置PureFTP服务器的任务。在工作中,我们使用Postgresql 8.4。这个模式基本上可以归结为

username        text
password        character(40)
password_salt   text
password
存储为
sha1(password+salt)
的散列。使用Postgresql的pgcrypto,我可以提供
用户名
密码
,并查看用户是否具有身份验证:

SELECT
 encode( digest( $password ||password_salt, 'sha1' ), 'hex' ) = password
   AS password_correct
 , username
 , password
 , password_salt
FROM contact.person;
现在我遇到的问题是,这样一个函数需要我在查询中输入密码。这在Pureftp当前的auth-postgresql实现中似乎是不可能的。它只支持提供:

\L is replaced by the login of a user trying to authenticate.
\I is replaced by the IP address the client connected to.
\P is replaced by the port number the client connected to.
\R is replaced by the remote IP address the client connected from.
\D is replaced by the remote IPv4 address, as a long decimal number.
还有别的办法吗?我要么需要在查询中输入密码,要么将salt和密码取出,然后找到另一种方法在Pureftp中编写代码

显然,我有另一个选择来编写一个脚本,但是我认为这个基本的salt将得到pg模块的支持

工具书类

    • 我也有同样的问题。然而,编写我自己的自定义身份验证模块将是一件过分的事情,因为可用的pgsql身份验证几乎可以完成我想要的一切。。 以下是我为满足我的需要所做的更改:

      在log_pgsql_p.h中添加
      静态字符*satting
      静态字符*sqlreq\u getsalt{PGSQLSalting',salting},
      {PGSQLGetSalt',sqlreq\u getsalt},
      扩展
      静态配置关键字pgsql\u config\u keywords[]

      在log_pgsql.h中,我添加了
      \define SALT\u SQL\u APPEND“APPEND”
      \define SALT\u SQL\u PREPEND“PREPEND”
      \define SALT\u SQL\u NONE“NONE”

      在log_pgsql.c中,我在
      pw_psql\u check
      函数中做了以下更改:

      我声明
      const char*salt=NULL
      char*salted_密码=NULL在顶部。
      就在
      spwd
      将查询结果分配给
      sqlreq\u getpw
      I added之前

      if (strcasecmp(salting, SALT_SQL_NONE) != 0) {
          salt = pw_pgsql_getquery(id_sql_server, sqlreq_getsalt,
                                   escaped_account, escaped_ip,
                                   escaped_port, escaped_peer_ip,
                                   escaped_decimal_ip);
      }
      
      然后,在进行加密之前:

      if (salt != NULL) {
          int salted_pw_size = strlen(salt) + strlen(password) + 1;
          salted_password = (char *) malloc(salted_pw_size);
          if (strcasecmp(salting, SALT_SQL_APPEND) == 0) {
              strcpy(salted_password, password);
              strcat(salted_password, salt);            
          } else if (strcasecmp(salting, SALT_SQL_PREPEND) == 0) {
              strcpy(salted_password, salt);
              strcat(salted_password, password);
          }
      } else {
          salted_password = (char *) malloc(strlen(password));
          strcpy(salted_password, password);
      }
      
      然后我在对crypt方法(crypt、crypto\u hash\u md5、crypto\u hash\u sha1)的后续调用中将
      password
      参数替换为
      (const char*)salted\u password

      现在剩下要做的就是整理我们分配的内存。特别是带有附加/预加盐的明文密码不应该保留在内存中——如果你愿意,可以称之为偏执狂。因此,在
      bye:
      标签添加之后

      free((void *) salt;
      if(strcasecmp(salting, SALT_SQL_NONE) != 0) {
          volatile char *salted_password_ = (volatile char *) salted_password;
          while(*salted_password_ != 0) {
              *salted_password_++ = 0;
          }
          free((void *) salted_password);
      }
      
      通过这些更改,您的配置文件中现在有两个额外的可用参数:

      • PGSQLSalting:接受“append”(将盐附加到pw)、“prepend”和“none”(不带撇号)
      • PGSQLGetSalt:在这里,您可以在数据库中指定要从中获取salt的字段,这与需要通过PGSQLGetPw检索的加密密码非常相似
      编辑:哦,别忘了在函数结束时释放分配的内存


      我还可以提供一个适用于1.0.36版的diff文件。。不过要小心,我后来在释放salted_密码时添加了if(因为我后来才意识到,如果salted_密码指向password,这可能会导致错误),所以这不在diff中,我懒得更改diff文件://

      我想你必须用艰难的方式来做:用户的密码,明文形式,crypt()ed格式或MD5。Pure FTPd还接受PGSQLCrypt字段的“any”值。使用“any”,所有的散列函数(不是纯文本)都会被尝试。是的,但是它们在没有DB盐的情况下被尝试=(好吧,该死的,那不好。你可能需要挖掘源代码才能找到答案,但它可能接受在md5的d或加密密码前加或后加的salt?我相信/etc/shadow就是这样存储它们的。如果你最终编写了自己的auth,并且可以做任何你想做的事情,那么你应该使用postgres crypt和blowfish算法而不是sha1。