2016-05-13 4 views
1

Я недавно задал здесь еще один вопрос относительно python, фляги с исключением badsignature для сеансов (https://stackoverflow.com/questions/37158432/python-flask-session-cookie-bad-signature-exception), и я некоторое время работаю с этой проблемой, а другая проблема.Python3, hmac возвращает неправильный результат ?! ARM71, 32bit

При подписании сеанса на стороне клиента для моей фляги hmac используется для хеширования подписи. На моем персональном компьютере это работает нормально, но при переносе этого на встроенное устройство, построенное для этого приложения, hmac иногда не может хэшировать ключ (неправильный вывод), что делает данные сеанса недействительными.

Я сделал небольшую тестовую программу, запускающую hmac.new() & .update() несколько раз (10000) без каких-либо ошибок (на целевой машине). Но когда вызов сделан внутри приложения фляги, ошибка возникает примерно в 60% вызовов.

Вызов производится внутри "derive_key" метод itsdangerous.py и это выглядит следующим образом:

def derive_key(self): 
     """This method is called to derive the key. If you're unhappy with 
     the default key derivation choices you can override them here. 
     Keep in mind that the key derivation in itsdangerous is not intended 
     to be used as a security method to make a complex key out of a short 
     password. Instead you should use large random secret keys. 
     """ 
     salt = want_bytes(self.salt) 
     if self.key_derivation == 'concat': 
      return self.digest_method(salt + self.secret_key).digest() 
     elif self.key_derivation == 'django-concat': 
      return self.digest_method(salt + b'signer' + 
       self.secret_key).digest() 
     elif self.key_derivation == 'hmac': 
      mac = hmac.new(self.secret_key, digestmod=self.digest_method) 
      print("mac1:", binascii.hexlify(mac.digest())) #1 
      mac.update(salt) 
      print("mac2:", binascii.hexlify(mac.digest())) #2 
      return mac.digest() 
     elif self.key_derivation == 'none': 
      return self.secret_key 
     else: 
      raise TypeError('Unknown key derivation method') 

digestmod = hashlib.sha1

С secret_key = b'testing»и соли = b'cookie-session 'ожидаемый выход:

mac1: b'6ab6fc891eefd3b78743ea28b1803811561a7c9b' 
mac2: b'd58bd52b4ced54374ea5baca0b6aa52b0e03af74' 

Но много раз эти значения различаются. Я также видел, что результат mac1 & mac2 равен! как соль не изменила результат.

Я также задал этот вопрос здесь: https://github.com/pallets/flask/issues/1808

Это приложение работает на ARM7, 32bit. Все библиотеки, установленные с помощью yocto.

UPDATE: Для каждого вызова derive_key() Я также распечатать соль и ключ: Выход на пару запросов заключается в следующем: «OK»

...: OPEN THE SESSION  OK! 
...: DERIVE KEY: 
...: Salt: b'cookie-session' 
...: Key: b'testing' 
...: mac1: b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
...: mac2: b'\xd5\x8b\xd5+L\xedT7N\xa5\xba\xca\x0bj\xa5+\x0e\x03\xaft' 
...: .-.-.-.-.-.-. 
...: SAVES THE SESSION  OK! 
...: DERIVE KEY: 
...: Salt: b'cookie-session' 
...: Key: b'testing' 
...: mac1: b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
...: mac2: b'\xd5\x8b\xd5+L\xedT7N\xa5\xba\xca\x0bj\xa5+\x0e\x03\xaft' 
...: .-.-.-.-.-.-. 
...: OPEN THE SESSION  NOT OKAY!! 
...: DERIVE KEY: 
...: Salt: b'cookie-session' 
...: Key: b'testing' 
...: mac1: b'\xc8D\xf0\x95\xc5R\x9f\xe3n\xc7\xa2 `7\xa9\xdb\xdd\xd8F\x85' 
...: mac2: b'\x156\xbf\xb6\x97}m\xe9[\xe0\xea\xd15\xb4\xff\x00\xf9\x14B\x0c' 
...: .-.-.-.-.-.-. 
...: SAVES THE SESSION  OK! 
...: DERIVE KEY: 
...: Salt: b'cookie-session' 
...: Key: b'testing' 
...: mac1: b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
...: mac2: b'\xd5\x8b\xd5+L\xedT7N\xa5\xba\xca\x0bj\xa5+\x0e\x03\xaft' 
...: .-.-.-.-.-.-. 
...: OPEN THE SESSION  OK! 
...: DERIVE KEY: 
...: Salt: b'cookie-session' 
...: Key: b'testing' 
...: mac1: b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
...: mac2: b'\xd5\x8b\xd5+L\xedT7N\xa5\xba\xca\x0bj\xa5+\x0e\x03\xaft' 
...: .-.-.-.-.-.-. 
...: SAVES THE SESSION  OK! 
...: DERIVE KEY: 
...: Salt: b'cookie-session' 
...: Key: b'testing' 
...: mac1: b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
...: mac2: b'\xd5\x8b\xd5+L\xedT7N\xa5\xba\xca\x0bj\xa5+\x0e\x03\xaft' 
...: .-.-.-.-.-.-. 
...: OPEN THE SESSION  OK! 
...: DERIVE KEY: 
...: Salt: b'cookie-session' 
...: Key: b'testing' 
...: mac1: b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
...: mac2: b'\xd5\x8b\xd5+L\xedT7N\xa5\xba\xca\x0bj\xa5+\x0e\x03\xaft' 
...: .-.-.-.-.-.-. 
...: SAVES THE SESSION  OK! 
...: DERIVE KEY: 
...: Salt: b'cookie-session' 
...: Key: b'testing' 
...: mac1: b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
...: mac2: b'\xd5\x8b\xd5+L\xedT7N\xa5\xba\xca\x0bj\xa5+\x0e\x03\xaft' 
...: .-.-.-.-.-.-. 
...: OPEN THE SESSION  NOT OKAY!! 
...: DERIVE KEY: 
...: Salt: b'cookie-session' 
...: Key: b'testing' 
...: mac1: b'D\xdaR}\xa0\xf2\x9awpP\xa0\x018b\xfcfH}\xcau' 
...: mac2: b'\xd5\x8b\xd5+L\xedT7N\xa5\xba\xca\x0bj\xa5+\x0e\x03\xaft' 
...: .-.-.-.-.-.-. 
...: SAVES THE SESSION  OK! 
...: DERIVE KEY: 
...: Salt: b'cookie-session' 
...: Key: b'testing' 
...: mac1: b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
...: mac2: b'\xd5\x8b\xd5+L\xedT7N\xa5\xba\xca\x0bj\xa5+\x0e\x03\xaft' 
...: .-.-.-.-.-.-. 
...: OPEN THE SESSION  OK! 
...: DERIVE KEY: 
...: Salt: b'cookie-session' 
...: Key: b'testing' 
...: mac1: b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
...: mac2: b'\xd5\x8b\xd5+L\xedT7N\xa5\xba\xca\x0bj\xa5+\x0e\x03\xaft' 
...: .-.-.-.-.-.-. 
...: SAVES THE SESSION  OK! 
...: DERIVE KEY: 
...: Salt: b'cookie-session' 
...: Key: b'testing' 
...: mac1: b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
...: mac2: b'\xd5\x8b\xd5+L\xedT7N\xa5\xba\xca\x0bj\xa5+\x0e\x03\xaft' 
...: .-.-.-.-.-.-. 
...: OPEN THE SESSION  NOT OKAY!! 
...: DERIVE KEY: 
...: Salt: b'cookie-session' 
...: Key: b'testing' 
...: mac1: b'=\xcc\x01\xee"\x0ed\xde\xf4z\run\rMm\x98\xcb\x0e\xba' 
...: mac2: b'\xd5\x8b\xd5+L\xedT7N\xa5\xba\xca\x0bj\xa5+\x0e\x03\xaft' 
...: .-.-.-.-.-.-. 
...: SAVES THE SESSION  OK! 
...: DERIVE KEY: 
...: Salt: b'cookie-session' 
...: Key: b'testing' 
...: mac1: b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
...: mac2: b'\xd5\x8b\xd5+L\xedT7N\xa5\xba\xca\x0bj\xa5+\x0e\x03\xaft' 
...: .-.-.-.-.-.-. 
...: OPEN THE SESSION  OK! 
...: DERIVE KEY: 
...: Salt: b'cookie-session' 
...: Key: b'testing' 
...: mac1: b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
...: mac2: b'\xd5\x8b\xd5+L\xedT7N\xa5\xba\xca\x0bj\xa5+\x0e\x03\xaft' 
...: .-.-.-.-.-.-. 
...: SAVES THE SESSION  OK! 
...: DERIVE KEY: 
...: Salt: b'cookie-session' 
...: Key: b'testing' 
...: mac1: b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
...: mac2: b'\xd5\x8b\xd5+L\xedT7N\xa5\xba\xca\x0bj\xa5+\x0e\x03\xaft' 
...: .-.-.-.-.-.-. 

Я добавил и "НЕ ОЧЕНЬ!" так что вам будет легче увидеть, какие казни поступили не так.

(я также вижу, что в этом примере, не 60% терпит неудачу.)

В приведенном выше выводе только не удалось «Открыть сеанс» -Event. Так что я попробовал еще раз, чтобы увидеть, если это только при сохранении сеанса, но это происходит на Save-сессии также ..

...: SAVES THE SESSION  NOT OK! 
...: DERIVE KEY: 
...: Salt: b'cookie-session' 
...: Key: b'testing' 
...: mac1: b'\xc8D\xf0\x95\xc5R\x9f\xe3n\xc7\xa2 `7\xa9\xdb\xdd\xd8F\x85' 
...: mac2: b'\xc8D\xf0\x95\xc5R\x9f\xe3n\xc7\xa2 `7\xa9\xdb\xdd\xd8F\x85' 

я, наконец, нашел небольшой пример программы, которая воспроизводит ошибку.

#!/usr/bin/env python 

async_mode = "eventlet" 

if async_mode is None: 
    try: 
     import eventlet 
     async_mode = 'eventlet' 
    except ImportError: 
     pass 

    if async_mode is None: 
     try: 
      from gevent import monkey 
      async_mode = 'gevent' 
     except ImportError: 
      pass 

    if async_mode is None: 
     async_mode = 'threading' 

    print('async_mode is ' + async_mode) 

if async_mode == 'eventlet': 
    import eventlet 
    eventlet.monkey_patch() 
elif async_mode == 'gevent': 
    from gevent import monkey 
    monkey.patch_all() 

import hmac 
import hashlib 
import time 
from threading import Thread 
thread = None 


def background_thread(): 
    time.sleep(0.5) 
    error_mac = "" 
    while True: 
     error_mac = "" 
     time.sleep(0.1) 
     counter = 0 
     for i in range(0, 40): 
      time.sleep(0.001) 
      mac = hmac.new(b'testing', digestmod=hashlib.sha1).digest() # == b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b': 

      if not mac == b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b': 
       counter = counter + 1 
       error_mac = mac 
     if error_mac: 
      print("Example of the wrong hmacs calculated:") 
      print(error_mac) 
      print("--------------------------------------") 
     print("{} - {}".format(time.time(), counter)) 

def index(): 
    global thread 
    if thread is None: 
     thread = Thread(target=background_thread) 
     thread.daemon = True 
     thread.start() 

    for i in range(0,40): 
     print(hmac.new(b'testing', digestmod=hashlib.sha1).digest()) 
    thread.join() 
    return "ok" 


if __name__ == '__main__': 
    index() 

Обычно, если есть ошибка в первых 20 хэш (созданную в основном потоке) также второй поток получит неправильный хэш. Если в основном потоке не возникает ошибка, а второй поток выводит только timestamp и нули, перезагрузите программу.

У этого async_mode установлен «threading», все работает нормально. Но когда установлено значение «gevent» или «eventlet», эта ошибка возникает.

Выход с ошибкой:

b'D\xb4V\r9$gy\xe1 \x13\xd8\xc4f\x93O\x9e\xfa\x02\xff' 
b'D\xb4V\r9$gy\xe1 \x13\xd8\xc4f\x93O\x9e\xfa\x02\xff' 
b'D\xb4V\r9$gy\xe1 \x13\xd8\xc4f\x93O\x9e\xfa\x02\xff' 
b'D\xb4V\r9$gy\xe1 \x13\xd8\xc4f\x93O\x9e\xfa\x02\xff' 
b'D\xb4V\r9$gy\xe1 \x13\xd8\xc4f\x93O\x9e\xfa\x02\xff' 
b'D\xb4V\r9$gy\xe1 \x13\xd8\xc4f\x93O\x9e\xfa\x02\xff' 
b'D\xb4V\r9$gy\xe1 \x13\xd8\xc4f\x93O\x9e\xfa\x02\xff' 
b'D\xb4V\r9$gy\xe1 \x13\xd8\xc4f\x93O\x9e\xfa\x02\xff' 
b'D\xb4V\r9$gy\xe1 \x13\xd8\xc4f\x93O\x9e\xfa\x02\xff' 
b'D\xb4V\r9$gy\xe1 \x13\xd8\xc4f\x93O\x9e\xfa\x02\xff' 
b'D\xb4V\r9$gy\xe1 \x13\xd8\xc4f\x93O\x9e\xfa\x02\xff' 
b'D\xb4V\r9$gy\xe1 \x13\xd8\xc4f\x93O\x9e\xfa\x02\xff' 
b'D\xb4V\r9$gy\xe1 \x13\xd8\xc4f\x93O\x9e\xfa\x02\xff' 
b'D\xb4V\r9$gy\xe1 \x13\xd8\xc4f\x93O\x9e\xfa\x02\xff' 
b'D\xb4V\r9$gy\xe1 \x13\xd8\xc4f\x93O\x9e\xfa\x02\xff' 
b'D\xb4V\r9$gy\xe1 \x13\xd8\xc4f\x93O\x9e\xfa\x02\xff' 
b'D\xb4V\r9$gy\xe1 \x13\xd8\xc4f\x93O\x9e\xfa\x02\xff' 
b'D\xb4V\r9$gy\xe1 \x13\xd8\xc4f\x93O\x9e\xfa\x02\xff' 
b'D\xb4V\r9$gy\xe1 \x13\xd8\xc4f\x93O\x9e\xfa\x02\xff' 
b'D\xb4V\r9$gy\xe1 \x13\xd8\xc4f\x93O\x9e\xfa\x02\xff' 
b'D\xb4V\r9$gy\xe1 \x13\xd8\xc4f\x93O\x9e\xfa\x02\xff' 
b'D\xb4V\r9$gy\xe1 \x13\xd8\xc4f\x93O\x9e\xfa\x02\xff' 
b'D\xb4V\r9$gy\xe1 \x13\xd8\xc4f\x93O\x9e\xfa\x02\xff' 
b'D\xb4V\r9$gy\xe1 \x13\xd8\xc4f\x93O\x9e\xfa\x02\xff' 
b'D\xb4V\r9$gy\xe1 \x13\xd8\xc4f\x93O\x9e\xfa\x02\xff' 
b'D\xb4V\r9$gy\xe1 \x13\xd8\xc4f\x93O\x9e\xfa\x02\xff' 
b'D\xb4V\r9$gy\xe1 \x13\xd8\xc4f\x93O\x9e\xfa\x02\xff' 
b'D\xb4V\r9$gy\xe1 \x13\xd8\xc4f\x93O\x9e\xfa\x02\xff' 
b'D\xb4V\r9$gy\xe1 \x13\xd8\xc4f\x93O\x9e\xfa\x02\xff' 
b'D\xb4V\r9$gy\xe1 \x13\xd8\xc4f\x93O\x9e\xfa\x02\xff' 
b'D\xb4V\r9$gy\xe1 \x13\xd8\xc4f\x93O\x9e\xfa\x02\xff' 
b'D\xb4V\r9$gy\xe1 \x13\xd8\xc4f\x93O\x9e\xfa\x02\xff' 
b'D\xb4V\r9$gy\xe1 \x13\xd8\xc4f\x93O\x9e\xfa\x02\xff' 
b'D\xb4V\r9$gy\xe1 \x13\xd8\xc4f\x93O\x9e\xfa\x02\xff' 
b'D\xb4V\r9$gy\xe1 \x13\xd8\xc4f\x93O\x9e\xfa\x02\xff' 
b'D\xb4V\r9$gy\xe1 \x13\xd8\xc4f\x93O\x9e\xfa\x02\xff' 
b'D\xb4V\r9$gy\xe1 \x13\xd8\xc4f\x93O\x9e\xfa\x02\xff' 
b'D\xb4V\r9$gy\xe1 \x13\xd8\xc4f\x93O\x9e\xfa\x02\xff' 
b'D\xb4V\r9$gy\xe1 \x13\xd8\xc4f\x93O\x9e\xfa\x02\xff' 
Example of the wrong hmacs calculated: 
b"\x19\xd2}YU\xfeyX\x87\xee\xf5\x96\x94\xc1'\xa3tP\xb3\x96" 
-------------------------------------- 
1463462121.3955774 - 40 
Example of the wrong hmacs calculated: 
b"\x19\xd2}YU\xfeyX\x87\xee\xf5\x96\x94\xc1'\xa3tP\xb3\x96" 
-------------------------------------- 
1463462121.6040413 - 40 
Example of the wrong hmacs calculated: 
b"\x19\xd2}YU\xfeyX\x87\xee\xf5\x96\x94\xc1'\xa3tP\xb3\x96" 
-------------------------------------- 
1463462121.8342147 - 40 
Example of the wrong hmacs calculated: 
b"\x19\xd2}YU\xfeyX\x87\xee\xf5\x96\x94\xc1'\xa3tP\xb3\x96" 

Выход без ошибок:.

b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
b'j\xb6\xfc\x89\x1e\xef\xd3\xb7\x87C\xea(\xb1\x808\x11V\x1a|\x9b' 
1463462453.3856905 - 0 
1463462453.5910842 - 0 
1463462453.8242626 - 0 
1463462454.0677884 - 0 
1463462454.2900438 - 0 
1463462454.5460255 - 0 
1463462454.7883186 - 0 

(На моей Ubuntu машине, этот пример работает perfeclty Только на устройстве ARM7, что мы имеем эту проблему ..)

+0

Можете ли вы сделать более короткий * самодостаточный * пример. У вас есть * метод * с неявным 'self', но я нигде не вижу определения класса! –

+0

Действительно ли HMAC является b0rken или что вы много раз инициализируете секрет? –

+0

Возможно, ваш Python b0rken, или openssl - b0rken. Использует ли OpenSSL на этой платформе? –

ответ

0

Когда я изменил аргументы gevetn патч все:

... 
elif async_mode == 'gevent': 
    from gevent import monkey 
    monkey.patch_all(ssl=False) 
... 

Кажется, что сработало.

Смежные вопросы