04.03.2017 18:36, Mark Rotteveel wrote:
> I have some problems with using legacy authentication with Firebird 4:
>
> * Using the default existing legacy sysdba/masterke works
> * Creating a new user with the Legacy_UserManager (create user ...
> password '...' using plugin Legacy_UserManager) or with gsec
> (Legacy_UserManager is the first in the list), and trying to login leads
> to an authentication failure
> * Using gsec to alter the password of the legacy sysdba and then trying
> to login leads to an authentication failure (even if I changed to
> masterke or masterkey)
 >
> The above seems to suggest that the Legacy_UserManager is broken when
> hashing passwords. Is that a known issue?

   Issue seems new for (at least to me). The reason is that hash of encrypted
passwords is stored with trailing zero's now (guess it was due to recently
introduced support of BINARY chars). See below:


fb40\temp\x64\debug\firebird>isql SECURITY4.FDB -user sysdba
Database: SECURITY4.FDB, User: SYSDBA
SQL> set list;
SQL> show table plg$users;
PLG$USER_NAME                   (SEC$USER_NAME) VARCHAR(63) Not Null
PLG$GROUP_NAME                  (SEC$USER_NAME) VARCHAR(63) Nullable
PLG$UID                         (PLG$ID) INTEGER Nullable
PLG$GID                         (PLG$ID) INTEGER Nullable
PLG$PASSWD                      (PLG$PASSWD) VARBINARY(64) Not Null
PLG$COMMENT                     (RDB$DESCRIPTION) BLOB segment 80, subtype TEXT 
CHARACTER SET UTF8 Nullable
PLG$FIRST_NAME                  (SEC$NAME_PART) VARCHAR(32) Nullable
PLG$MIDDLE_NAME                 (SEC$NAME_PART) VARCHAR(32) Nullable
PLG$LAST_NAME                   (SEC$NAME_PART) VARCHAR(32) Nullable
CONSTRAINT INTEG_2:
   Primary key (PLG$USER_NAME)
SQL>

Note, PLG$PASSWD have type VARBINARY.

SQL> select plg$user_name, plg$passwd, octet_length(plg$passwd) from plg$users;

PLG$USER_NAME                   SYSDBA
PLG$PASSWD                      
4E4C74776373394C72784C4D4F5968473075474D3969364B53376D66
3351414B764656706D52673D
OCTET_LENGTH                    40

PLG$USER_NAME                   VLAD
PLG$PASSWD                      
5344516E344D62486F466265444C52523246507066304E556E48304D
736B4352764F644A32446F3D000000000000000000000000000000000000000000000000
OCTET_LENGTH                    64

You see the difference. It also explains, why SYSDBA account works.

   Look at fb3:

F:\FB2\fb30\temp\x64\debug\firebird>isql SECURITY3.FDB -user sysdba
Database: SECURITY3.FDB, User: SYSDBA
SQL> set list;
SQL> show table plg$users;
PLG$USER_NAME                   (SEC$USER_NAME) VARCHAR(31) CHARACTER SET 
UNICODE_FSS Not Null
PLG$GROUP_NAME                  (SEC$USER_NAME) VARCHAR(31) CHARACTER SET 
UNICODE_FSS Nullable
PLG$UID                         (PLG$ID) INTEGER Nullable
PLG$GID                         (PLG$ID) INTEGER Nullable
PLG$PASSWD                      (PLG$PASSWD) VARCHAR(64) CHARACTER SET OCTETS 
Not Null
PLG$COMMENT                     (RDB$DESCRIPTION) BLOB segment 80, subtype TEXT 
CHARACTER SET UNICODE_FSS Nullable
PLG$FIRST_NAME                  (SEC$NAME_PART) VARCHAR(32) CHARACTER SET 
UNICODE_FSS Nullable
PLG$MIDDLE_NAME                 (SEC$NAME_PART) VARCHAR(32) CHARACTER SET 
UNICODE_FSS Nullable
PLG$LAST_NAME                   (SEC$NAME_PART) VARCHAR(32) CHARACTER SET 
UNICODE_FSS Nullable
CONSTRAINT INTEG_2:
   Primary key (PLG$USER_NAME)

PLG$PASSWD is VARCHAR(64) CHARACTER SET OCTETS here, and

SQL> select plg$user_name, plg$passwd, octet_length(plg$passwd) from plg$users;

PLG$USER_NAME                   SYSDBA
PLG$PASSWD                      
4E4C74776373394C72784C4D4F5968473075474D3969364B53376D663351414B764656706D52673D
OCTET_LENGTH                    40

PLG$USER_NAME                   VLAD
PLG$PASSWD                      
6C4C493241657136692F6A53524547572B6D5A36444D7A5231384663546758547467684D534D343D
OCTET_LENGTH                    40

there is no trailing zero's.


   I'll commit a fix to ignore that trailing zero's when hashes is compared.


> Also curious: initializing the security database for Srp adds two Srp
> SYSDBA accounts (but it might always have done that).

   I think you mixed two SYSDBA accounts created by different plugins.
See below (security4.fdb just copied from gen\dbs\security.fdb) :

a) default firebird.conf

fb40\temp\x64\Release\firebird>isql SECURITY4.FDB -user sysdba
Database: SECURITY4.FDB, User: SYSDBA
SQL> set list;
SQL> select * from sec$users;
Statement failed, SQLSTATE = 28000
find/display record error
-Install incomplete, please read the Compatibility chapter in the release notes 
for this version
SQL>
SQL> create user SYSDBA password 'masterkey';
SQL> commit;
SQL>
SQL> create user SYSDBA password 'masterkey' using plugin legacy_usermanager;
Statement failed, SQLSTATE = HY000
Missing requested management plugin
SQL> select * from sec$users;

SEC$USER_NAME                   SYSDBA
SEC$FIRST_NAME                  <null>
SEC$MIDDLE_NAME                 <null>
SEC$LAST_NAME                   <null>
SEC$ACTIVE                      <true>
SEC$ADMIN                       <true>
SEC$DESCRIPTION                 <null>
SEC$PLUGIN                      Srp

All as expected.


b) change in firebird.conf
UserManager = Srp, Legacy_UserManager

fb40\temp\x64\Release\firebird>isql SECURITY4.FDB -user sysdba
Database: SECURITY4.FDB, User: SYSDBA
SQL> set list;
SQL> select * from sec$users;

SEC$USER_NAME                   SYSDBA
SEC$FIRST_NAME                  <null>
SEC$MIDDLE_NAME                 <null>
SEC$LAST_NAME                   <null>
SEC$ACTIVE                      <true>
SEC$ADMIN                       <true>
SEC$DESCRIPTION                 <null>
SEC$PLUGIN                      Srp

SEC$USER_NAME                   SYSDBA
SEC$FIRST_NAME                  Sql
SEC$MIDDLE_NAME                 Server
SEC$LAST_NAME                   Administrator
SEC$ACTIVE                      <null>
SEC$ADMIN                       <true>
SEC$DESCRIPTION                 <null>
SEC$PLUGIN                      Legacy_UserManager

SQL> create user SYSDBA password 'masterkey';
Statement failed, SQLSTATE = 23000
add record error
-violation of PRIMARY or UNIQUE KEY constraint "INTEG_5" on table "PLG$SRP"
-Problematic key value is ("PLG$USER_NAME" = 'SYSDBA')
SQL> create user SYSDBA password 'masterkey' using plugin legacy_usermanager;
Statement failed, SQLSTATE = 23000
add record error
-violation of PRIMARY or UNIQUE KEY constraint "INTEG_2" on table "PLG$USERS"
-Problematic key value is ("PLG$USER_NAME" = 'SYSDBA')


Again all as expected.

Regards,
Vlad

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
Firebird-Devel mailing list, web interface at 
https://lists.sourceforge.net/lists/listinfo/firebird-devel

Reply via email to