Hướng dẫn how to generate oauth signature using hmac sha256 in python - cách tạo chữ ký oauth bằng hmac sha256 trong python

Cố gắng tạo chữ ký HMAC SHA256 cho 3Commas, tôi sử dụng các tham số tương tự từ ví dụ chính thức, nó sẽ tạo ra: "30F678A157230290E00475CFFFCCBC92AE3659D94C145A2C0E9D0F

Nhưng tôi tạo ra: "17A656C7DF48FA2DB615BFC719627FC94E59265E6AF18CC7714694EA5B58A11A"

Đây là những gì tôi đã thử:

secretkey = 'NhqPtmdSJYdKjVHjA7PZj4Mge3R5YNiP1e3UZjInClVN65XAbvqqM6A7H5fATj0j'
totalParams = '/public/api/ver1/accounts/new?type=binance&name=binance_account&api_key=XXXXXX&secret=YYYYYY'
print 'signature = '+hashlib.sha256((secretkey+totalParams).encode('ASCII')).hexdigest()

Bất cứ ai có thể giúp tôi ra?

Hỏi ngày 24 tháng 12 năm 2018 lúc 8:14Dec 24, 2018 at 8:14

Hướng dẫn how to generate oauth signature using hmac sha256 in python - cách tạo chữ ký oauth bằng hmac sha256 trong python

1

Hãy thử sử dụng mô -đun hmac thay vì mô -đun hashlib:

import hmac
import hashlib
secret_key = b"NhqPtmdSJYdKjVHjA7PZj4Mge3R5YNiP1e3UZjInClVN65XAbvqqM6A7H5fATj0j"
total_params = b"/public/api/ver1/accounts/new?type=binance&name=binance_account&api_key=XXXXXX&secret=YYYYYY"
signature = hmac.new(secret_key, total_params, hashlib.sha256).hexdigest()
print("signature = {0}".format(signature))

Điều này cho kết quả mong muốn:

signature = 30f678a157230290e00475cfffccbc92ae3659d94c145a2c0e9d0fa28f41c11a

Đã trả lời ngày 24 tháng 12 năm 2018 lúc 8:36Dec 24, 2018 at 8:36

2

Tôi đã thực hiện nó bằng cách sử dụng một cách tiếp cận khác vài năm trước.

import hmac
import hashlib 
import binascii

def create_sha256_signature(key, message):
    byte_key = binascii.unhexlify(key)
    message = message.encode()
    return hmac.new(byte_key, message, hashlib.sha256).hexdigest().upper()

create_sha256_signature("E49756B4C8FAB4E48222A3E7F3B97CC3", "TEST STRING")

https://www.gauravvjn.com/generate-hmac-sha256-signature-in-python/

Đã trả lời ngày 12 tháng 11 năm 2019 lúc 15:47Nov 12, 2019 at 15:47

Gaurav Jaingaurav JainGaurav Jain

1.4591 Huy hiệu vàng22 Huy hiệu bạc 30 Huy hiệu Đồng1 gold badge22 silver badges30 bronze badges

Tôi đã chơi xung quanh một chút với API Slack, mà tôi sẽ có một bài viết dài hơn một chút. Một phần của tích hợp yêu cầu tạo ra chữ ký HMAC SHA256 để xác minh các yêu cầu là từ Slack. Có quá nhiều kết quả tìm kiếm hữu ích và một số trong số chúng giống như các tài liệu mô -đun HMAC don lồng bao gồm các ví dụ. Dưới đây là một số ghi chú nhanh cho mọi người trong tương lai cố gắng tương tự.


Bài đăng H/T đến Joe Kampschmidt, trong đó bao gồm việc ký tốt.


Bước đầu tiên là thiết bị ứng dụng thử nghiệm của bạn là nắm bắt các tiêu đề đầy đủ và cơ thể thô từ phản hồi để bạn có thể xác minh việc triển khai của mình.

Nếu bạn sử dụng bình cho máy chủ của mình, việc nhận được cơ thể yêu cầu RAW sẽ hơi phức tạp, vì nó sẽ cố gắng một cách hữu ích để chuyển đổi dữ liệu với loại nội dung

import hmac
import hashlib
secret_key = b"NhqPtmdSJYdKjVHjA7PZj4Mge3R5YNiP1e3UZjInClVN65XAbvqqM6A7H5fATj0j"
total_params = b"/public/api/ver1/accounts/new?type=binance&name=binance_account&api_key=XXXXXX&secret=YYYYYY"
signature = hmac.new(secret_key, total_params, hashlib.sha256).hexdigest()
print("signature = {0}".format(signature))
0 thành từ điển thay vì chuỗi thô. Chuyển đổi này thành một mặt nạ từ điển hầu hết các cách rõ ràng để truy cập vào chuỗi thô.

May mắn thay, bạn có thể sử dụng request.get_data để có được cơ thể thô miễn là bạn làm điều đó trước khi gọi

import hmac
import hashlib
secret_key = b"NhqPtmdSJYdKjVHjA7PZj4Mge3R5YNiP1e3UZjInClVN65XAbvqqM6A7H5fATj0j"
total_params = b"/public/api/ver1/accounts/new?type=binance&name=binance_account&api_key=XXXXXX&secret=YYYYYY"
signature = hmac.new(secret_key, total_params, hashlib.sha256).hexdigest()
print("signature = {0}".format(signature))
1. Nó hoạt động tốt để gọi
import hmac
import hashlib
secret_key = b"NhqPtmdSJYdKjVHjA7PZj4Mge3R5YNiP1e3UZjInClVN65XAbvqqM6A7H5fATj0j"
total_params = b"/public/api/ver1/accounts/new?type=binance&name=binance_account&api_key=XXXXXX&secret=YYYYYY"
signature = hmac.new(secret_key, total_params, hashlib.sha256).hexdigest()
print("signature = {0}".format(signature))
2 và sau đó
import hmac
import hashlib
secret_key = b"NhqPtmdSJYdKjVHjA7PZj4Mge3R5YNiP1e3UZjInClVN65XAbvqqM6A7H5fATj0j"
total_params = b"/public/api/ver1/accounts/new?type=binance&name=binance_account&api_key=XXXXXX&secret=YYYYYY"
signature = hmac.new(secret_key, total_params, hashlib.sha256).hexdigest()
print("signature = {0}".format(signature))
1, vì vậy hãy cẩn thận để sắp xếp chúng một cách chính xác.

def recall_post(request):
    # must not call request.form here
    headers = request.headers()
    data = request.get_data()
    print(headers)
    print(data)


    # calling request.form is fine now
    request.form
    return "%s %s" % (headers, data)

Khi bạn có các tiêu đề và dữ liệu của Thoes, bạn sẽ có thể thực hiện một lần chạy thử để tạo chữ ký và so sánh nó với chữ ký đã gửi. Các giá trị bạn cần trích xuất từ ​​yêu cầu gửi đến là:

timestamp = request.headers['X-Slack-Request-Timestamp']
expected_sig = request.headers['X-Slack-Signature']

Bạn cũng cần phải vào trang ứng dụng của mình trong bảng điều khiển Slack để có được bí mật ký kết. Khi bạn có các mảnh này cùng với cơ thể bài thô được truy xuất qua

import hmac
import hashlib
secret_key = b"NhqPtmdSJYdKjVHjA7PZj4Mge3R5YNiP1e3UZjInClVN65XAbvqqM6A7H5fATj0j"
total_params = b"/public/api/ver1/accounts/new?type=binance&name=binance_account&api_key=XXXXXX&secret=YYYYYY"
signature = hmac.new(secret_key, total_params, hashlib.sha256).hexdigest()
print("signature = {0}".format(signature))
2, thì bạn có thể sử dụng các thành phần đó để kiểm tra việc tạo chữ ký của riêng bạn.

import hmac, hashlib

body = b'token=etc&team_id=etc&...'
timestamp = b'100000000000'
base = 'v0:%s:%s' % (timestamp.decode('utf-8'), body.decode('utf-8'))
secret = b'1234'
computed = hmac.new(secret, base.encode('utf-8'),
                    digestmod=hashlib.sha256).hexdigest()
sig = 'v0=%s' % (computed,)

print(sig)

Nếu bạn sử dụng các giá trị thực, điều này sẽ phù hợp chính xác với chữ ký từ chữ ký chùng trong tiêu đề

import hmac
import hashlib
secret_key = b"NhqPtmdSJYdKjVHjA7PZj4Mge3R5YNiP1e3UZjInClVN65XAbvqqM6A7H5fATj0j"
total_params = b"/public/api/ver1/accounts/new?type=binance&name=binance_account&api_key=XXXXXX&secret=YYYYYY"
signature = hmac.new(secret_key, total_params, hashlib.sha256).hexdigest()
print("signature = {0}".format(signature))
5.

Kéo tất cả các điều này lại với nhau, chức năng máy chủ sẽ trông giống như:

def verify(request,secret):
    body = request.get_data()
    timestamp = request.headers['X-Slack-Request-Timestamp']
    sig_basestring = 'v0:%s:%s' % (timestamp, body.decode('utf-8'))
    computed_sha = hmac.new(secret,
                            sig_basestring.encode('utf-8'),
                            digestmod=hashlib.sha256).hexdigest()
    my_sig = 'v0=%s' % (computed_sha,)
    slack_sig = request.headers['X-Slack-Signature']
    if my_sig != slack_sig:
        err_str = "my_sig %s does not equal slack_sig %s" % \
                   (my_sig, slack_sig))
        raise Exception(err_str)

def recall_post(request):
    signing_secret = b'your secret from some config tool'
    verify(request, signing_secret)
    return "Signatures match, yay."

Bây giờ miễn là bạn gọi

import hmac
import hashlib
secret_key = b"NhqPtmdSJYdKjVHjA7PZj4Mge3R5YNiP1e3UZjInClVN65XAbvqqM6A7H5fATj0j"
total_params = b"/public/api/ver1/accounts/new?type=binance&name=binance_account&api_key=XXXXXX&secret=YYYYYY"
signature = hmac.new(secret_key, total_params, hashlib.sha256).hexdigest()
print("signature = {0}".format(signature))
6 trong người xử lý của bạn, bạn có thể tự tin rằng các yêu cầu đến thực sự là từ Slack. Hy vọng rằng điều này sẽ cứu ai đó một vài phút!