面试题答案
一键面试身份验证
1. 选择身份验证协议
- OAuth 2.0:适用于这种场景,因为它是一种广泛使用的授权框架,允许第三方应用在用户同意的情况下访问其在另一个服务提供商上的资源。在物联网设备交互中,它可以确保只有经过授权的应用程序能与设备通信。例如,设备制造商可以作为授权服务器,应用程序通过OAuth流程获取访问令牌来与设备交互。
2. Ruby实现
- 使用
omniauth
库:require 'omniauth' require 'omniauth-oauth2' Rails.application.config.middleware.use OmniAuth::Builder do provider :oauth2, 'client_id', 'client_secret', authorize_url: 'https://device - auth - server.com/authorize', token_url: 'https://device - auth - server.com/token' end
- 这段代码是在Rails应用中配置使用OAuth 2.0的示例。
omniauth - oauth2
宝石帮助设置与授权服务器的交互,client_id
和client_secret
是应用程序在授权服务器注册时获得的凭证。authorize_url
和token_url
是授权服务器提供的端点。
- 这段代码是在Rails应用中配置使用OAuth 2.0的示例。
数据加密
1. 选择加密算法
- AES(高级加密标准):AES是一种对称密钥加密算法,广泛应用且被认为是安全的。它有不同的密钥长度(如128位、192位、256位),可根据安全需求选择。在物联网设备通信中,由于设备资源可能有限,128位密钥长度在提供足够安全性的同时,对资源的消耗相对较小。
2. Ruby实现
- 使用
openssl
库:require 'openssl' key = OpenSSL::Random.random_bytes(16) # 128 - bit key iv = OpenSSL::Random.random_bytes(16) cipher = OpenSSL::Cipher::AES.new(128, :CBC) cipher.encrypt cipher.key = key cipher.iv = iv plaintext = "sensitive data from IoT device" encrypted = cipher.update(plaintext) + cipher.final
- 这段代码生成一个128位的随机密钥
key
和初始化向量iv
。然后创建一个AES - 128 - CBC(Cipher Block Chaining)模式的加密器。将明文plaintext
加密后得到encrypted
数据。
- 这段代码生成一个128位的随机密钥
访问控制
1. 实现方式
- 基于角色的访问控制(RBAC):定义不同的角色,如“管理员”、“普通用户”等,每个角色有不同的权限。例如,管理员可以配置设备参数,普通用户只能读取设备数据。
2. Ruby实现
- 在数据库中存储角色和权限:
- 假设使用ActiveRecord(在Rails应用中):
class Role < ApplicationRecord has_many :permissions end class Permission < ApplicationRecord belongs_to :role end class User < ApplicationRecord has_and_belongs_to_many :roles end
- 然后在控制器中检查权限:
class DeviceController < ApplicationController def config_device unless current_user.roles.exists?(name: 'admin') raise ActionController::Unauthorized, "You are not authorized to perform this action" end # 执行设备配置操作 end end
- 这里通过数据库表结构来管理角色和权限关系。在控制器方法中,检查当前用户是否具有“admin”角色,如果没有则抛出未授权异常。
- 假设使用ActiveRecord(在Rails应用中):