# 數據簽名
* * * * *
OneBase中的數據簽名安全性驗證分兩種,第一種是無需識別來源的數據驗證(比如驗證登錄后的SESSION是否被修改),第二種是驗證API接口數據安全性(比如客戶端請求數據是否被修改,服務端返回數據是否被修改),此處來講解一下第二種數據簽名驗證流程。

### 服務端驗證
* * * * *
先來講一下服務端驗證流程,意思就是 客戶端調用接口時,服務端如何知道客戶端請求的數據在請求中途是否被修改或者是否惡意模擬請求接口。
若某接口需要驗證請求數據安全性,則需要啟動數據簽名安全驗證,如下圖。

比如此處使用登錄接口做測試,啟動請求數據簽名驗證后,再來看看測試接口的地方。

發現比之前多了一項,data_sign,這項參數是必填,也就是此接口必須有數據簽名字段才能請求通過。
下面來看看 data_sign 怎么生成。
~~~
// 過濾后的數據生成數據簽名
function create_sign_filter($data = [], $key = '')
{
$filter_data = sign_field_filter($data);
return empty($key) ? data_md5_key($filter_data, API_KEY) : data_md5_key($filter_data, $key);
}
~~~
上面這個函數就是生成data_sign的函數,能發現若不傳入 key 則使用了系統自帶的API_KEY 生成,這種一般用于固定的終端角色,比如 咱們的產品 只有咱們內部人員才需要請求接口,這樣的話 就可以不用傳遞key,等開發完成后將API_KEY告知咱們的終端工程師即可。
若咱們平臺做的很大,需要很多人或企業請求咱們的接口咋辦?
很簡單,只需要 維護 人或企業 與 key 的關聯即可,這樣第二個參數就派上了用場,在不同的人或企業生成數據簽名時傳入相關聯的key。
下面來驗證一下

上圖報了數據簽名錯誤,因為data_sign是隨便輸入的。。
下面咱們生成一個簽名
~~~
$data['username'] = 'admin';
$data['password'] = '111111';
dump(data_md5_key($data, API_KEY));
// 輸出結果:016fa798c3446b96521e06d46849d246
~~~
然后發現成功了。

若數據在請求中途被修改或者惡意模擬。。比如我將密碼修改為222222

發現數據只要被修改后簽名就提示錯誤,這樣就可以有效的防止別人惡意請求接口,必須拿到咱們的KEY按咱們的要求生成數據簽名才可以驗證通過。
### 客戶端驗證
* * * * *
現在需要反過來思考,服務端驗證數據安全啦,那么客戶端如何保證數據也是安全的?
下面來看看如何響應數據簽名。

此處選擇是即可自動響應數據簽名,比如登錄接口啟動響應數據簽名后。

到這一步服務端的任務已經完成了,下面就來看客戶端如何表演咯。
比如下面使用PHP代碼模仿客戶端校驗。
~~~
$data['member_id'] = 1;
$data['nickname'] = 'admin';
$data['username'] = 'admin';
$data['create_time'] = '2018-01-31 17:25:52';
dump(data_md5_key($data, API_KEY));
// 輸出結果:b3bf7ba6416a3d924dab88862d4d6128
~~~
使用服務端返回的數據按照指定的KEY與算法進行處理后還原了數據簽名,客戶端需要比較自己生成的簽名與服務端跟數據一起響應的數據簽名是否一樣,若一樣則驗證通過 執行后續操作,若不一樣則存在安全隱患應該終止后續操作。
這就是 OneBase API模塊中的數據安全性雙向簽名驗證,保證數據安全性。^_^
- 序言
- 基礎
- 安裝環境
- 安裝演示
- 規范
- 目錄
- 介紹
- 后臺介紹
- 后臺首頁
- 會員管理
- 系統管理
- 系統設置與配置管理
- 菜單管理
- 系統回收站
- 服務管理
- 插件管理
- 文章管理
- 接口管理
- 優化維護
- SEO管理
- 數據庫
- 文件清理
- 行為日志
- 執行記錄
- 統計分析
- 接口介紹
- 接口文檔
- 錯誤碼設計
- Token介紹
- 前臺介紹
- 架構
- 架構總覽
- 生命周期
- 入口文件
- 模塊設計
- 依賴注入
- 控制器架構
- 邏輯架構
- 驗證架構
- 服務架構
- 模型架構
- 行為架構
- 插件架構
- 配置
- 配置介紹
- 配置加載
- 配置擴展
- 請求
- 請求信息
- 日志
- 后臺行為日志
- 系統執行日志
- 框架日志
- 數據
- 數據庫設計
- 數據字典
- 數據庫操作
- 事務控制
- 混合操作
- 實戰
- 控制器
- 邏輯與驗證
- 視圖與模型
- 插件研發
- 服務研發
- 接口研發
- 雜項
- 數據導入導出
- 二維碼條形碼
- 郵件發送
- 云存儲服務
- 支付服務
- 短信服務
- 微信分享
- 生成海報
- 聊天室
- PJAX
- Demo
- Widget
- 附錄
- 常量參考
- 配置參考
- 函數參考
- 進階
- Redis
- 自動緩存
- 全自動緩存
- 索引
- 數據簽名
- 全自動事務
- 隊列