A method of registering a new user of an online system comprising the steps of: creating a base grid for the user, the base grid comprising a re-creatable pseudo-randomised grid that is unique to the user; receiving and confirming an input from a user comprising a passcode wherein the input from the user comprises an indication of an ordered set of cells in a grid, said grid comprising a plurality of cells each containing a character; generating a passcode identifier from the passcode; generating a grid salt for the user; generating user identifying information for the user; splitting the passcode identifier into k parts using a secret sharing algorithm wherein: q of the k parts are required to regenerate the passcode identifier and k ≥ q; 3 = q; a first part is assigned to be an X-SID and is stored in a first location in an array; a second part is assigned to be a Y-SID and is stored in a second location the array; a third part is assigned to be a Z-SID and is stored in a third location; and p of the k parts are discarded and p ≥ 0; and wherein a X-OTC and a Y-OTC are read from the base grid using the user's passcode; the X-OTC is used as an index for the first part in the array and the position of the first part in the array is returned as x-delta; the Y-OTC is used as an index for the second part in the array and the position of the second part in the array is returned as y-delta; and the third part is stored with the user identifying information; a user token comprising a version, a creation date, an expiry date, the grid salt, x-delta, y-delta, and Z-SID is generated; and the user token is encrypted and passed back to the user for storage. creating a base grid for the user, the base grid comprising a re-creatable pseudo-randomised grid that is unique to the user; receiving and confirming an input from a user comprising a passcode wherein the input from the user comprises an indication of an ordered set of cells in a grid, said grid comprising a plurality of cells each containing a character; generating a passcode identifier from the passcode; generating a grid salt for the user; generating user identifying information for the user; splitting the passcode identifier into k parts using a secret sharing algorithm wherein: q of the k parts are required to regenerate the passcode identifier and k ≥ q; 3 = q; a first part is assigned to be an X-SID and is stored in a first location in an array; a second part is assigned to be a Y-SID and is stored in a second location the array; a third part is assigned to be a Z-SID and is stored in a third location; and p of the k parts are discarded and p ≥ 0; and wherein q of the k parts are required to regenerate the passcode identifier and k ≥ q; 3 = q; a first part is assigned to be an X-SID and is stored in a first location in an array; a second part is assigned to be a Y-SID and is stored in a second location the array; a third part is assigned to be a Z-SID and is stored in a third location; and p of the k parts are discarded and p ≥ 0; and wherein a X-OTC and a Y-OTC are read from the base grid using the user's passcode; the X-OTC is used as an index for the first part in the array and the position of the first part in the array is returned as x-delta; the Y-OTC is used as an index for the second part in the array and the position of the second part in the array is returned as y-delta; and the third part is stored with the user identifying information; a user token comprising a version, a creation date, an expiry date, the grid salt, x-delta, y-delta, and Z-SID is generated; and the user token is encrypted and passed back to the user for storage.