безопасная авторизация HMAC с изменением подписи - PullRequest
0 голосов
/ 04 октября 2018

У меня есть приложение Rails, которое предоставляет JSON API, который используется скриптом Python.Безопасность важна, и я использую HMAC, чтобы сделать это.приложение rails и скрипт python знают секретный ключ, а подпись, которую они зашифровывают, - это URL-адрес и тело запроса.

Моя проблема в том, что подпись запроса не меняется каждыйвремя.Если он был перехвачен, злоумышленник может отправить точно такой же запрос с тем же дайджестом, и я думаю, что он будет аутентифицирован, хотя злоумышленник не знает секретный ключ.

Так что я думаю, что мне нужно что-то получитькак временная метка запроса, включенного в подпись - проблема в том, что я не знаю, как это сделать в python и ruby.

Это мой код python:

import hmac
import hashlib
import requests

fetch_path = url_base + '/phone_messages/pending'
fetch_body = '{}'
fetch_signature = fetch_path + ':' + fetch_body
fetch_hmac = hmac.new(api_key.encode('utf-8'), fetch_signature.encode('utf-8'), haslib.sha1).hexdigest()

а это мой рубиновый код:

signature = "#{request.url}:#{request.body.to_json.to_s}"
hmac_digest = OpenSSL::HMAC.hexdigest('sha1', secret_key, signature)

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Я решил эту проблему, поместив метку времени (секунды с начала эпохи) в тело запроса post или параметр запроса get.Я просто использовал метку времени в качестве сигнатуры для кодирования, что означает, что хэш HMAC различен для каждого запроса, который поступает в разные секунды.

Затем, чтобы не дать злоумышленнику просто использовать ранее просмотренную метку времени, которую я проверил на серверечто метка времени не более чем за 5 секунд до текущего.

Злоумышленник с очень быстрым поворотом перехвата сообщения и отправке атаки все еще может пройти, но я не смог сбросить тайм-аут ниже 5секунд, потому что уже поступает время ожидания некоторых запросов.

Так как все это делается по протоколу SSL, я думаю, что оно должно быть достаточно безопасным.

0 голосов
/ 04 октября 2018

Вопрос : мне нужно что-то вроде отметки времени запроса, включенного в подпись

Например:

import hmac, hashlib, datetime

api_key = 'this is a key'
fetch_path = 'http://phone_messages/pending'
fetch_body = '{}'
fetch_data = fetch_path + ':' + fetch_body


for n in range(3):
    fetch_signature = fetch_data + str(datetime.datetime.now().timestamp() )
    fetch_hmac = hmac.new(api_key.encode('utf-8'), fetch_signature.encode('utf-8'), hashlib.sha1).hexdigest()
    print("{}:{} {}".format(n, fetch_signature, fetch_hmac))

Вывод :

0:http://phone_messages/pending:{}1538660666.768066 cfa49feaeaf0cdc5ec8bcf1057446c425863e83a
1:http://phone_messages/pending:{}1538660666.768358 27d0a5a9f33345babf0c824f45837d3b8863741e
2:http://phone_messages/pending:{}1538660666.768458 67298ad0e9eb8bb629fce4454f092b74ba8d6c66

Я рекомендовал для обсуждения Безопасность на security.stackexchange.com .
В качестве отправной точки прочитайте: что такое "ключ аутентификации в безопасности компьютеров"

...