【问题标题】:Swedish BankID Python Animated QR code generation with hmac瑞典 BankID 使用 hmac 生成 Python 动画二维码
【发布时间】:2021-12-11 06:56:43
【问题描述】:

我正在开发一个 Django 项目,该项目将使用 BankID 进行授权和数字签名。我正在使用pybankid,关于那个项目,我只有好话要说。我的问题在于尝试使用 bankIDs 文档提供的代码。

QRCode Docs

import hashlib
import hmac
import time
 
qr_start_token = rp_response["qrStartToken"]
# "67df3917-fa0d-44e5-b327-edcc928297f8"
 
qr_start_secret = rp_response["qrStartSecret"]
# "d28db9a7-4cde-429e-a983-359be676944c"
 
order_time = time.time()
# (The time in seconds when the response from the BankID service was delivered)
 
qr_time = str(int(time.time() - order_time))
# ("0" or another string with a higher number depending on order_time and current time)
 
qr_auth_code = hmac.new(qr_start_secret, qr_time, hashlib.sha256).hexdigest()
# "dc69358e712458a66a7525beef148ae8526b1c71610eff2c16cdffb4cdac9bf8" (qr_time="0")
# "949d559bf23403952a94d103e67743126381eda00f0b3cbddbf7c96b1adcbce2" (qr_time="1")
# "a9e5ec59cb4eee4ef4117150abc58fad7a85439a6a96ccbecc3668b41795b3f3" (qr_time="2")
# (64 chars hex)
 
qr_data = str.join(".", "bankid", qr_start_token, qr_time, qr_auth_code)
# "bankid.67df3917-fa0d-44e5-b327-edcc928297f8.0.dc69358e712458a66a7525beef148ae8526b1c71610eff2c16cdffb4cdac9bf8" (qr_time="0")
# "bankid.67df3917-fa0d-44e5-b327-edcc928297f8.1.949d559bf23403952a94d103e67743126381eda00f0b3cbddbf7c96b1adcbce2" (qr_time="1")
# "bankid.67df3917-fa0d-44e5-b327-edcc928297f8.2.a9e5ec59cb4eee4ef4117150abc58fad7a85439a6a96ccbecc3668b41795b3f3" (qr_time="2")

我得到 TypeError: key: expected bytes or bytearray, but got 'str',当我尝试将 qr_start_secret 转换为字节时,我得到 Unicode 对象必须在散列之前进行编码。我不知所措。有人有什么想法吗?

编辑:这是我当前的代码,它有效。目前正在为如何呈现不断变化的二维码值客户端而苦恼,因为上下文只会传输静态值。

if request.META['HTTP_USER_AGENT']:
 ua_string = request.META['HTTP_USER_AGENT']
 user_agent = parse(ua_string)
 if user_agent.is_pc:
                        
  status=client.collect(order_ref=auth["orderRef"])["status"]
                        order_time = time.time()
                        while status == "pending":

  qr_start_token = auth["qrStartToken"]

  qr_start_secret = auth["qrStartSecret"]

  qr_time = str(int(time.time() - order_time))

  qr_auth_code = hmac.new(qr_start_secret.encode(), qr_time.encode(), hashlib.sha256).hexdigest()

  qr_data = ".".join(["bankid", qr_start_token, qr_time, qr_auth_code])

  print(f'qr_data: {qr_data}')

                            
  status=client.collect(order_ref=auth["orderRef"])["status"]

  print(status)

  qr = segno.make(qr_data)
  qr.save('media/img/temp/' + personal_number + '.svg')

  if status == "complete":
   print("Logged on")
   dj_login(request, user)
   return render(request, 'home/auth-login-Success.html')

  time.sleep(1)

【问题讨论】:

    标签: python django qr-code hmac bankid


    【解决方案1】:

    他们的示例代码存在多个问题

    1. 看起来qr_start_tokenqr_start_secret 是字符串。
    2. str.join 接收 4 个参数会引发错误

    试试:

    import hashlib
    import hmac
    import time
     
    qr_start_token = "67df3917-fa0d-44e5-b327-edcc928297f8"
     
    qr_start_secret = "d28db9a7-4cde-429e-a983-359be676944c"
     
    order_time = time.time()
    # (The time in seconds when the response from the BankID service was delivered)
     
    qr_time = str(int(time.time() - order_time))
    # ("0" or another string with a higher number depending on order_time and current time)
    print(f'qr_time: {qr_time}')
    qr_auth_code = hmac.new(qr_start_secret.encode(), qr_time.encode(), hashlib.sha256).hexdigest()
    # "dc69358e712458a66a7525beef148ae8526b1c71610eff2c16cdffb4cdac9bf8" (qr_time="0")
    # "949d559bf23403952a94d103e67743126381eda00f0b3cbddbf7c96b1adcbce2" (qr_time="1")
    # "a9e5ec59cb4eee4ef4117150abc58fad7a85439a6a96ccbecc3668b41795b3f3" (qr_time="2")
    # (64 chars hex)
    
    print(f'qr_auth_code: {qr_auth_code}')
    print(qr_auth_code == "dc69358e712458a66a7525beef148ae8526b1c71610eff2c16cdffb4cdac9bf8")
     
    qr_data = str.join(".", ["bankid", qr_start_token, qr_time, qr_auth_code])
    # or better
    # qr_data = ".".join(["bankid", qr_start_token, qr_time, qr_auth_code])
    
    # "bankid.67df3917-fa0d-44e5-b327-edcc928297f8.0.dc69358e712458a66a7525beef148ae8526b1c71610eff2c16cdffb4cdac9bf8" (qr_time="0")
    # "bankid.67df3917-fa0d-44e5-b327-edcc928297f8.1.949d559bf23403952a94d103e67743126381eda00f0b3cbddbf7c96b1adcbce2" (qr_time="1")
    # "bankid.67df3917-fa0d-44e5-b327-edcc928297f8.2.a9e5ec59cb4eee4ef4117150abc58fad7a85439a6a96ccbecc3668b41795b3f3" (qr_time="2")
    
    print(f'qr_data: {qr_data}')
    

    输出:

    qr_time: 0
    qr_auth_code: dc69358e712458a66a7525beef148ae8526b1c71610eff2c16cdffb4cdac9bf8
    True
    qr_data: bankid.67df3917-fa0d-44e5-b327-edcc928297f8.0.dc69358e712458a66a7525beef148ae8526b1c71610eff2c16cdffb4cdac9bf8
    

    【讨论】:

    • 嘿,我需要 15 个代表来支持你。我认为你有正确的答案,我想知道为什么演示代码写得这么糟糕。感觉就像有人从另一种语言转换它并且没有测试它。我将把它渲染为一个动画二维码,看看我是否可以从 BankID 移动应用程序中进行身份验证。
    • 我同意它没有经过测试。你可以accept an answer that solves your problem
    • 也许你可以联系他们并用他们的示例代码通知这个问题。
    • 它确实解决了这个问题,但打开了一罐蠕虫......就像我如何将 Django 视图中不断变化的二维码渲染到页面上一样。我不想在 JS 中渲染密码并在那里执行相同的功能。叹息,要学习更多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    • 2018-09-03
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多