Esempio di design 'stile HMAC' per un segreto condiviso

1

Sto cercando di proteggere un'API basata su una chiave condivisa e un determinato nome utente e datetime. L'API consente l'accesso a terze parti attendibili e non richiede l'input da parte di un utente per accedere al proprio account (ovvero nessun flusso di interazione utente OAuth). La terza parte non sa, né dovrebbe richiedere, la password dell'utente.

/// <summary>
/// Generate a Time/String based Hash from the given DateTimeStamp, Authentication Details 
/// and (Pre-Shared) API Key.
/// </summary>
/// <param name="datetimeStamp">The DateTimeStamp that is to be used to generate the Hash</param>
/// <param name="userName">The UserName that is to be used to generate the Hash</param>
/// <returns>A string based Hash generated from the DateTimeStamp, Username and 
/// Pre-Agreed API Hash Key</returns>
public string GenerateHash(DateTimeOffset dateTimeStamp, string userName)
{
    string hash = string.Empty;
    DateTimeOffset DateStamp = dateTimeStamp.ToUniversalTime();
    string input = string.Format("{0}{1}{2}", DateStamp, userName, PreSharedKey);
    var sha1 = System.Security.Cryptography.SHA1.Create();
    byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input);
    byte[] hashArray = sha1.ComputeHash(inputBytes);
    var hashOutput = new StringBuilder();
    for (int i = 0; i < hashArray.Length; i++)
        hash += hashArray[i].ToString("X2");
    return hash;
}

Un POST viene creato per un'API di autenticazione in questo modo:

{ 
  Hash : "9B970DD40DB803EDB301C5B1CC23DF7B2C5B5FF5", 
  DateTimeStamp : "yyyyMMddHHmmss", 
  UserName : "admin"
}

L'hash è composto da quanto segue: SHA1 (datetime + username + presharedkey).

Un token di autenticazione viene quindi generato e restituito a terzi (token di sessione con una data di scadenza).

Ci sono problemi evidenti con un simile approccio? C'è un modo migliore per fare tale autenticazione quando la terza parte è semi-attendibile, e l'utente non dovrebbe essere tenuto ad autorizzare l'accesso al proprio account?

    
posta Rebecca 30.09.2015 - 13:43
fonte

0 risposte

Leggi altre domande sui tag