“我们每个人都是安全工作者”(参见关于软件开发,都应该知道的10个常识), 这绝不是一句戏言。在人工智能智能领域,安全同样是一个重要的话题。AI操作系统要保证系统的安全性,那么基于AI操作系统的开放平台同样要保证安全性。

放心用吧!浅谈DuerOS的安全性_访问令牌

基于DuerOS 的小度系列音箱是否安全? 基于DuerOS开发的技能服务是否安全呢? 

小度系列音箱的安全性

很多朋友问我,“使用小度音箱是否安全呢?它是不是总在监听我说话呢?”。

《​​智能音箱场景下的性能优化​​》一文中描述了智能音箱的工作原理,音箱的唤醒和语音识别是两个部分。当用户说“小度小度”唤醒词的时候, 这部分的语音识别是在音箱本地进行的,也就是音箱自身的AI部分, 当唤醒完成之后,用户的语音才会传到DuerOS的云端,完成语音识别,自然语言处理等等。举个例子, 大家在一个屋子里聊天, 很多声音你可以充耳不闻,当我说“小明,小明”,小明才会意识到我要和他说话,对我接下来的对话进行响应。

因此,智能音箱并没有将用户的语音都进行云存储,只有在用户要求音箱响应的时候才做出来,是相对安全的。

至于智能音箱其他方面的安全性都是要遵守各种国家规范的,就小度系列音箱而言, 有着严格的准入准出机制,包括显式/隐式接口,存储芯片,加密等级,固件更新等,基本上可以做到比手机的安全性更好。

放心用吧!浅谈DuerOS的安全性_DuerOS_02

DuerOS的安全体系

DuerOS系统的安全性构建在百度整个的安全体系之上,安全体系一般包括六个方面:

  • 物理与环境安全
  • 安全流程管理及相关审计
  • 灾难恢复和业务连续性
  • 云平台安全技术
  • 云客户云安全服务
  • 数据安全

安全架构的核心包括百度智能网关、入侵检测和防御系统,流量清洗系统和漏洞检测系统等,可有效实现防DDoS以及各类网络4、7层攻击等。

百度发布了公司层面的《数据安全策略》,所有数据进行分级保护。所有用户敏感信息,将以最高安全等级“机密”级别进行管理。在处理机密数据资产时,必须遵守机密数据管理流程与技术标准要求。主要包括:

  • 所有的数据有明确的数据owner和管理者,明确数据访问/使用范围,遵循数据访问权限最小化原则。并通过技术手段和相关流程对数据进行安全管理,推动保护措施的实施。
  • 发布明确的制度对机密数据的访问、获取进行管理,包括第三方需求的管理。建立明确的访问授权审批要求且所有审批记录线上化。
  • 各系统或使用者知道明确的数据销毁处理流程,并采用合理的数据销毁技术。
  • 对机密数据管理执行定期审核。
  • 所有承载、存储机密数据的系统,必须具备4A基本要求(Account、Authentication、Authorization、Audit)。机密数据的访问必须细化到个人,必须有安全的登录机制,所有人的访问已授权且符合最小化原则,所有行为日志记录齐全且远程备份满足可审计。

因此, DuerOS系统自身的安全性是值得信赖的。

放心用吧!浅谈DuerOS的安全性_数据_03

DBP技能开放平台的安全性

DBP(DuerOS Bot Platform)是对开发者开放的平台,以通信认证的方式保证DuerOS 系统与第三方服务的安全性。也就是说,在技能服务与DuerOS通信的过程中,双方都需要对接收到的请求信息进行认证,避免接收到恶意攻击者发来的请求,从而保证通信内容安全。

在传输层面,技能服务必须使用HTTPS进行通信,以保证通信内容的传输安全。应用服务层面的安全性采用的是双向认证。

双向认证——DBP请求第三方服务

当DuerOS向技能发送请求时,技能需要对发来的请求进行验证,验证过程如下:

  1. 从http head的signaturecerturl地址里面下载权威签名证书,然后从签名证书中获取公钥。
  2. 从http head中获取signature信息,并用base64解码signature得到str1。
  3. 通过公钥和str1解密得到sign1。如果解密成功,继续验证。如果解密失败则拒绝请求。
  4. 使用sha1计算消息body的内容得到sign2,并与sign1进行比较,如果一致则继续验证,如果不一致,则拒绝请求。
  5. 比较request请求消息中的timestamp字段与系统当前的时间,如果两者差值小于180秒,则认为当前请求合法,对请求进行处理。如果两者差值大于等于180秒,则拒绝请求。

验证过程中的2-4步可以使用rsa_verify函数代替。下图展示了DuerOS生成签名过程和技能验证签名的过程。

放心用吧!浅谈DuerOS的安全性_数据_04

双向认证——第三方服务请求DBP服务

当DuerOS收到技能发送的请求时,需要对技能发来的请求进行验证,验证步骤如下。

  1. 从http head中获取signature,并进行base64位解密获得str1。
  2. 从DBP平台上获取技能的公钥,并将公钥与str1通过解密获得sign1,如果解密失败则拒绝请求。
  3. 将body、botId、timestamp三个字符串按顺序连接成str2,并对str2生成摘要sign2,比较sign1与sign2是否相同,如果不同则决绝请求,如果相同,则继续验证。
  4. 比较请求消息中的timestamp字段与系统当前时间,如果两者差值小于180秒,则认为请求合法,对请求进行处理。如果两者差值大于等于180秒,则拒绝请求。

DuerOS验证签名过程中的2-3步可以使用rsa_verify函数代替。下图展示了技能生成签名过程和DuerOS验证签名的过程。

放心用吧!浅谈DuerOS的安全性_访问令牌_05

生成公私钥的RSA方法

RSA方法生成的公钥和私钥是成对出现的,在DuerOS与技能通信过程中起着重要的作用。可以采用OpenSSL来生成RSA的公私钥,私钥的生成示例如下:

​genrsa -out rsa_private_key.pem 1024​

根据私钥生成公钥的方式如下:

​rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem​

没错, 和我们在其他环境中的应用没什么两样。

当然,如果采用了CFC的形式进行部署,DBP 平台已经完成了上述功能,无需开发者显示操作。

用户隐私与账户管理

安全性中的一个重要方面是用户隐私,在DuerOS中所有涉及用户隐私的操作都要用户的显式授权,例如位置信息,录音,支付等等。例如技能向用户推荐附近的美食时需要知道用户的地址信息,向用户邮箱推送用户关注的资讯时需要用户的邮箱信息。技能只有经过用户的授权才能使用用户的信息。

用户授权

技能可以通过向DuerOS发送Permission.AskForPermissionsConsent指令获取用户的权限。当收到用户响应时,DuerOS会向技能发送授权成功或授权失败事件。

Permission.AskForPermissionsConsent指令的协议格式如下:

{
"type": "Permission.AskForPermissionsConsent",
"permissions": [
{
"name": "{{ENUM}}"
},
...
],
"token": "{{STRING}}"
}

当技能申请用户授权成功时,DuerOS会向技能上报授权成功事件,消息格式如下:

{
"type": "{{STRING}}",
"requestId": "{{STRING}}",
"timestamp": "{{STRING}}",
"token": "{{STRING}}"
}

如果技能需要用户授权的数据,必须在DBP 平台的技能描述进行显式选择。为了保护用户数据,技能在使用用户数据信息必须满足以下条件。如果发现技能违背了下面的原则,DuerOS有权下线技能,并通知开发者对技能进行修改。

  • 技能必须满足DuerOS隐私政策。
  • 技能只有在提供服务时才能使用用户信息。使用用户信息时,必须告知用户使用范围,在用户同意并且不违背用户隐私和法律的情况下使用。
  • 技能使用用户信息,包括用户的昵称、邮箱、电话、头像等,都必须通过向DuerOS发送请求消息来获取,不能将用户的信息本地存储。
  • 技能每次提供服务时,必须使用API接口请求用户最新的信息。

账户关联

另一类典型的授权需求是账户关联,需要将用户的DuerOS账号与已有应用系统的账户进行关联,以获取应用系统的信息。DuerOS支持技能将用户的DuerOS账户与用户的其他系统账号关联起来,使技能提供更多的服务。

目前,在DBP技能开放平台上,仅自定义技能和智能家居技能会涉及账户关联功能,内容播报等技能不涉及账户关联。例如,当用户使用一个关于微博内容分享的自定义技能时,如果用户说“小度小度,查看我的关注”,此时技能会为用户展现微博的关注信息。在这个过程中,技能首先需要获取用户在微博账户的授权,然后才能登录用户的微博,获取微博的关注信息并展现。

技能将用户的DuerOS账户与用户的第三方系统帐户关联时,需要第三方系统为该用户账户提供一个访问令牌,以便在第三方系统中唯一地标识用户。DuerOS保存访问令牌,并将令牌包含在发送给技能的请求中。技能使用访问令牌代表用户身份访问第三方系统,通过该系统的身份验证,进而获取到用户在该系统中的信息或者资源。

DuerOS 采用OAuth 2.0的授权码模式完成账户关联,过程如下:

放心用吧!浅谈DuerOS的安全性_访问令牌_06

  1. 当需要用户授权时,会在屏幕或app(无屏设备启用技能时)上显示第三方系统的登录页面(即开放平台的填写的授权地址)。技能请求该授权地址时会携带state(必选)、client_id(必选)、response_type(必选)、scope(可选)和redirect_uri(必选)等参数信息。
  2. 用户在第三方系统的登录界面填写账户信息并进行登录授权。
  3. 第三方系统对用户的身份进行验证。通过身份验证后第三方系统会重定向到redirect_uri地址,并附上授权码。
  4. 重定向地址redirect_uri使用授权码向认证服务器(在技能开放平台上填写的token地址)申请令牌。
  5. 认证服务器核对授权码和redirect_uri,确认无误后,向DuerOS发送access token和refresh token。
  6. DuerOS验证返回信息,保存access token和refresh token。

也就是说,当技能应用支持用户使用帐户关联功能时,开发者需要设计、编写登录页面。该页面需要验证用户在第三方系统的登录信息,并返回访问令牌。如用户在技能商店app中启用智能家居技能时,会跳转到技能提供的第三方系统的登录界面。用户登录第三方系统进行访问授权,该页面验证用户的信息是否正确,正确时返回访问令牌。登录页面需要满足以下要求:

  • 基于HTTPS访问。
  • 可以适配不同的设备,包括手机app、各种有屏设备端。
  • 不允许出现任何弹出窗口。
  • 必须接受用户的登录信息凭据,然后对用户进行身份验证。
  • 需要能生成一个授权码code,该code可以传递到技能的授权服务器并返回access token访问令牌。
  • 必须跟踪查询字符串中传递的state值,及原封不动的返回该state的值。
  • 完成用户登录信息验证时,需要重定向到redirect_uri地址,同时携带参数state和授权码code。

当用户禁用技能时,DuerOS将删除技能与该用户关联的访问令牌和刷新令牌,取消该用户的DuerOS账户与用户其他系统账户之间的连接。当用户再次启用技能时,需要重新将用户的DuerOS账户与提供服务的用户账户进行关联。

综上所述,在使用基于DuerOS的各种服务时,无论从设备端,还是AI操作系统,亦或第三方技能服务,都在安全性上提供一定的保证,一句话,放心用吧!

放心用吧!浅谈DuerOS的安全性_数据_07