ExpressionEngine has most program friendly structure for this.
You can just write 2 db insert commands to save members programatically. Where 1 table would be
exp_members and other one is
For password, You can encrypt it with
md5 algorithm and leave salt and unique key fields blank. When user will login for the first time, password will be encrypted with salt and data will be save in table. (EE handles that.)
I would use this 2 queries to save members:
INSERT INTO `exp_members` (`group_id`, `username`, `screen_name`, `password`, `email`, `ip_address`, `join_date`) VALUES ('5', 'test_user', 'test user', MD5('test_user'), 'firstname.lastname@example.org', '192.168.1.1', '1534230407');
You will then need to fire a select query that will give you member_id of data you just inserted. You can use username, email etc. to filter the result to get member_id. Once you get member_id, you can fire another query in
INSERT INTO `exp_member_data` (`member_id`) VALUES ('$MY_MEMBER_ID');
Note: Create member programatically live above will not validate data with EE validation library. If you want to have this functionality for backend it is fine. But, Use any member plugin for frontend member registration.