Ho un server veloce, dove attualmente l'autenticazione viene gestita tramite una semplice combinazione di email + password hash. Voglio rimpiazzarlo con un token di accesso (+ scadenza), così posso rimuovere lo spazio di archiviazione della posta elettronica / password sul dispositivo degli utenti finali per migliorare leggermente la sicurezza, rendendo più semplice revocare l'accesso da punti finali specifici.
Attualmente l'implementazione è multipiattaforma, quindi posso sviluppare localmente (xcode, macOS) ma eseguirlo sulla mia scatola di Ubuntu. Quindi ho bisogno di un modo multipiattaforma per generare numeri casuali.
Dopo alcune ricerche ovviamente ho trovato /dev/urandom
, quindi la mia domanda è abbastanza sicura da usare? O dovrei esaminare l'utilizzo di qualcosa come arc4random + chacha20 e se sì, perché e questa implementazione è valida?
Sto pensando di usare 128 bit come lunghezza, dato che ho letto di 64 bit semplicemente non essendo abbastanza sicuro (anche se probabilmente sulla mia scala sarebbe.)
per riferimento, ecco la mia attuale implementazione demo:
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)
}
Ho una funzione strcmp sicura nella mia base di codice per prevenire gli attacchi di temporizzazione, ma in ogni caso probabilmente lo dividerò in 2 int64 per la verifica. Post scriptum Devo ancora capire se voglio azzerare la memoria del token generato casualmente dopo che il suo lavoro è finito. Questo è un compito noioso in fretta.