云服务中使用的AK/SK简单介绍

本文介绍了AK(AccessKeyId)和SK(SecretAccessKey)的概念及其在客户端和服务端的应用原理。AK用于标识用户身份,而SK作为密钥用于生成签名以确保数据传输的安全性。通过非对称加密技术,确保了传输过程中的安全性。

AK 和 SK 是什么?

  • AK (Access Key Id):用于标识用户,通常是一个公开的字符串。
  • SK (Secret Access Key):是用户用于加密认证字符串和验证认证字符串的密钥。SK 必须保密,只能由用户(客户端)保存。

AK/SK 的获取

客户端通常会提供下载 AK/SK 的功能,服务端会保存 AK 和 AK 对应的 domainIDuserID 等信息。

使用原理(签名、验签、非对称加密)

客户端流程:
  1. 构建 HTTP 请求:请求中包含 Access Key
  2. 生成签名
    • 使用原始报文进行哈希算法计算,得到摘要。
    • 使用 SK 对摘要进行加密,生成签名(signature)。
  3. 发送请求:将请求体发送给服务端,请求体包括 AK、原始报文和签名。
服务端流程:
  1. 查找用户信息:根据客户端发送的 Access Key,在数据库中查找对应的 AK 和用户信息。
  2. 验证签名
    • 使用上面步骤2相同的hash算法对原始报文进行计算,得到摘要1。
    • 使用 AK 对客户端发送的签名进行解密(非对称加密知识,公钥加密私钥解密,私钥加密公钥解密/验签),得到摘要2。
    • 比较摘要1 和摘要2,如果相同则认证通过。

http://image.huawei.com/tiny-lts/v1/images/6dc91e18b41f63de87c4fa01a4b897b9_500x276.png@900-0-90-f.png

优点

  • AK/SK是随机生成的,相比账号密码,不存在人为设置弱密码的风险,基本排除被暴力破解的可能性。
  • 在通信的过程中,SK是不会暴露在传输通道的,账号密码的方式是会暴露在传输通道中的(即使做了加密)。所以使用AK/SK在某些场景也是可以使用HTTP协议进行传输的(请求体不包含SK,即使不使用加密传输问题也不大)
  • 相较于账号密码,AK/SK本身可以用来做权限的划分(待补充)
  • 为不同的 AK 分配不同的权限:例如,一个 AK 只能读取数据,另一个 AK 可以读写数据。
  • 基于角色的权限控制:将 AK 与角色绑定,角色定义了一组权限,从而实现对用户操作的精细控制。
  • 临时 AK/SK:可以为临时用户生成具有有限权限和有效期的 AK/SK,适用于临时访问场景。
  • 示例场景

  1. 云存储服务

    • 用户通过 AK/SK 认证后,可以上传、下载或删除文件。
    • 不同的 AK 可以限制用户只能访问特定的存储桶或目录。
  2. API 网关

    • 客户端通过 AK/SK 认证后,可以调用特定的 API。
    • 不同的 AK 可以限制客户端只能调用某些 API 或限制调用频率。
  3. 微服务架构

    • 服务之间通过 AK/SK 进行认证和授权,确保只有合法的服务可以相互调用。

通过 AK/SK 机制,可以实现高效、安全的身份认证和权限管理,适用于各种分布式系统和云服务场景。

AK/SK(Access Key/Secret Key)是一种常见的身份认证机制,广泛用于云服务、API接口调用等场景。以下是关于AK/SK密钥管理机制的详细解答。 ### 什么是AK/SK? - **Access Key (AK)**: 公钥,用于标识用户身份。 - **Secret Key (SK)**: 私钥,用于签名生成,确保请求的完整性和真实性。 ### AK/SK的工作流程 1. 用户使用AKSK对请求进行签名。 2. 服务端接收到请求后,根据AK找到对应的SK,验证签名是否正确。 3. 如果签名正确,则处理请求;否则拒绝请求。 ### 示例代码:使用Python实现AK/SK签名机制 以下是一个简单AK/SK签名生成和验证的示例代码: ```python import hashlib import hmac import time # 签名生成函数 def generate_signature(secret_key, message): return hmac.new(secret_key.encode('utf-8'), message.encode('utf-8'), hashlib.sha256).hexdigest() # 验证签名函数 def verify_signature(access_key, secret_key, message, signature): expected_signature = generate_signature(secret_key, message) return hmac.compare_digest(signature, expected_signature) # 示例主程序 if __name__ == "__main__": # 假设的AKSK access_key = "example_access_key" secret_key = "example_secret_key" # 构造消息 timestamp = str(int(time.time())) method = "GET" endpoint = "/api/resource" message = f"{method}\n{endpoint}\n{timestamp}" # 生成签名 signature = generate_signature(secret_key, message) print(f"Generated Signature: {signature}") # 验证签名 is_valid = verify_signature(access_key, secret_key, message, signature) if is_valid: print("Signature is valid.") else: print("Signature is invalid.") ``` ### 上述代码解释 1. `generate_signature` 函数使用HMAC-SHA256算法生成签名。 2. `verify_signature` 函数通过对比生成的签名与传入的签名来验证请求的真实性。 3. 在主程序中,构造了一个包含时间戳、HTTP方法和API路径的消息,并生成了签名。 ### AK/SK安全性注意事项 1. **保护SK**: SK必须严格保密,避免泄露。 2. **定期轮换**: 定期更换AK/SK以减少因泄露导致的风险。 3. **IP白名单**: 限制只有特定IP可以使用AK/SK。 4. **过期机制**: 设置AK/SK的有效期,防止长期未使用的密钥被滥用。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值