''' <summary>
''' '获取api签名方法
''' </summary>
''' <param name="SecretId">SecretId</param>
''' <param name="SecretKey">SecretKey</param>
''' <param name="Flieurl">桶路径加文件名:xxx/xx.jpg</param>
''' <param name="HttpMethod">请求方式:put</param>
''' <returns></returns>
Public Shared Function GetAuthorization(ByVal SecretId As String, ByVal SecretKey As String, ByVal Flieurl As String, ByVal HttpMethod As String) As String
'开始时间
Dim StartTimestamp As DateTime = DateTime.Now
'签名有效时间 单位秒,默认10分钟
Dim ExpiredTime As Integer = 600
'请求参数
Dim NVC As NameValueCollection = New NameValueCollection()
'请求头
Dim RequestHeader As Net.WebHeaderCollection = New Net.WebHeaderCollection()
HttpMethod = HttpMethod.ToLower()
If StartTimestamp > DateTime.Now Then StartTimestamp = DateTime.Now
'步骤1:生成 KeyTime
Dim startTimestamplong As Long = (StartTimestamp.ToUniversalTime().Ticks - 621355968000000000) / 10000000
Dim endTimestamp As Long = startTimestamplong + ExpiredTime
Dim keyTime As String = String.Format("{0};{1}", startTimestamplong, endTimestamp)
'步骤2:生成 SignKey
Dim SignKey As String = HMACSHA1(SecretKey, keyTime)
'步骤3:生成 UrlParamList 和 HttpParameters
Dim Key As List(Of String) = New List(Of String)()
Dim KeyValue As List(Of String) = New List(Of String)()
Dim Param As Dictionary(Of String, String) = New Dictionary(Of String, String)()
If NVC IsNot Nothing Then
For Each k In NVC.Keys
Dim kk As String = HttpUtility.UrlEncode(k.ToString()).ToLower()
Param.Add(kk, HttpUtility.UrlEncode(NVC(k.ToString())))
Key.Add(kk)
Next
Key.Sort()
For Each k In Key
KeyValue.Add(String.Format("{0}={1}", k, Param(k)))
Next
End If
Dim HttpParameters As String = If(NVC IsNot Nothing, String.Join("&", KeyValue.ToArray()), "")
Dim UrlParamList As String = If(NVC IsNot Nothing, String.Join(";", Key), "")
'步骤4:生成 HeaderList 和 HttpHeaders
Key.Clear()
Dim Hearder As Dictionary(Of String, String) = New Dictionary(Of String, String)()
If RequestHeader IsNot Nothing Then
For Each k In RequestHeader.AllKeys
Dim kk As String = HttpUtility.UrlEncode(k).ToLower()
Hearder.Add(kk, HttpUtility.UrlEncode(RequestHeader(k)))
Key.Add(kk)
Next
Key.Sort()
KeyValue.Clear()
For Each k In Key
KeyValue.Add(String.Format("{0}={1}", k, Hearder(k)))
Next
End If
Dim HttpHeaders As String = If(RequestHeader IsNot Nothing, String.Join("&", KeyValue.ToArray()), "")
Dim HeaderList As String = If(RequestHeader IsNot Nothing, String.Join(";", Key), "")
'步骤5:生成 HttpString
Dim HttpString As String = String.Format("{0}" & vbLf & "{1}" & vbLf & "{2}" & vbLf & "{3}" & vbLf, HttpMethod, Flieurl, HttpParameters, HttpHeaders)
'步骤6:生成 StringToSign
Dim StringToSign As String = String.Format("sha1" & vbLf & "{0}" & vbLf & "{1}" & vbLf, keyTime, SHA1(HttpString))
'步骤7:生成 Signature
Dim Signature As String = HMACSHA1(SignKey, StringToSign)
'步骤8:生成签名
Dim qianming As String = String.Format("q-sign-algorithm=sha1&q-ak={0}&q-sign-time={1}&q-key-time={1}&q-header-list={2}&q-url-param-list={3}&q-signature={4}", SecretId, keyTime, HeaderList, UrlParamList, Signature)
Return qianming
End Function
'HMACSHA1加密方法
Public Shared Function HMACSHA1(ByVal secretKey As String, ByVal content As String) As String
Dim keyByte As Byte() = Encoding.[Default].GetBytes(secretKey)
Dim hmacsha1s As System.Security.Cryptography.HMACSHA1 = New System.Security.Cryptography.HMACSHA1(keyByte)
Dim messageBytes As Byte() = Encoding.[Default].GetBytes(content)
Dim hashmessage As Byte() = hmacsha1s.ComputeHash(messageBytes)
Dim sb As StringBuilder = New StringBuilder("")
For Each b As Byte In hashmessage
sb.AppendFormat("{0:x2}", b)
Next
Return sb.ToString()
End Function
'SHA1加密方法
Public Shared Function SHA1(ByVal content As String) As String
Dim sha1s As System.Security.Cryptography.SHA1CryptoServiceProvider = New System.Security.Cryptography.SHA1CryptoServiceProvider()
Dim c As Byte() = Encoding.[Default].GetBytes(content)
Dim sc As Byte() = sha1s.ComputeHash(c)
Dim sb As StringBuilder = New StringBuilder("")
For Each b As Byte In sc
sb.AppendFormat("{0:x2}", b)
Next
Return sb.ToString()
End Function