当前位置: 首页 > 知识库问答 >
问题:

如何使用Telegram API实现授权?

淳于星宇
2023-03-14

我想使用PHP实现多个授权,以便与Telegram REST API进行交互。

我要解决的是什么任务?嗯,很简单:几十个用户(他们都有一个carma(+10,-2,+1000等),有相关的组分类:web-masters和customers)在我的网站上有一个用户配置文件。在他们达到一定数量的carma之后,并且由于他们在他们的个人资料中被授权,他们就会加入到基于自动生成的电报的私人聊天中。

经过一番研究,我发现这很复杂,因为:

  auth.sentCode#efed51d9 phone_registered:Bool phone_code_hash:string send_call_timeout:int is_password:Bool = auth.SentCode;

#define TG_SERVER_1 "149.154.175.50"
#define TG_SERVER_2 "149.154.167.51"
#define TG_SERVER_3 "149.154.175.100"
#define TG_SERVER_4 "149.154.167.91"
#define TG_SERVER_5 "149.154.171.5"
void empty_auth_file (void) {
  if (TLS->test_mode) {
    bl_do_dc_option (TLS, 1, "", 0, TG_SERVER_TEST_1, strlen (TG_SERVER_TEST_1), 443);
    bl_do_dc_option (TLS, 2, "", 0, TG_SERVER_TEST_2, strlen (TG_SERVER_TEST_2), 443);
    bl_do_dc_option (TLS, 3, "", 0, TG_SERVER_TEST_3, strlen (TG_SERVER_TEST_3), 443);
    bl_do_set_working_dc (TLS, TG_SERVER_TEST_DEFAULT);
  } else {
    bl_do_dc_option (TLS, 1, "", 0, TG_SERVER_1, strlen (TG_SERVER_1), 443);
    bl_do_dc_option (TLS, 2, "", 0, TG_SERVER_2, strlen (TG_SERVER_2), 443);
    bl_do_dc_option (TLS, 3, "", 0, TG_SERVER_3, strlen (TG_SERVER_3), 443);
    bl_do_dc_option (TLS, 4, "", 0, TG_SERVER_4, strlen (TG_SERVER_4), 443);
    bl_do_dc_option (TLS, 5, "", 0, TG_SERVER_5, strlen (TG_SERVER_5), 443);
    bl_do_set_working_dc (TLS, TG_SERVER_DEFAULT);
  }
}

void bl_do_dc_option (struct tgl_state *TLS, int id, const char *name, int l1, const char *ip, int l2, int port) {
  struct tgl_dc *DC = TLS->DC_list[id];
  if (DC && !strncmp (ip, DC->ip, l2)) { return; }

  clear_packet ();
  out_int (CODE_binlog_dc_option);
  out_int (id);
  out_cstring (name, l1);
  out_cstring (ip, l2);
  out_int (port);

  add_log_event (TLS, packet_buffer, 4 * (packet_ptr - packet_buffer));
}

提前谢谢!

共有1个答案

唐昊焜
2023-03-14

到目前为止,我已经能够完全实现telegram授权,但不是用您请求的语言--PHP,我使用的是VB.NET。不过,我相信同样的逻辑也应该适用。

正在创建电报授权密钥

Telegram API不是公园里的散步。研究现有的src代码可能是相当艰巨的(IMHO)。因此,我的方法是研究在线API文档并实现下面链接中概述的sample-auth_key。

Private Sub SendData(b() As Byte, Optional read As Boolean = False)
    If Not IsConnected() Then
        Log("Connection Closed!", ConsoleColor.DarkRed)
        RaiseEvent Disconneted()
        Exit Sub
    End If
    
    b = TCPPack(b)
    
    Dim arg = New SocketAsyncEventArgs With {.RemoteEndPoint = ep}
    AddHandler arg.Completed, AddressOf IO_Handler
    arg.SetBuffer(b, 0, b.Length)
    
    Try
        If Not soc.SendAsync(arg) Then
            IO_Handler(soc, arg)
        End If
    
        If read Then
            ReadData()
        End If
    Catch ex As Exception
            Log("SendData: " & ex.ToString, ConsoleColor.Red)
    End Try

End Sub

Private Sub ReadData(Optional wait As Integer = 0)
    If Not IsConnected() Then
        Log("Connection Closed!", ConsoleColor.DarkRed)
        RaiseEvent Disconneted()
        Exit Sub
    End If

    Dim arg = New SocketAsyncEventArgs With {.RemoteEndPoint = ep}
    AddHandler arg.Completed, AddressOf IO_Handler

    Dim b(BUFFER_SIZE - 1) As Byte
    arg.SetBuffer(b, 0, BUFFER_SIZE)

    Try
        If Not soc.ReceiveAsync(arg) Then
            IO_Handler(soc, arg)
        End If
    Catch ex As Exception
        Log("ReadMessages: " & ex.ToString, ConsoleColor.Red)
    End Try
End Sub

Private Sub IO_Handler(sender As Object, e As SocketAsyncEventArgs)
    Log($"{e.LastOperation}:{e.SocketError}:{e.BytesTransferred}", ConsoleColor.Cyan)

    Select Case e.SocketError
        Case SocketError.Success
            Select Case e.LastOperation
                Case SocketAsyncOperation.Connect 'A socket Connect operation.
                    Log("Connected to " & e.ConnectSocket.RemoteEndPoint.ToString, ConsoleColor.Green)
                    are.Set()

                    Case SocketAsyncOperation.Disconnect, SocketAsyncOperation.Connect
                        RaiseEvent Disconneted()

                Case SocketAsyncOperation.Receive 'A socket Receive operation.
                        HandleData(e)
            End Select

        Case SocketError.ConnectionAborted
                RaiseEvent Disconneted()
    End Select
End Sub

Private Sub HandleData(e As SocketAsyncEventArgs)
    If e.BytesTransferred = 0 Then --no pending data
        Log("The remote end has closed the connection.")
        Exit Sub
    End If

    Dim len As Integer = e.Buffer(0)
    Dim start = 1

    If len = &H7F Then
        len = e.Buffer(1)
        len += e.Buffer(2) << 8
        len += e.Buffer(3) << 16
        start = 4
    End If

    len = 4 * len

    Dim data(len - 1) As Byte
    Array.Copy(e.Buffer, start, data, 0, len)


    ProcessResponse(data)

    ReadData()
End Sub
Private Function TCPPack(b As Byte()) As Byte()
    Dim a = New List(Of Byte)
    Dim len = CByte(b.Length / 4)

    If efSent = False Then --TCP abridged version
        efSent = True
        a.Add(&HEF)
    End If

    If len >= &H7F Then
        a.Add(&H7F)
        a.AddRange(BitConverter.GetBytes(len))
    Else
        a.Add(len)
    End If

    a.AddRange(b) --only data, no sequence number, no CRC32

    Return a.ToArray
End Function

通过设置基本的TCP发送/接收例程,我们可以开始准备发送到telegram的数据包,并拥有处理接收到的特定响应的子例程--ProcessResponse(data)

接下来我们需要理解的是Telegram处理两大类消息-

unencrypted-https://core.telegram.org/mtproto/description#unencrypted-message

Private Sub Send(m As UnencryptedMessage)
    Log(m.ToString, ConsoleColor.DarkYellow, logTime:=False)
    SendData(m.data, True)
End Sub

Private Sub Send(m As EncryptedMessage)
    Log(m.ToString, ConsoleColor.DarkYellow, logTime:=False)
    SendData(m.data, True)
End Sub
Public Class UnencryptedMessage
    Public Property auth_key_id As Int64
    Public Property message_id As Int64
    Public Property data_length As Int32
    Public Property message_data As Byte()
    Public Property message_type As String
    Public Property data As Byte() = {}
    
    Sub New(auth_key As Int64, message_id As Int64, data As Byte())
        _auth_key_id = auth_key
        _message_id = message_id
        _data_length = data.Length
        _message_data = data
        message_type = B2Hr(data, 0, 4)
    
        Dim a = New List(Of Byte)
    
        a.AddRange(BitConverter.GetBytes(auth_key_id)) --{0, 0, 0, 0, 0, 0, 0, 0}
        a.AddRange(BitConverter.GetBytes(message_id))
        a.AddRange(BitConverter.GetBytes(data_length))
        a.AddRange(message_data)
    
        Me.data = a.ToArray
    End Sub
    
    Sub New(b As Byte())
        data = b
    
        Dim skip = 0
    
        _auth_key_id = BitConverter.ToInt64(b, skip) : skip += 8
        _message_id = BitConverter.ToInt64(b, skip) : skip += 8
        _data_length = BitConverter.ToInt32(b, skip) : skip += 4
    
        ReDim _message_data(_data_length - 1)
    
        Array.Copy(b, skip, _message_data, 0, b.Length - skip)
    
        message_type = B2Hr(_message_data, 0, 4)
    End Sub
    
    Public Overrides Function ToString() As String
            Return $"
        raw_data: {B2H(data)}
     auth_key_id: {i2H(auth_key_id)}  {auth_key_id}
      message_id: {i2H(message_id)}  {message_id}
     data_length: {i2H(data_length)}  {data_length}
    message_data: {B2H(message_data)}
    message_type: {message_type}
    "
    End Function
End Class
    null
    null

REQ_PQ#60469778 nonce:int128=ResPQ nonce的值由客户端随机选择(随机数),并在此通信中标识客户端。顺着这一步走,大家都知道了。

ResPQ#05162463 nonce:int128 server_nonce:int128 pq:string server_public_key_fingerprints:vector long=ResPQ

我的方法很简单:

Sub RequestPQAuthorization()
    Send(MTProto.req_pq)
End Sub
Shared Function req_pq(Optional nonce As Byte() = Nothing) As UnencryptedMessage
    --req_pq#60469778 
    --nonce:int128
    If nonce Is Nothing Then
        ReDim nonce(15)
        RND.NextBytes(nonce)
    End If

    Dim d = New List(Of Byte)
    d.AddRange({120, 151, 70, 96}) --60469778
    d.AddRange(nonce)

    Return New UnencryptedMessage(0, CreateMessageId, d.ToArray)
End Function

Private Shared Function CreateMessageId() As Int64
    Return CLng((Date.UtcNow.Ticks - ZERO_TICK) * 429.4967296)
End Function

现在我们从步骤1开始的过程响应方法

Private Sub ProcessResponse(data As Byte())
    Try
        Dim r = New UnencryptedMessage(data)
        Log(r.ToString, ConsoleColor.Yellow, logTime:=False)

        Select Case r.message_type
            Case resPQ.Classid
                RequestDHKeyExchange(New resPQ(r.message_data))
            Case server_DH_params_ok.Classid
                RequestSetDH_params(New server_DH_params_ok(r.message_data), new_nonce)
            Case server_DH_params_fail.Classid
                Log(New server_DH_params_fail(r.message_data).ToString, ConsoleColor.DarkMagenta)
            Case dh_gen_ok.Classid
                Log(New dh_gen_ok(r.message_data).ToString, ConsoleColor.Green)
            Case dh_gen_retry.Classid
                Log(New dh_gen_retry(r.message_data).ToString, ConsoleColor.DarkMagenta)
            Case dh_gen_fail.Classid
                Log(New dh_gen_fail(r.message_data).ToString, ConsoleColor.DarkMagenta)
            Case Else
                Log($"Unhandled type: {r.message_type}", ConsoleColor.Magenta)
        End Select
    Catch ex As Exception
        Log($"Error: {ex.ToString}", ConsoleColor.Red)
        Log(B2H(data), ConsoleColor.DarkRed, logTime:=False)
    End Try
End Sub

到目前为止,收到的每个响应都有一个message_type代码。

我们可以打开它并确定如何处理每一个。我们现在需要处理resPQ。

''' <summary>
''' resPQ#05162463 
''' nonce:int128 server_nonce:int128 pq:string server_public_key_fingerprints:Vector long = ResPQ
''' </summary>
Public NotInheritable Class resPQ : Inherits TLObject
    Public Shared Shadows ReadOnly Property Classid As String = "05162463"
    Public Property nonce As Byte()
    Public Property server_nonce As Byte()
    Public Property pq As Byte()
    Public Property fingerprints As List(Of UInt64)
    Public Property count As Int32

    Sub New(data As Byte())
        Dim skip = 4
        nonce = Slice(data, skip, 16) : skip += 16
        server_nonce = Slice(data, skip, 16) : skip += 16
        skip += 1 'length of pq:string
        pq = Slice(data, skip, 8) : skip += 8
        skip += 3 'padding to complete the 4-bytes
        skip += 4 '%(Vector long) 1cb5c415
        count = i32r(data, skip) : skip += 4

        fingerprints = New List(Of UInt64)

        For i = 0 To count - 1
            fingerprints.Add(u64r(data, skip))
        Next
    End Sub

    Public Overrides Function ToString() As String
        Return $"
     classid: {NameOf(resPQ)}#{Classid}
       nonce: {B2H(nonce)}
server_nonce: {B2H(server_nonce)}
          pq: {B2H(pq)}  {u64(pq)}
       count: {i2H(count)}  {count}
fingerprints: {i2H(fingerprints(0))}  {fingerprints(0)}
"
    End Function
End Class
Public MustInherit Class TLObject
    Public Shared Property ClassId As String
    Public MustOverride Overrides Function ToString() As String
End Class

这将开始一轮Diffie-Hellman密钥交换。

出示工作证明;服务器身份验证4)客户端向服务器发送查询

req_dh_params#d712e4be nonce:int128 server_nonce:int128 p:string q:string public_key_findering:long encrypted_data:string=Server_DH_Params

Sub RequestDHKeyExchange(r As resPQ)
    Log(r.ToString, ConsoleColor.Gray, logTime:=False)

    'decompose prime cofactors
    Dim pp = New PrimeProduct(r.pq)
    Log(pp.ToString, ConsoleColor.Gray, logTime:=False)

    'encrypted_data Generation
    Dim pq = New P_Q_inner_data(r.pq, pp.p, pp.q, r.nonce, r.server_nonce)
    new_nonce = pq.new_nonce

    'The serialization Of P_Q_inner_data produces some String data. This Is followed by encrypted_data
    'data_with_hash := SHA1(data) + data + (any random bytes); such that the length equal 255 
    Dim data_with_hash = New List(Of Byte)

    'SHA1(data) = xxx- 40 =20 bytes
    Using sha1 = New SHA1Managed
        Dim b = pq.ToBytes
        data_with_hash.AddRange(sha1.ComputeHash(b))
        data_with_hash.AddRange(b)
    End Using

    If data_with_hash.Count < 255 Then
        Dim pad(255 - data_with_hash.Count - 1) As Byte
        RND.NextBytes(pad)
        data_with_hash.AddRange(pad)
    End If

    'RSA(data_with_hash, server_public_key) = xxx - 512 = 256 bytes
    Dim key = i2H(r.fingerprints(0)) 'c3b42b026ce86b21
    Dim zb = Crypto.rsaEncrypt(data_with_hash.ToArray, key)
    Send(MTProto.req_DH_params(r.nonce, r.server_nonce, pp.p, pp.q, r.fingerprints(0), zb))
End Sub

下面是我如何使用PollardBrent(Pollard Rho Brent Integer Factorization)学习的示例https://stackoverflow.com/A/31978350/44080

好的,如果您能够继续到这一点,您就对我如何逐步分解AuthKey实现有了一个大致的了解。

您应该能够运行剩余的步骤5-9。对我来说,打字是很难的...

03:33:26.591  Connect:Success:0
03:33:26.593  Connected to 149.154.167.40:443
03:33:26.598
    raw_data: 000000000000000000DC799836FE075614000000789746604479257F6C01C039A3DEAD031BC2D6A4
 auth_key_id: 0000000000000000  0
  message_id: 5607FE369879DC00  6199202922538589184
 data_length: 00000014  20
message_data: 789746604479257F6C01C039A3DEAD031BC2D6A4
message_type: 60469778

03:33:26.600  Send:Success:42
03:33:26.735  Receive:Success:85
03:33:26.737
    raw_data: 0000000000000000015CF64539FE075640000000632416054479257F6C01C039A3DEAD031BC2D6A44F9DB065B36308CF4D9965725DD7153D0818DDCAF407B7CDCD00000015C4B51C01000000216BE86C022BB4C3
 auth_key_id: 0000000000000000  0
  message_id: 5607FE3945F65C01  6199202934039141377
 data_length: 00000040  64
message_data: 632416054479257F6C01C039A3DEAD031BC2D6A44F9DB065B36308CF4D9965725DD7153D0818DDCAF407B7CDCD00000015C4B51C01000000216BE86C022BB4C3
message_type: 05162463

03:33:26.743
     classid: resPQ#05162463
       nonce: 4479257F6C01C039A3DEAD031BC2D6A4
server_nonce: 4F9DB065B36308CF4D9965725DD7153D
          pq: 18DDCAF407B7CDCD  1791811376213642701
       count: 00000001  1
fingerprints: C3B42B026CE86B21  14101943622620965665

03:33:26.810
PQ: 18DDCAF407B7CDCD  1791811376213642701
 P: 45F57B87  1173715847
 Q: 5AFE490B  1526614283

03:33:26.930
    raw_data: 000000000000000000403CEE36FE075640010000BEE412D74479257F6C01C039A3DEAD031BC2D6A44F9DB065B36308CF4D9965725DD7153D0445F57B87000000045AFE490B000000216BE86C022BB4C3FE0001002DD190DDD93DFFC9EAF14DFAD3018D101E9E3EEC6C3FF4C7C1A067B32FB19AA2FDDFD087094947E793FA9F1A10A36A0B2916609811CFF1F345EE8FD9CDFFBCA4555E33A0446AB4A534500F621D112FCF59CAD4961BC87375F6835460B2E1B3B4088CE79843F7445DC5D87E0ACB0C4A979F68240C06358C4D2F95F86C0535CA643FBE8AF730E70BCBB54191D4F110E50D3244882722605657E808382445FA070A67AED1B2835238C05A00EBE960106838A284BC03D7A01453BA5355F06952F686263DD5B22B66524ED47F843340E9B7FC75BD58B6CC376C0B8B89E7292EDCC08D6CD0F1F9BF8418C2A58BC82B1928B051B3A0C20FA0AB22BA822EFABA6E141508
 auth_key_id: 0000000000000000  0
  message_id: 5607FE36EE3C4000  6199202923977392128
 data_length: 00000140  320
message_data: BEE412D74479257F6C01C039A3DEAD031BC2D6A44F9DB065B36308CF4D9965725DD7153D0445F57B87000000045AFE490B000000216BE86C022BB4C3FE0001002DD190DDD93DFFC9EAF14DFAD3018D101E9E3EEC6C3FF4C7C1A067B32FB19AA2FDDFD087094947E793FA9F1A10A36A0B2916609811CFF1F345EE8FD9CDFFBCA4555E33A0446AB4A534500F621D112FCF59CAD4961BC87375F6835460B2E1B3B4088CE79843F7445DC5D87E0ACB0C4A979F68240C06358C4D2F95F86C0535CA643FBE8AF730E70BCBB54191D4F110E50D3244882722605657E808382445FA070A67AED1B2835238C05A00EBE960106838A284BC03D7A01453BA5355F06952F686263DD5B22B66524ED47F843340E9B7FC75BD58B6CC376C0B8B89E7292EDCC08D6CD0F1F9BF8418C2A58BC82B1928B051B3A0C20FA0AB22BA822EFABA6E141508
message_type: D712E4BE

03:33:26.933  Send:Success:341
03:33:27.217  Receive:Success:656
03:33:27.217
    raw_data: 0000000000000000011C9A9F39FE0756780200005C07E8D04479257F6C01C039A3DEAD031BC2D6A44F9DB065B36308CF4D9965725DD7153DFE500200752C7BDBB6A58D68B76D2E20DCECF611B2837CA34F3688B242192C633FBBC1EC9348880DA6E6AFF42B256D8476A2C432B60E93218F5B84982B0F9800E6EF918AEC4B729AB1A67C82EF2C4D281352D1BEAEB6B9026CAA0CA8FB03F9257E2CA034471EE25CF6E214BB770E233566A67155BE8FB8F9DA0A76964CFD19E9C97D3E57AAA26E7A6C16B12F2B2BFD4C437857032F0A7198567B9CD3A54BD06CE61A1EBACD70D464185719BC8E0381C99E80A5783D389BE73E97166A328CEDB3AA4D722D453EB4CA893299E41DDC81C798BC76CAF070BFF144F6800D8FE5B3B6BCC9A1138E7ADA6DAF3F581AAB0137A6D40E640E76F6539B1450EA30A55E3F56C2C0A8DCC6F9F4D4F185D25AF37B46B9D9B8ED5CA257DD32EDE02FF95C6174C9D4BA1E30035723C7E2DED9EB0794AAA1913073E4EA2D5649C5C491B252AF88FF1D71EFB5E9FFCA921F0F27F72723DD5014359D08101278DF3F9A9A10DDE54B93A386C6844A6D15AF142DA956A3999458D10BBDE4E947BE949199F088B91175EC9EEE3C95AC47C96D802B0DC91AA6DB5B8A03E0985412DD23CD33FD961175CD271E02BF8A05A537E8FE21CDB40EBAAC0C8D4718DA4499D5B5EF935B848F92C25E9CAE76021758EDD1AA202A0D0DC357348B0474069002EB8F5F2760F2C5BEE38C7CEA07737C28864F647F2406BD55ABD58EEED97A4C8E659143441B1F8CB8DEFE457B46B5E76541CAB63FA1CD3626F0A45DB8A37964BF2613A6C64E6E6E478D44A2AF19CAD6C2686FD55EC85CACD645E58C364CBBD09EF1C7FE7420A8EF277982B87CA18D16B97980B14D24747D9BC86563DA81DA
 auth_key_id: 0000000000000000  0
  message_id: 5607FE399F9A1C01  6199202935543045121
 data_length: 00000278  632
message_data: 5C07E8D04479257F6C01C039A3DEAD031BC2D6A44F9DB065B36308CF4D9965725DD7153DFE500200752C7BDBB6A58D68B76D2E20DCECF611B2837CA34F3688B242192C633FBBC1EC9348880DA6E6AFF42B256D8476A2C432B60E93218F5B84982B0F9800E6EF918AEC4B729AB1A67C82EF2C4D281352D1BEAEB6B9026CAA0CA8FB03F9257E2CA034471EE25CF6E214BB770E233566A67155BE8FB8F9DA0A76964CFD19E9C97D3E57AAA26E7A6C16B12F2B2BFD4C437857032F0A7198567B9CD3A54BD06CE61A1EBACD70D464185719BC8E0381C99E80A5783D389BE73E97166A328CEDB3AA4D722D453EB4CA893299E41DDC81C798BC76CAF070BFF144F6800D8FE5B3B6BCC9A1138E7ADA6DAF3F581AAB0137A6D40E640E76F6539B1450EA30A55E3F56C2C0A8DCC6F9F4D4F185D25AF37B46B9D9B8ED5CA257DD32EDE02FF95C6174C9D4BA1E30035723C7E2DED9EB0794AAA1913073E4EA2D5649C5C491B252AF88FF1D71EFB5E9FFCA921F0F27F72723DD5014359D08101278DF3F9A9A10DDE54B93A386C6844A6D15AF142DA956A3999458D10BBDE4E947BE949199F088B91175EC9EEE3C95AC47C96D802B0DC91AA6DB5B8A03E0985412DD23CD33FD961175CD271E02BF8A05A537E8FE21CDB40EBAAC0C8D4718DA4499D5B5EF935B848F92C25E9CAE76021758EDD1AA202A0D0DC357348B0474069002EB8F5F2760F2C5BEE38C7CEA07737C28864F647F2406BD55ABD58EEED97A4C8E659143441B1F8CB8DEFE457B46B5E76541CAB63FA1CD3626F0A45DB8A37964BF2613A6C64E6E6E478D44A2AF19CAD6C2686FD55EC85CACD645E58C364CBBD09EF1C7FE7420A8EF277982B87CA18D16B97980B14D24747D9BC86563DA81DA
message_type: D0E8075C

03:33:27.240
     classid: server_DH_params_ok#D0E8075C
       nonce: 4479257F6C01C039A3DEAD031BC2D6A4
server_nonce: 4F9DB065B36308CF4D9965725DD7153D
  enc_answer: 752C7BDBB6A58D68B76D2E20DCECF611B2837CA34F3688B242192C633FBBC1EC9348880DA6E6AFF42B256D8476A2C432B60E93218F5B84982B0F9800E6EF918AEC4B729AB1A67C82EF2C4D281352D1BEAEB6B9026CAA0CA8FB03F9257E2CA034471EE25CF6E214BB770E233566A67155BE8FB8F9DA0A76964CFD19E9C97D3E57AAA26E7A6C16B12F2B2BFD4C437857032F0A7198567B9CD3A54BD06CE61A1EBACD70D464185719BC8E0381C99E80A5783D389BE73E97166A328CEDB3AA4D722D453EB4CA893299E41DDC81C798BC76CAF070BFF144F6800D8FE5B3B6BCC9A1138E7ADA6DAF3F581AAB0137A6D40E640E76F6539B1450EA30A55E3F56C2C0A8DCC6F9F4D4F185D25AF37B46B9D9B8ED5CA257DD32EDE02FF95C6174C9D4BA1E30035723C7E2DED9EB0794AAA1913073E4EA2D5649C5C491B252AF88FF1D71EFB5E9FFCA921F0F27F72723DD5014359D08101278DF3F9A9A10DDE54B93A386C6844A6D15AF142DA956A3999458D10BBDE4E947BE949199F088B91175EC9EEE3C95AC47C96D802B0DC91AA6DB5B8A03E0985412DD23CD33FD961175CD271E02BF8A05A537E8FE21CDB40EBAAC0C8D4718DA4499D5B5EF935B848F92C25E9CAE76021758EDD1AA202A0D0DC357348B0474069002EB8F5F2760F2C5BEE38C7CEA07737C28864F647F2406BD55ABD58EEED97A4C8E659143441B1F8CB8DEFE457B46B5E76541CAB63FA1CD3626F0A45DB8A37964BF2613A6C64E6E6E478D44A2AF19CAD6C2686FD55EC85CACD645E58C364CBBD09EF1C7FE7420A8EF277982B87CA18D16B97980B14D24747D9BC86563DA81DA

tmp_aes_key: 297CB750FF0052B67515B3F11B45F11F15D106BC25ED0027570D5B9D83102BFA
 tmp_aes_iv: CBDCF40A77B6A1C7CE74A1F8EC8E091A49FAD3B9A2499BFFFD084D537A53B36D
     answer: BA0D89B54479257F6C01C039A3DEAD031BC2D6A44F9DB065B36308CF4D9965725DD7153D03000000FE000100C71CAEB9C6B1C9048E6C522F70F13F73980D40238E3E21C14934D037563D930F48198A0AA7C14058229493D22530F4DBFA336F6E0AC925139543AED44CCE7C3720FD51F69458705AC68CD4FE6B6B13ABDC9746512969328454F18FAF8C595F642477FE96BB2A941D5BCD1D4AC8CC49880708FA9B378E3C4F3A9060BEE67CF9A4A4A695811051907E162753B56B0F6B410DBA74D8A84B2A14B3144E0EF1284754FD17ED950D5965B4B9DD46582DB1178D169C6BC465B0D6FF9CA3928FEF5B9AE4E418FC15E83EBEA0F87FA9FF5EED70050DED2849F47BF959D956850CE929851F0D8115F635B105EE2E4E15D04B2454BF6F4FADF034B10403119CD8E3B92FCC5BFE000100C49E858CA0107FF9B51DC88236370866BE4A69DDC2193930769C11722D2884CE5017AF60712B6BAC17F79DBA8701A25AAA901FDCB483C56A246C1CA7705FAA87F0AFD68EAC8FC5EC88307298DAF7252DD6D8630BF819D65F9E4B5624B6A05149B35B8509A63C2F2D05417F38DD0A90727F5D12CC4D213B5974C732FB261F6AC01426F2B7269C17230442AA8C9AFCCD927463C4EC8465F841D969F0C47FC270D8EC23B1F5D861EB6A5602CF6F87A02A56A4094E06509503CACE935461086668AC32E8C69A90EB19C3232B20635DFADFC6E4EDC11FA34A3E2E2BBA28DDCEF422120077D3A171A6A5B65744113AF0D0A1FC566D31DBBDB43F5DE35A7CE5F0BB0ECD39FE0756646CF781176C3EAC

     classid: Server_DH_inner_data#B5890DBA
       nonce: 4479257F6C01C039A3DEAD031BC2D6A4
server_nonce: 4F9DB065B36308CF4D9965725DD7153D
           g: 00000003  3
    dh_prime: C71CAEB9C6B1C9048E6C522F70F13F73980D40238E3E21C14934D037563D930F48198A0AA7C14058229493D22530F4DBFA336F6E0AC925139543AED44CCE7C3720FD51F69458705AC68CD4FE6B6B13ABDC9746512969328454F18FAF8C595F642477FE96BB2A941D5BCD1D4AC8CC49880708FA9B378E3C4F3A9060BEE67CF9A4A4A695811051907E162753B56B0F6B410DBA74D8A84B2A14B3144E0EF1284754FD17ED950D5965B4B9DD46582DB1178D169C6BC465B0D6FF9CA3928FEF5B9AE4E418FC15E83EBEA0F87FA9FF5EED70050DED2849F47BF959D956850CE929851F0D8115F635B105EE2E4E15D04B2454BF6F4FADF034B10403119CD8E3B92FCC5B
         g_a: C49E858CA0107FF9B51DC88236370866BE4A69DDC2193930769C11722D2884CE5017AF60712B6BAC17F79DBA8701A25AAA901FDCB483C56A246C1CA7705FAA87F0AFD68EAC8FC5EC88307298DAF7252DD6D8630BF819D65F9E4B5624B6A05149B35B8509A63C2F2D05417F38DD0A90727F5D12CC4D213B5974C732FB261F6AC01426F2B7269C17230442AA8C9AFCCD927463C4EC8465F841D969F0C47FC270D8EC23B1F5D861EB6A5602CF6F87A02A56A4094E06509503CACE935461086668AC32E8C69A90EB19C3232B20635DFADFC6E4EDC11FA34A3E2E2BBA28DDCEF422120077D3A171A6A5B65744113AF0D0A1FC566D31DBBDB43F5DE35A7CE5F0BB0ECD
 server_time: 5607FE39  1443364409
 client_time: 5607FE37  1443364407
     padding: 646CF781176C3EAC

DH_Prime is Safe? = True

     classid: Client_DH_Inner_Data#6643B654
       nonce: 4479257F6C01C039A3DEAD031BC2D6A4
server_nonce: 4F9DB065B36308CF4D9965725DD7153D
    retry_id: 0000000000000000  0
         g_b: 923A21384FE0318D569B2F2BEA667D1A999050A0A1B5AFDA39F2B890DEE45F9ED08E319C8243CD1496269CCF956DFA6C98633BDC2E26B1675C15D7904417EC2A74C687E682ED14182178BC0BD189F6E020131C87FD42A24798FCCD2416348EE0AAF534B652175BAC33E89C82874A8C3E8562815DDA213610167B10153EFC1BD1A0CFBACFEA22E3E8D80917F262D2C67BF1327A245CF7FE0E299F7517EE6A2F65568630A6191FEB0C1254F260A6554ED2BEE19E94AAB693E58DD032C26B9CAFEB0482F12DE2573B6E6D2816AC37ADDF3B99525FDBAF94690926320CC67ABF35D3EA6EC6CC7211BAF11FBDD6897959F6F1E3D4335B89B3024C1B3C0066246B5DCD

03:33:27.590  enc_data: 0A974C499344B093ADF321597858B1A6179E2A6C21F5FF9EB5DE687CDB57F8059509482FF9846FBE99D9411C13A645B26F73960424A13337D87DA879864FCA9D0883B643CF8EB594446038E0B6C4FD606D0CB77F1E00CCA6291DD65733F6A60217C7F366AD88972F107C381FD375F49DB57A2AB96988EC916629CD6F58B53F65DF4909AA773CCA43CE43671CA313528190213CF28A3B29BE26865BE22EB0C41E89CBD698C96CBC1B7B7F1586FBD61B422693859843F7D32083E3AB23D607FC4B874DB849F430F74483969ABA4603B483C94BCEB38F8EC90EEB58B338B325A8E37B57813CEC7E795B1B5517D732227856955C53BA18F52E55C6BCD8F1419D43D46DF2C2560B74BA7AA961BB4BDD09ABBC95E4F57AC4B8C89A67C7C5453A3EFB635D3977E0C3F0067C1F4D255F1F87E74A8E7E4272DFDEB9B85ABBEFA4953B2E0ECAA15C3C77773155C4013955BAB0D85F
03:33:27.810  auth_Key: 87A801A14AD6426E6AD56B638B315DF9F5B66F77333DC8C0FAADB77A1D51E71B68F5BB9B21DB275F2C4CA495E6440DDEACBDB199C52C327F7E2E9D78921E0D632CCA63DB6384FAF387E9D41717899EE5D54609C2F88573BBE8128FB5864CB62BC7F0ED250CBB57929AA5198FE568FC76FB846262A505B42D04BCB87C9EB24007CE9F9BDEB79391E7E9425F3A3D5028410E129C078EB8644EAB770F8705D8228CFAEAA4478A0D8E326971C7C2223074C4302C1F1DE5D08AC00CBEBEE41981B57A4248B517386DE68A51D01087F0E58D75A4C0FD2D031BC5BFC08651C4133494B572150EDD1C486153E8F51F99771DD57F55B3A5BBAE1874F25E69150C4E3C1397
03:33:27.813
    raw_data: 0000000000000000009C48D037FE0756780100001F5F04F54479257F6C01C039A3DEAD031BC2D6A44F9DB065B36308CF4D9965725DD7153DFE5001000A974C499344B093ADF321597858B1A6179E2A6C21F5FF9EB5DE687CDB57F8059509482FF9846FBE99D9411C13A645B26F73960424A13337D87DA879864FCA9D0883B643CF8EB594446038E0B6C4FD606D0CB77F1E00CCA6291DD65733F6A60217C7F366AD88972F107C381FD375F49DB57A2AB96988EC916629CD6F58B53F65DF4909AA773CCA43CE43671CA313528190213CF28A3B29BE26865BE22EB0C41E89CBD698C96CBC1B7B7F1586FBD61B422693859843F7D32083E3AB23D607FC4B874DB849F430F74483969ABA4603B483C94BCEB38F8EC90EEB58B338B325A8E37B57813CEC7E795B1B5517D732227856955C53BA18F52E55C6BCD8F1419D43D46DF2C2560B74BA7AA961BB4BDD09ABBC95E4F57AC4B8C89A67C7C5453A3EFB635D3977E0C3F0067C1F4D255F1F87E74A8E7E4272DFDEB9B85ABBEFA4953B2E0ECAA15C3C77773155C4013955BAB0D85F
 auth_key_id: 0000000000000000  0
  message_id: 5607FE37D0489C00  6199202927769852928
 data_length: 00000178  376
message_data: 1F5F04F54479257F6C01C039A3DEAD031BC2D6A44F9DB065B36308CF4D9965725DD7153DFE5001000A974C499344B093ADF321597858B1A6179E2A6C21F5FF9EB5DE687CDB57F8059509482FF9846FBE99D9411C13A645B26F73960424A13337D87DA879864FCA9D0883B643CF8EB594446038E0B6C4FD606D0CB77F1E00CCA6291DD65733F6A60217C7F366AD88972F107C381FD375F49DB57A2AB96988EC916629CD6F58B53F65DF4909AA773CCA43CE43671CA313528190213CF28A3B29BE26865BE22EB0C41E89CBD698C96CBC1B7B7F1586FBD61B422693859843F7D32083E3AB23D607FC4B874DB849F430F74483969ABA4603B483C94BCEB38F8EC90EEB58B338B325A8E37B57813CEC7E795B1B5517D732227856955C53BA18F52E55C6BCD8F1419D43D46DF2C2560B74BA7AA961BB4BDD09ABBC95E4F57AC4B8C89A67C7C5453A3EFB635D3977E0C3F0067C1F4D255F1F87E74A8E7E4272DFDEB9B85ABBEFA4953B2E0ECAA15C3C77773155C4013955BAB0D85F
message_type: F5045F1F

03:33:27.823  Send:Success:397
03:33:27.983  Receive:Success:73
03:33:27.985
 类似资料:
  • 编辑:为了澄清,获取授权代码按预期工作。这纯粹是将授权代码交换为失败的令牌的步骤。 我正在尝试使用PKCE流实现授权代码,以便使用spotify API进行身份验证。我知道这里有很多库,但我真的想自己实现它。我所说的流程是:https://developer.spotify.com/documentation/general/guides/authorization-guide/#authoriz

  • 问题内容: 我很快将使用Java的log4j类来创建项目。但是我不认为我对此有任何了解。希望有人能启发我这个小问题。 问题答案: Log4j基本上接受您要输出的任何语句,让您为其分配“严重性”级别(警告,错误,严重等),并以多种方式将其注销。(对于文件,字节流等,有很多附加选项可用。) 这是对log4j的简短介绍。 http://www.developer.com/open/article.php

  • 本文向大家介绍Springboot如何实现Web系统License授权认证,包括了Springboot如何实现Web系统License授权认证的使用技巧和注意事项,需要的朋友参考一下 在我们做系统级框架的时候,我们要一定程度上考虑系统的使用版权,不能随便一个人拿去在任何环境都能用,所以我们需要给我们系统做一个授权认证机制,只有上传了我们下发的lic文件并验证通过,才能正常使用,下面就开始一步一步实

  • 我试图将Dropwizard用作一个完整的网络服务器,通过REST应用编程接口将服务的公共页面、受保护的页面和数据结合起来。因此,我正在通过应用基于计算令牌和领域的自定义授权方案来管理不同的安全区域来验证保护某些路由的能力。 我很难理解如何达到目的。我期望的顺序如下: 显示带有用户表单的 HTML 登录页 用户输入其凭据 调用身份验证路由以验证凭据并为用户创建令牌。发回一个带有授权标头的欢迎页面,

  • 我想尝试使用SIMD指令编写一个atoi实现,以包含在RapidJSON(一个C JSON阅读器/写入器库)中。它目前在其他地方进行了一些SSE2和SSE4.2优化。 如果是速度增益,可以并行完成多个结果。这些字符串最初来自JSON数据的缓冲区,因此多原子函数必须执行任何所需的滑动。 我提出的算法如下: 我可以用以下方式初始化长度为N的向量:[10^N..10^1] 我将缓冲区中的每个字符转换为一

  • 我正在使用AudioTrack制作Android MP3播放器应用程序。我不能在任何情况下使用MediaPlayer,我使用16位单声道和44100Hz。我听说方法可以使用类实现,但我不太清楚这一点。请帮帮我。