Ecco una funzione che utilizza hashlib che ha funzionato abbastanza bene per me:
def generate_hash_key():
"""
@return: A hashkey for use to authenticate agains the API.
"""
return base64.b64encode(hashlib.sha256(str(random.getrandbits(256))).digest(),
random.choice(['rA', 'aZ', 'gQ', 'hH', 'hG', 'aR', 'DD'])).rstrip('==')
Una possibile soluzione per implementare questo in app potrebbe essere applicando un decoratore su ogni percorso che si desidera proteggere.
Esempio:
def get_apiauth_object_by_key(key):
"""
Query the datastorage for an API key.
@param ip: ip address
@return: apiauth sqlachemy object.
"""
return model.APIAuth.query.filter_by(key=key).first()
def match_api_keys(key, ip):
"""
Match API keys and discard ip
@param key: API key from request
@param ip: remote host IP to match the key.
@return: boolean
"""
if key is None or ip is None:
return False
api_key = get_apiauth_object_by_key(key)
if api_key is None:
return False
elif api_key.ip == "0.0.0.0": # 0.0.0.0 means all IPs.
return True
elif api_key.key == key and api_key.ip == ip:
return True
return False
def require_app_key(f):
"""
@param f: flask function
@return: decorator, return the wrapped function or abort json object.
"""
@wraps(f)
def decorated(*args, **kwargs):
if match_api_keys(request.args.get('key'), request.remote_addr):
return f(*args, **kwargs)
else:
with log_to_file:
log.warning("Unauthorized address trying to use API: " + request.remote_addr)
abort(401)
return decorated
E quindi è possibile utilizzare il decoratore in quanto tale:
@require_app_key
def delete_cake(version, cake_id):
"""
Controller for API Function that gets a cake by ID
@param cake_id: cake id
@return: Response and HTTP code
"""
Questo esempio utilizza SQLAlchemy per memorizzare le chiavi nel database (Si potrebbe utilizzare SQLite).
È possibile vedere l'implementazione qui: https://github.com/haukurk/flask-restapi-recipe.
fonte
2014-07-11 19:56:12
* in genere creando un hash MD5 di qualche sottoinsieme di informazioni utente + informazioni un po 'casuali (come l'ora corrente) * No, non farlo. Tutto quello che devo fare è immaginare quanti anni ha l'account di qualcuno e poi andare alle gare perché lo spazio delle chiavi che devo testare ora è molto, molto piccolo. –
Come si ottiene l'informazione che l'ora in cui la chiave è stata creata fa parte dell'hash in primo luogo? E come fai a sapere a che parte contribuisce? – jknupp
https://www.google.com/search?q=samy+how+i+met+your+girlfriend spiega alcuni esempi di busting entropy e alcuni altri hack. (Attenzione, è un po 'strano, ma è una presentazione tecnicamente valida.) –