加密規則:將前端傳來的所有引數中,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 令牌 機制進行實現...