前後端分離資料的加密和驗籤

2021-09-24 22:58:09 字數 3807 閱讀 8463

加密規則:將前端傳來的所有引數中,pop掉sign引數《待校驗的加密結果》,將其餘所有的引數按照ascii碼的公升序排序,在拼接上前後端預定的規定的api_key,將拼接結果md5加密。

備註:示例中引數之間的拼接使用的為 "&",可根據具體情況自定義

後端**示例:

#!/usr/bin/env python

# -*- coding: utf-8 -*-

"""資料加密驗籤

"""import hashlib

import operator

class signation(object):

"""sign class

"""def __init__(self, api_key):

self.api_key = api_key # api_key:固定字串,前後端預定好的字串

def get_params_dict(self, params):

"""將所有的urlencode格式的請求引數轉化為字典格式

:param params:

:return:

"""return

def _get_order_dict(self, params):

"""獲取有序字典

:param params: 字典資料 格式

:return: 按key公升序排序的字典

"""return dict(sorted(params.items(), key=operator.itemgetter(0))) # operator.itemgetter 獲取到的是乙個函式

def _concat_str(self, order_dict):

"""鍵值拼接

:param order_dict: 有序字典

:return:

"""return "&".join([str(k) + "=" + str(v) for k, v in order_dict.items()])

def get_sign(self, params, api_key):

"""返回加密結果

:param params: 請求引數字典

:param api_key: 固定字串

:return:

"""order_dict = self._get_order_dict(params)

str_data = self._concat_str(order_dict)

return hashlib.md5((str_data + '&apikey=' + api_key).encode()).hexdigest()

def get_valid(self, params, sign):

"""校驗sign 返回true或false

:param params: 前端傳來的請求引數

:param sign: 前端傳來的加密結構

:return:

"""return sign == self.get_sign(self.get_params_dict(params), self.api_key)

前端js**示例 《額外加了乙個時間戳的引數,可不用》

/**

* 獲取當前的時間戳

*/function getcurrenttimestamp()

/** * 獲取加密函式

* @param params 請求相關引數

* @param timestamp 當前時間戳

* @param apikey 規定字串

*/function getsign(params,timestamp, apikey) else if (typeof params === "object")

arr.push(("timestamp"+"="+timestamp));

return paramsstrsort(arr.join(("&")),apikey);

}}function paramsstrsort(paramsstr,apikey)

備註:

前後端使用md5校驗時,加密方式要定義好,要保證前後端使用中文時,加密結果任然一致《即保證加密方式的編碼格式一致》

示例中後端使用的是python的標準庫hashlib,前端的md5為:

/**

* 封裝md5

* @param string

*/function md5(string)

function md5_addunsigned(lx, ly)

if (lx4 | ly4) else

} else

}function md5_f(x, y, z)

function md5_g(x, y, z)

function md5_h(x, y, z)

function md5_i(x, y, z)

function md5_ff(a, b, c, d, x, s, ac) ;

function md5_gg(a, b, c, d, x, s, ac) ;

function md5_hh(a, b, c, d, x, s, ac) ;

function md5_ii(a, b, c, d, x, s, ac) ;

function md5_converttowordarray(string)

lwordcount = (lbytecount - (lbytecount % 4)) / 4;

lbyteposition = (lbytecount % 4) * 8;

lwordarray[lwordcount] = lwordarray[lwordcount] | (0x80 << lbyteposition);

lwordarray[lnumberofwords - 2] = lmessagelength << 3;

lwordarray[lnumberofwords - 1] = lmessagelength >>> 29;

return lwordarray;

};function md5_wordtohex(lvalue)

return wordtohexvalue;

};function md5_utf8encode(string) else if ((c > 127) && (c < 2048)) else

}return utftext;

};var x = array();

var k, aa, bb, cc, dd, a, b, c, d;

var s11 = 7, s12 = 12, s13 = 17, s14 = 22;

var s21 = 5, s22 = 9, s23 = 14, s24 = 20;

var s31 = 4, s32 = 11, s33 = 16, s34 = 23;

var s41 = 6, s42 = 10, s43 = 15, s44 = 21;

string = md5_utf8encode(string);

x = md5_converttowordarray(string);

a = 0x67452301; b = 0xefcdab89; c = 0x98badcfe; d = 0x10325476;

for (k = 0; k < x.length; k += 16)

return (md5_wordtohex(a) + md5_wordtohex(b) + md5_wordtohex(c) + md5_wordtohex(d)).tolowercase();

} module.exports =

前後端的分離

對於大部分應用,已經不需要從後端讀取html頁面或者模板,前端完全可以根據資料自行渲染頁面 模板,這樣,前後臺互動就可以簡化為資料的增刪改查。利用ajax技術,實現頁面區域性重新整理,促使了前後臺分離的可能性。那麼,如何利用前後端分離開發模式,開始乙個專案呢?1.產品文件 產品經理會先設計好整個產品...

前後端分離及使用前後端分離的原因

前後端分離指的是前端採用純html頁面,通過ajax向後台請求資料。使用前後端分離的原因,通過在後台設定引數,可以控制html在遊覽器的快取時間,遊覽器訪問頁面時不需要向後台傳送請求。減少了後台伺服器的壓力。判斷遊覽器是否取的是快取 cache control max age 3600 響應頭中有這...

前後端分離後,使用token進行介面呼叫驗證處理

目前專案的發展趨勢是前後端分離,前端使用vue react angular等技術,後端提供介面。這種方式將後端開發人員從jsp html css js 中解放出來,更專注於後台邏輯的實現。但前後端分離後,由於後端介面是無狀態的,那使用者資訊等敏感資料如何拿到呢?可以使用token 令牌 機制進行實現...