Disclaimer This is what I used for a similar situation a couple of years ago. I did not like it too much, with all the associations and triggers that we had to do. If someone has a better approach, write!
From what I understand, if you think the field names can change, you should have a master data table that tracks the field information. You will need to have one history table for the master data and one for the actual user table. As one of the posters said above, you can use triggers to write to the correct history table when one of the tables changes.
table editable_fields id field_name created/modified_by/date
sample entries = {(1, user), (2, first_name), (3, last_name)}
table user id field1_value field2_value field3_value created/modified_by/date
sample entries = {(1, johnsmith, John, Smith), (2, janedoe, Jane, Doe)}
table user_fields_mapping id -- FKs to editable_fields.id field1_editable_id field2_editable_id field3_editable_id
sample entries = {(1, 1, 2, 3), (2, 1, 2, 3), (3, 1, 2, 3)}