restful接口安全访问权限

restful接口安全访问权限

restful安全机制:

服务端为客户端颁发密钥对(AccessKey/SecretKey)。其中 AccessKey 会在传输中包含,而接口调用者必须保管好 SecretKey 不在网络上传输以防止被窃取。若 SecretKey 被窃取,可能导致非常严重的数据泄漏风险。因此,如发现 SecretKey 被非法使用应第一时间向服务端申请更换密钥。

针对不同的使用场景,设置不同的安全方案,主要包含开发调试环境、生产环境两种情况。

一、开发调试环境:

为了接口开发、调试的方便,采用相对低一些的安全方案:

  1. 每一个rest请求均需在 HTTP 请求头部增加一个 Token 字段,其值为一个签名字符串。
  2. 每次请求时生产待签名的原始字符串,用json表示:

    1
    2
    3
    4
    {
    "expireTime":1451491200000,
    "environment":"dev"
    }

    urlpath: 每次rest请求 URL 中 <path><path>?<query> 的部分

    expireTime: Token的失效时间,毫秒时间戳

  3. 对 JSON 原始字符串进行URL安全的 Base64 编码:

    1
    encodedPolicy  = urlsafe_base64_encode(policy)
  4. 对待签名的原始字符串计算HMAC-SHA1签名:

    1
    sign = hmac_sha1(encodedPolicy, "<SecretKey>")
  5. 对签名进行URL安全的Base64编码:

    1
    encodedSign = urlsafe_base64_encode(sign)
  6. 最后将经过URL安全的Base64编码处理的AccessKey和encodedSign用.(英文点号)链接起来:

    1
    Token = urlsafe_base64_encode("<AccessKey>") + "." + encodedSign + "." + encodedPolicy

注意:为确保客户端、服务器对于授权截止时间的理解保持一致,需要尽量同步校准各自的时钟。或者适当加长expireTime的时间。

二、生产环境:

为了提高现场环境的安全性,将url请求作为签名的一部分:

  1. 每一个rest请求均需在 HTTP 请求头部增加一个 Token 字段,其值为一个签名字符串。
  2. 每次请求时生产待签名的原始字符串policy,用json表示:

    1
    2
    3
    4
    5
    {
    "urlPath": "/bigdata/wbp/v2.2.0/aggregation/submitTask",
    "expireTime":1451491200000,
    "environment":"prod"
    }

    urlpath: 每次rest请求 URL 中 <path><path>?<query> 的部分

    expireTime: Token的失效时间

  3. 对 JSON 原始字符串进行URL安全的 Base64 编码:

    1
    encodedPolicy  = urlsafe_base64_encode(policy)
  4. 对待签名的原始字符串计算HMAC-SHA1签名:

    1
    sign = hmac_sha1(encodedPolicy, "<SecretKey>")
  5. 对签名进行URL安全的Base64编码:

    1
    encodedSign = urlsafe_base64_encode(sign)
  6. 最后将经过URL安全的Base64编码处理的AccessKey和encodedSign用.(英文点号)链接起来:

    1
    Token = urlsafe_base64_encode("<AccessKey>") + "." + encodedSign + "." + encodedPolicy

注意:为确保客户端、服务器对于授权截止时间的理解保持一致,需要尽量同步校准各自的时钟。或者适当加长expireTime的时间。

参考链接:http://docs.aws.amazon.com/AmazonS3/latest/dev/S3_Authentication2.html