Tengo un servidor Swift, donde actualmente la autenticación se maneja a través de una combinación simple de correo electrónico y contraseña con hash. Quiero reemplazarlo con un token de acceso (+ caducidad) para poder eliminar el almacenamiento del correo electrónico / contraseña en el dispositivo del usuario final para mejorar la seguridad, facilitando la revocación del acceso desde puntos finales específicos.
Actualmente, la implementación es multiplataforma, por lo que puedo desarrollarlo localmente (xcode, macOS) pero ejecutarlo en mi caja de Ubuntu. Por lo tanto, necesito una forma multiplataforma de generar números aleatorios.
Después de algunas búsquedas, obviamente encontré /dev/urandom
, así que mi pregunta es si esto es lo suficientemente seguro como para usarlo. O debería considerar usar algo como arc4random + chacha20 y, de ser así, ¿por qué y esta implementación es buena?
Estoy planeando usar 128 bits como una longitud, ya que he leído sobre 64 bits simplemente porque no estoy lo suficientemente seguro (aunque probablemente en mi escala lo sería).
para referencia, aquí está mi actual implementación de demostración:
func random_data(_ length: Int) -> Data? {
let stream = open("/dev/urandom", O_RDONLY)
var buffer: [UInt8] = [UInt8](repeating: 0, count: length)
let result = read(stream, &buffer, length)
if result < 0 {
return nil
}
return Data(bytes: buffer)
}
Tengo una función strcmp segura en mi base de código para evitar ataques de temporización, pero en cualquier caso lo más probable es que la divida en 2 int64 para verificación. PD Todavía tengo que averiguar si quiero poner a cero la memoria del token generado aleatoriamente una vez que se haya completado su trabajo. Esta es una tarea tediosa en Swift.