App通信安全

    客戶端常常涉及用戶操做,用戶登陸須要使用用戶名和密碼,爲了安全起見,暴露密碼的過程越少越好。解決方案以下:redis

  1. 使用Https協議
    1)客戶端使用帳戶密碼登陸,服務器返回token。
    服務器收到客戶端帳戶和密碼登陸,生成<token, id>鍵值對,例如<123, 1>,並將信息存在redis或者memcache中。

    2)客戶端每次操做都攜帶token做爲身份驗證 。
    客戶端使用代token的API訪問服務器,服務器將數據返回給客戶端。
    例如:
    客戶端訪問 https://api.server.com/user/info?token=123,服務器根據token對應的id返回數據。

    3)客戶端退出登陸,token失效。
    客戶端退出登陸,服務器從緩存中刪除鍵值對。

    使用Https協議解決了通訊的明文問題,可是使用攜帶token的方式,身份驗證依賴token,若是Url被黑客截取,黑客就能夠利用token進行任何操做。
     
  2. URL簽名
    API中攜帶token,有可能會致使token泄露,URL簽名方式就是用於解決攜帶token的問題。
    1)客戶端使用帳戶密碼登陸,服務器返回token。
    服務器收到客戶端帳戶和密碼登陸,生成<id, token>鍵值對,例如<1, 123>,並將信息存在redis或者memcache中。

    2)客戶端每次操做都對URL簽名 。
    客戶端使用代簽名的API訪問服務器,服務器將數據返回給客戶端。
    例如:
    sign = md5(https://api.server.com/user/info?token=123)
    客戶端訪問 https://api.server.com/user/info?userId=1&sign=xxxx,服務器根據userId讀取緩存的token,並按照規則進行md5散列生成簽名,將生成的簽名和URL中攜帶簽名對比,若是相同則操做合法,並返回數據。可是這個方案存在缺陷,若是url被截取,任何人均可以經過url獲取用戶信息。

    改進:
    sign = md5(https://api.server.com/user/info?timestamp=1425860700&token=123) 
    客戶端訪問 https://api.server.com/user/info?userId=1&timestamp=1425860700&sign=xxxx,服務器根據先拿URL上的timestamp與當前時間對比,若是時間差超過必定時間(好比30s),則認爲非法操做;若是時間差合法,則繼續後面操做。

    3)客戶端退出登陸,token失效。
    客戶端退出登陸,服務器從緩存中刪除鍵值對。

    URL簽名的方式只能保護token不被泄露,可是沒法保證敏感數據不被截取。
     
  3. AES對稱加密
    URL簽名保證了token不被泄露,可是並不能保證敏感數據泄露。

    1)客戶端使用帳戶密碼登陸,服務器返回token。
    服務器收到客戶端帳戶和密碼登陸,生成<id, token>鍵值對,例如<1, 123>,並將信息存在redis或者memcache中。

    2)客戶端每次操做都對URL簽名 。
    客戶端使用代簽名的API訪問服務器,服務器將數據返回給客戶端。
    例如:
    sign = md5(https://api.server.com/user/info/name?timestamp=1425860700&token=123)
    客戶端POST訪問https://api.server.com/user/info/name?userId=1&timestamp=1425860700&sign=xxx修更名字,這時候就會暴露本身的名字。
     改進:
    secret_name = AES(name, token) 
    sign = md5(https://api.server.com/user/info/secret_name?timestamp=1425860700&token=123)
    客戶端POST訪問https://api.server.com/user/info/secret_name?userId=1&timestamp=1425860700&sign=xxx修更名字,服務器使用AES解密secret_name,再進行修改操做。 

    3)客戶端退出登陸,token失效。
    客戶端退出登陸,服務器從緩存中刪除鍵值對。
     
  4. 更進一步安全 使用DES加密操做,Https原理就是先使用RSA加密獲取key,再使用AES加密通信; 涉及敏感信息都須要輸入密碼確認,密碼用不存在客戶端。
相關文章
相關標籤/搜索