aparentemente no se ve tan complejo, pero miremos...
entiendo por lo de la asignación del número para las claves dadas de alta, como un código que las marca como utilizadas; para ello sugeriría crear una tabla en la BD que contenga el histórico de las claves, incluyendo la que se encuentre vigente, permitiendo diferenciarlas por el código (número) que las distinguiría como "dada de alta" o "en uso".
en cuanto a lo de la generación aleatoria por la aplicación, se podría hacer uso del random para que generara números aleatorios los cuales serían los códigos ascii de la contraseña generada, para la conversión de número a caracter se puede utilizar la función char(); posteriormente se ingresa en la tabla con el identificador del usuario a quien se le asocie, se da de baja la anterior... y listo.
Suerte!!!