What is new in Android security (M and N Version) - Google I/O 2016 翻译

截至发博,字幕还在后期中,应该快了吧。
YouTube视频链接:https://www.youtube.com/watch?v=XZzLjllizYs

字幕翻译:
1
00:00:01,820 –> 00:00:04,920
他们告诉我计时已经开始了
They pointed at me and the clock started moving.

2
00:00:04,920 –> 00:00:08,640
我们有44分钟外加56秒来讨论安全问题
We have 44 minutes and 56 seconds to talk about security.

3
00:00:08,640 –> 00:00:10,090
早上好
Good morning.

4
00:00:10,090 –> 00:00:12,270
现在是早上9点
It’s 9:00 AM.

5
00:00:12,270 –> 00:00:14,580
我今早6点就坐公交车从旧金山过来
I caught the bus down from San Francisco at 6:00 AM

6
00:00:14,580 –> 00:00:17,160
然后在公交车上修改了幻灯片的
this morning to clean up some last little details

7
00:00:17,160 –> 00:00:18,890
最后一点细节
of my slides on the bus.

8
00:00:18,890 –> 00:00:22,040
大家都吃早饭了吗
Did everybody find coffee and breakfast?

9
00:00:22,040 –> 00:00:23,420
如果还没,去吃吧
If not, go find it.

10
00:00:23,420 –> 00:00:24,110
然后再回来
Come back.

11
00:00:24,110 –> 00:00:26,380
我们会在这等一小会
We’ll be here for a little bit.

12
00:00:26,380 –> 00:00:28,560
我的名字叫 Adrian Ludwig
My name is Adrian Ludwig.

13
00:00:28,560 –> 00:00:30,730
我带领的 Android 安全团队
I head up the Android Security team

14
00:00:30,730 –> 00:00:34,539
在那个方向有至少3个展区
here at Google, or at least three blocks over that way at Google.

15
00:00:34,539 –> 00:00:38,310
我们负责 Android 平台的安全事务
We’re responsible for the security of the Android platform.

16
00:00:38,310 –> 00:00:41,190
这个平台具有多样性并且变化迅速
The platform is a broad, diverse, growing kind

17
00:00:41,190 –> 00:00:43,390
像你们知道的那样
of incredible thing, as many of you know.

18
00:00:43,390 –> 00:00:50,070
所以我们的工作范围也具有多样性而且变化迅速
So the scope of what we do is also broad, diverse, and growing.

19
00:00:50,070 –> 00:00:52,580
你已经看到了
You saw a couple things that were mentioned yesterday

20
00:00:52,580 –> 00:00:56,260
昨天提出的一些 Android N 的新特性
in the keynote that are new features that were introduced

21
00:00:56,260 –> 00:00:58,340
我们正致力于
in Android N that we’ve been working

22
00:00:58,340 –> 00:01:00,500
和其他的 Android 团队一起
with the rest of the Android team to enable,

23
00:01:00,500 –> 00:01:02,440
把类似文件基础加密 媒体服务器强化
things like File Based Encryption,

24
00:01:02,440 –> 00:01:04,640
以及自动更新等功能付诸实践
Media Server Hardening, and Automatic Updates.

25
00:01:04,640 –> 00:01:06,570
有一些核心改变在 Android N 的介绍中
These are some of the core changes that

26
00:01:06,570 –> 00:01:11,580
已经提到过了 那些建立在安全模型上的技术
have been introduced in Android N. Those of course

27
00:01:11,580 –> 00:01:17,010
现在已经扩展到 Android 平台中了
build on a security model that extends deep into the platform.

28
00:01:17,010 –> 00:01:19,160
这不是遥不可及的未来 它触手可及
It’s not just a future here, a future there.

29
00:01:19,160 –> 00:01:22,090
这些是关于我们如何把应用分段
It’s about how we have segmented applications.

30
00:01:22,090 –> 00:01:24,430
我们如何在 Android 平台中把权限独立出来
How we have isolated capabilities

31
00:01:24,430 –> 00:01:26,630
以及我们用来实现
in the platform and the underlying technologies

32
00:01:26,630 –> 00:01:29,540
这些安全功能的底层技术
that we’re using to deliver those security features.

33
00:01:29,540 –> 00:01:34,410
不过这并不仅仅限于 Android 自身
It’s not limited just to Android itself though.

34
00:01:34,410 –> 00:01:37,060
我们在 Android 操作系统
The work that we do in securing the Android operating

35
00:01:37,060 –> 00:01:39,660
Android 平台与 Android 生态系统中
system, the Android platform, and the Android ecosystem

36
00:01:39,660 –> 00:01:42,140
所做的安全工作已经被
extends to a broad range of applications

37
00:01:42,140 –> 00:01:46,210
扩展到了 Google 的安全服务范畴中
that we deliver that we talk about as the Google Security Services.

38
00:01:46,210 –> 00:01:49,290
这些在昨天的主题分享中
Those also got a very brief mention yesterday

39
00:01:49,290 –> 00:01:51,570
也提到过了
in the keynote that I wanted to flag,

40
00:01:51,570 –> 00:01:56,650
目前我们每天的扫描次数超过十亿次
which is that at present we’re doing over a billion scans per day.

41
00:01:56,650 –> 00:01:58,605
我们称之为“检测” 因为不做安全工作的人
We say checks, because non-security people are

42
00:01:58,605 –> 00:02:01,530
觉得相比扫描一词 检测听起来更让人舒服一点
more comfortable with the idea of doing a checkup than doing a scan.

43
00:02:01,530 –> 00:02:04,300
但是我们现在正在做的事就是
But what we’re doing is looking at security characteristics

44
00:02:04,300 –> 00:02:06,300
寻找设备上不那么安全的地方
on the devices that are out there in the world

45
00:02:06,300 –> 00:02:08,206
然后把它变得安全
to make sure that we’re keeping them safe.

46
00:02:08,206 –> 00:02:09,580
其中我们关注的一件事就是数字
One of the things that we look at

47
00:02:09,580 –> 00:02:12,660
即被安装到设备上的
is the number, the broad range of applications that have been

48
00:02:12,660 –> 00:02:13,910
应用数量
installed on these devices.

49
00:02:13,910 –> 00:02:16,530
所以我们每天检测应用的数量超过80亿
So we check over 8 billion applications

50
00:02:16,530 –> 00:02:19,770
来保证你的全方位安全
every single day, to give you a sense of the overall scope.

51
00:02:19,770 –> 00:02:23,000
Dave 无法知道的其中一件事就是
One of the things that Dave wasn’t able to get into

52
00:02:23,000 –> 00:02:26,550
他不知道这究竟意味着什么
was what exactly these things mean.

53
00:02:26,550 –> 00:02:28,740
大概三个还是四个星期前我们推出了
About three or four weeks ago we published

54
00:02:28,740 –> 00:02:32,250
一个名叫“安全检查年”的活动
something called the “Annual Security Year in Review,” where

55
00:02:32,250 –> 00:02:34,170
我们在这些安全服务中
we went into a lot of the work that we’ve

56
00:02:34,170 –> 00:02:36,910
做了大量的工作
been doing investing in these security services,

57
00:02:36,910 –> 00:02:40,520
使得已经投入使用的 Google 后台技术
making them more capable, using the technology

58
00:02:40,520 –> 00:02:43,540
能够进行更加复杂的分析
that Google has in our back end to deliver

59
00:02:43,540 –> 00:02:46,062
并理解现在的 Android 生态系统中
more and more sophisticated analysis of applications,

60
00:02:46,062 –> 00:02:47,770
正在
more and more sophisticated understanding

61
00:02:47,770 –> 00:02:50,090
发生着什么
of what it is that’s going on in the Android ecosystem

62
00:02:50,090 –> 00:02:52,890
以便我们能更好的保护用户
so that we can better protect users.

63
00:02:52,890 –> 00:02:55,650
这张图其实意味着50页的文件
That 50-page document included this diagram.

64
00:02:55,650 –> 00:02:57,850
当然我不打算在这里展开说
I’m not going to go into a lot of detail here.

65
00:02:57,850 –> 00:03:04,070
但我想强调的是我们关注
But I wanted to emphasize that the vast majority of our focus

66
00:03:04,070 –> 00:03:06,530
每一件能够保护用户的事情
is on everything that we can do to protect users.

67
00:03:06,530 –> 00:03:10,630
所以无论从硬件的更新与安全
So that ranges from hardware updates and hardware security,

68
00:03:10,630 –> 00:03:13,320
还是平台的更新与安全还是服务
to platform updates and platform security features,

69
00:03:13,320 –> 00:03:14,872
都是我们所关心的范围
to services as well.

70
00:03:14,872 –> 00:03:16,830
而且我们正致力于安全的每一层
And we’re investing at every layer in the stack

71
00:03:16,830 –> 00:03:19,380
从而最大程度的保护用户
to try to protect users as best we can.

72
00:03:19,380 –> 00:03:23,000
现在我将详细解释
Now for today, I’m going to hone in on a handful

73
00:03:23,000 –> 00:03:25,010
Android M 和 N
of specific new capabilities that

74
00:03:25,010 –> 00:03:29,170
中的新特性
were introduced in Android M and Android N. M

75
00:03:29,170 –> 00:03:31,760
让我们从实际情况来看一下 Android M
because, let’s be realistic.

76
00:03:31,760 –> 00:03:34,170
它目前还没有被广泛的使用
It hasn’t gotten to a point where it has broad based adoption.

77
00:03:34,170 –> 00:03:35,700
所以如果你还没有花费很长时间思考
So it’s not terribly surprising if you

78
00:03:35,700 –> 00:03:37,070
怎样利用 Android M 中的特性
haven’t been spending a lot of time thinking

79
00:03:37,070 –> 00:03:39,070
那你是不会被震惊到的
about how to take advantage of the features that

80
00:03:39,070 –> 00:03:41,950
而且因为 Android N 现在比较火热
were introduced in M. And Android N because that’s the new hotness.

81
00:03:41,950 –> 00:03:44,970
而且它也推出
Or at least it will be as soon as it begins to roll out

82
00:03:44,970 –> 00:03:47,930
有几个月了
a couple of months from now.

83
00:03:47,930 –> 00:03:51,540
所以我想强调的是
So I wanted to emphasize though that this is just

84
00:03:51,540 –> 00:03:55,485
这只是我们所有工作的一部分
part of the overall sort of set of capabilities that we have.

85
00:03:55,485 –> 00:03:57,610
我们想为应用的开发人员做些事情
We want to build things for application developers.

86
00:03:57,610 –> 00:03:59,184
我们想为用户做些事情
We want to build things for users.

87
00:03:59,184 –> 00:04:01,100
而且我们也想为设备制造商做些事情
And we want to build things for device makers.

88
00:04:01,100 –> 00:04:04,569
而我认为目前 用户是最重要的
I think on the main stage, the focus was on users.

89
00:04:04,569 –> 00:04:06,110
当然我们也把很多时间
Elsewhere in the world we spend a lot

90
00:04:06,110 –> 00:04:07,790
用在了与设备制造商交流上
of time talking about device makers.

91
00:04:07,790 –> 00:04:09,170
但是今天 我们想要谈谈
But today, we’re going to talk about what

92
00:04:09,170 –> 00:04:10,628
我们正在做的新事情
are the new things that we’re doing

93
00:04:10,628 –> 00:04:12,530
为什么对开发者而言
to make your life as an application developer

94
00:04:12,530 –> 00:04:15,478
在 Android M 和 N 上开发软件更爽
better on Android M and N.

95
00:04:15,478 –> 00:04:17,760
所以这就是我主要想讲的几点
So these are some of the key features that I’m going to talk about.

96
00:04:17,760 –> 00:04:19,222
一共有七点
There are seven of them up here.

97
00:04:19,222 –> 00:04:21,180
我将一个一个的说
I’m just going to walk through them one by one.

98
00:04:21,180 –> 00:04:24,174
我们将逐一介绍
We’ll talk about what it is that was introduced,

99
00:04:24,174 –> 00:04:26,590
并且看一看部分源码
take a look at some source code so that you can understand

100
00:04:26,590 –> 00:04:28,440
以便你能更好的在你的应用中使用它
how you might incorporate it into your application

101
00:04:28,440 –> 00:04:29,800
而且还能增长开发经验
and your development experience.

102
00:04:29,800 –> 00:04:31,360
然后我们将讨论一下
And then talk about some of the best practices

103
00:04:31,360 –> 00:04:32,710
我们认为的
that we’ve been thinking about for how

104
00:04:32,710 –> 00:04:34,440
你将如何运用在你程序中的
we think it is that you’d want to be incorporating

105
00:04:34,440 –> 00:04:36,940
最佳范例
these new technologies into your application development.

106
00:04:36,940 –> 00:04:37,440
如何
Right?

107
00:04:37,440 –> 00:04:38,450
很直观吧
Pretty straightforward.

108
00:04:38,450 –> 00:04:41,450
嘣嘣嘣 然后跳到下一个 嘣嘣嘣
Boom, boom, boom, move to the next one, boom, boom, boom.

109
00:04:41,450 –> 00:04:44,225
没有绚丽的图标 只有一些代码
No fancy diagrams, just a little bit of code here and there.

110
00:04:44,225 –> 00:04:47,315
所以权限是我们将要讨论的第一个话题
So permissions is the first thing we’re going to talk about.

111
00:04:47,315 –> 00:04:50,400
你也许记得
You may remember, or you may know,

112
00:04:50,400 –> 00:04:53,020
如果你在装有 Android M 的 Nexus 设备上
if you’re running on Android M right now on Nexus device

113
00:04:53,020 –> 00:04:55,480
或是其他装有 Android M 的其他设备上运行程序
or one of the other devices that’s started to receive it,

114
00:04:55,480 –> 00:04:58,310
其中用户体验的一个主要变化就是
that one of the major changes in the user experience that

115
00:04:58,310 –> 00:05:02,270
运行时权限
was introduced with Marshmallow was runtime permissions,

116
00:05:02,270 –> 00:05:05,500
意思就是只有在程序运行过程中
the idea that an application can defer

117
00:05:05,500 –> 00:05:09,920
真正需要使用到相应权限时才进行申请
requesting the use of permissions until it really needs them.

118
00:05:09,920 –> 00:05:11,445
因此用户就有了
And that the user has the ability

119
00:05:11,445 –> 00:05:13,040
决定是否给予权限
to decide whether the application gets

120
00:05:13,040 –> 00:05:15,340
的权利
that specific permission or not.

121
00:05:15,340 –> 00:05:18,374
这是 Android M 中
Really a fundamental change in the way that applications

122
00:05:18,374 –> 00:05:20,790
申请敏感权限的
are going to request access to more sensitive capabilities

123
00:05:20,790 –> 00:05:22,632
一个根本性变化
on the device introduced with Marshmallow.

124
00:05:25,530 –> 00:05:27,500
从应用开发者的立场来说
From an application developer’s standpoint,

125
00:05:27,500 –> 00:05:29,680
这是一件很值得考虑的事情
it’s a really powerful thing for you to think about.

126
00:05:29,680 –> 00:05:32,080
它给了你简化安装应用过程
It gives you the ability to simplify the installation

127
00:05:32,080 –> 00:05:33,334
的能力
process for your application.

128
00:05:33,334 –> 00:05:36,460
因为你不需要提前申请所有的权限了
Because you don’t have to request all of those permissions up front.

129
00:05:36,460 –> 00:05:39,030
它也不需要
It gives you the ability to upgrade

130
00:05:39,030 –> 00:05:42,410
在用户确认升级之后
without having the user have to confirm that that upgrade is

131
00:05:42,410 –> 00:05:45,720
再升级
necessary for applications being delivered through, for example,

132
00:05:45,720 –> 00:05:46,830
比如说从 Google Play 上
through Google Play.

133
00:05:46,830 –> 00:05:49,090
因为这在安全性上
Because there’s no increase in the capabilities

134
00:05:49,090 –> 00:05:50,870
没有任何的变化
of the application in the security model.

135
00:05:50,870 –> 00:05:53,010
因此也没有让用户确认的必要
And so there’s no need for the user to affirm that.

136
00:05:53,010 –> 00:05:54,850
所以这真的可以提高
So this can really accelerate the rate

137
00:05:54,850 –> 00:05:56,766
你的应用的升级比例
at which your applications are being upgraded,

138
00:05:56,766 –> 00:06:00,590
如果你能在新平台上运用好运行时权限的话
if you take advantage of runtime permissions on these newer platforms.

139
00:06:00,590 –> 00:06:03,264
而且我认为 就我十分担心的问题
And from my perspective, when I think about security,

140
00:06:03,264 –> 00:06:05,180
安全性考虑而言
one of the things I worry about is making sure

141
00:06:05,180 –> 00:06:07,490
这可以确保用户知道应用中都在发生着什么
that users understand what it is that’s going on.

142
00:06:07,490 –> 00:06:10,250
而且我们也发现运行时权限对用户来说
And we found that runtime permissions are fundamentally

143
00:06:10,250 –> 00:06:12,172
是更加能够接受的
more understandable for users.

144
00:06:12,172 –> 00:06:13,630
这使得开发者可以
They give the application developer

145
00:06:13,630 –> 00:06:16,340
在更恰当的时候申请权限
the ability to provide context, and the user

146
00:06:16,340 –> 00:06:18,539
而用户也更好的理解
to understand how that capability is

147
00:06:18,539 –> 00:06:22,800
所申请的权限用在了什么地方
going to be associated with the application that they’re employing.

148
00:06:22,800 –> 00:06:24,550
如何
So what does it look like?

149
00:06:24,550 –> 00:06:26,342
这很直观吧
It’s pretty straightforward.

150
00:06:26,342 –> 00:06:29,216
你需要做的第一件事就是
The first thing that you want to do in the context of your application

151
00:06:29,216 –> 00:06:33,250
调用当时的局部环境并且检查自身的权限
is invoke the local environment and check self permission.

152
00:06:33,250 –> 00:06:36,890
我已经有这个权限了吗
Do I already have this permission?

153
00:06:36,890 –> 00:06:39,090
如果没有 那你可能需要
If you don’t, then you want to explain,

154
00:06:39,090 –> 00:06:40,815
向你的用户解释一下
probably provide some context to the user

155
00:06:40,815 –> 00:06:43,010
为何你要在此处申请权限
about why it is that you’re going to request that permission.

156
00:06:43,010 –> 00:06:45,640
在这个例子中申请的是读取联系人权限
In this particular instance it’s the use of read contacts.

157
00:06:45,640 –> 00:06:47,390
你可能说 我需要发邮件
So you might say, I want to send an email.

158
00:06:47,390 –> 00:06:48,973
如果我能够看到在你的联系人中
And it would be really nice if I could

159
00:06:48,973 –> 00:06:52,120
谁已经是你的好友了
see who you’re already friends with inside your contact

160
00:06:52,120 –> 00:06:54,740
这样会非常方便
environment, or make a call, or any number

161
00:06:54,740 –> 00:06:57,620
当然也可以是打电话或其他功能
of other types of functionality it might want to expose.

162
00:06:57,620 –> 00:06:59,934
如果你还没有读取过的话
If you do not have the capability already,

163
00:06:59,934 –> 00:07:01,600
那么你就需要申请权限了
then you’re going to need to request it.

164
00:07:01,600 –> 00:07:04,200
而且 API 也相当的简单 “Request Permission”
And there’s a simple API, “Request Permission.”

165
00:07:04,200 –> 00:07:06,520
然后你就可以请求权限了
And you can go ahead make that request.

166
00:07:06,520 –> 00:07:10,267
现在也许你已经申请到权限了 也许没有
And at that point, you now have that permission, or not.

167
00:07:10,267 –> 00:07:12,600
下面我们来演示一下
Let’s talk a little bit about some of the best practices

168
00:07:12,600 –> 00:07:14,774
确保你能申请到权限的最佳范例
to make sure that you actually get that permission.

169
00:07:14,774 –> 00:07:17,190
因为我们也要考虑到用户
Because that’s one of the things that people are concerned

170
00:07:17,190 –> 00:07:21,290
不一定总是会同意
about with runtime permissions is that they maybe don’t always

171
00:07:21,290 –> 00:07:22,012
申请权限的
say yes.

172
00:07:22,012 –> 00:07:24,886
所以你也需要考虑到
So you’re going to need to consider in the context of your application

173
00:07:24,886 –> 00:07:27,415
用户不同意的情况
that the user might say no.

174
00:07:27,415 –> 00:07:28,790
而且你也同样要考虑
And you’re going to want to think

175
00:07:28,790 –> 00:07:31,350
怎样做才能让更多的用户
about how it is that you can increase the likelihood

176
00:07:31,350 –> 00:07:32,730
通过权限申请
that the user will say yes.

177
00:07:32,730 –> 00:07:35,977
所以我们提供了一些设计准则
So one of the things that we did is provide some design guidelines.

178
00:07:35,977 –> 00:07:37,060
准则已经推出了
Those have been published.

179
00:07:37,060 –> 00:07:40,270
你可以在 developer.android.com
You can find them up on developer.android.com

180
00:07:40,270 –> 00:07:42,686
上找到一些最佳范例
that describe some of the best practices.

181
00:07:42,686 –> 00:07:45,740
最重要的是告诉用户
One of the most important ones is to provide some context for why it

182
00:07:45,740 –> 00:07:47,230
你将要用它来做什么
is that you’re going to do it.

183
00:07:47,230 –> 00:07:50,214
以 Hangouts 中的短信为例
So for example, in the case of SMS,

184
00:07:50,214 –> 00:07:51,880
如果你想在
in the case of the Hangouts application,

185
00:07:51,880 –> 00:07:53,310
应用中接收到
explaining hey, if you want to receive

186
00:07:53,310 –> 00:07:54,900
短信里的内容
SMS in the context of this application,

187
00:07:54,900 –> 00:07:56,608
那我们就需要读取短信的权限
we’re going to need to have access to it.

188
00:07:56,608 –> 00:07:58,152
我现在要请求权限了
And I’m going to request it now, then

189
00:07:58,152 –> 00:08:00,610
这有助于提高申请权限的成功率
makes it possible for you to request it and really increase

190
00:08:00,610 –> 00:08:03,800
用户觉得这对我确实有意义
the rate at which user say, OK, makes sense to me.

191
00:08:03,800 –> 00:08:05,460
接受吧
Go ahead and grant it.

192
00:08:05,460 –> 00:08:07,350
在加入了权限解释的 Google 应用中
Within the context of Google applications,

193
00:08:07,350 –> 00:08:11,220
我们发现85%的用户同意了权限申请
we found that about 85% of the time users do say yes.

194
00:08:11,220 –> 00:08:13,550
相比那些不加权限解释的应用
That’s better than the average that we’ve

195
00:08:13,550 –> 00:08:16,400
加了权限解释的应用权限申请通过率
seen for other applications that are sort of broadly distributed

196
00:08:16,400 –> 00:08:17,810
更高
on the Android platform.

197
00:08:17,810 –> 00:08:20,750
这是一个通过率提高了的例子
Just to give you some examples of how much better it is,

198
00:08:20,750 –> 00:08:25,180
大约15.8%的用户在第一次提示时拒绝了权限申请
about 15.8% of the time when we prompt a user, they say no.

199
00:08:25,180 –> 00:08:27,970
这比之前降低了40%
That’s about 40% lower.

200
00:08:27,970 –> 00:08:30,900
而其他应用的拒绝率
So for other applications, the failure rate on that request

201
00:08:30,900 –> 00:08:33,080
大概在20%到25%之间
is going to be about 20% to 25%.

202
00:08:33,080 –> 00:08:35,520
这其中差了40%
So about 40% difference between those.

203
00:08:35,520 –> 00:08:39,940
如果你不停的申请权限而用户又不停的拒绝申请
If you ask too many times and the user says no repeatedly,

204
00:08:39,940 –> 00:08:42,870
我觉得在三次之后
eventually, after I think three times,

205
00:08:42,870 –> 00:08:46,490
用户就有权利选择不要再申请了
the user has the option to say stop asking me.

206
00:08:46,490 –> 00:08:48,289
而且我们发现在 Google 应用中
And so we found that the stop asking me,

207
00:08:48,289 –> 00:08:51,470
拒绝再次申请的概率大约是3%
don’t ever ask me again rate for Google applications is about 3%.

208
00:08:51,470 –> 00:08:53,324
所以我们要在合适的时候申请权限
So effectively we prompt a couple of times

209
00:08:53,324 –> 00:08:54,740
这样用户
in order to get to the point where

210
00:08:54,740 –> 00:08:56,614
才不会觉得不舒服
the user is comfortable with the application.

211
00:08:56,614 –> 00:08:59,490
大约97%的用户
And we find about 97% of the time users

212
00:08:59,490 –> 00:09:02,360
通过了申请的权限
accept the permission ask that we’re making.

213
00:09:02,360 –> 00:09:05,209
上述就是你需要考虑的最佳范例
So those are the best practices that you want to think about.

214
00:09:05,209 –> 00:09:06,750
我们还做了
There’s another capability that we’ve

215
00:09:06,750 –> 00:09:08,530
一件大事
been expanding dramatically, which

216
00:09:08,530 –> 00:09:12,060
就是密钥材料的保护
is a protection of key material, cryptographic keys

217
00:09:12,060 –> 00:09:13,220
尤其是 Android 上的密钥
specifically on Androids.

218
00:09:13,220 –> 00:09:16,340
所以我们来讨论一下 Android 密钥库
So we’ll talk about the Android Keystore.

219
00:09:16,340 –> 00:09:18,990
密钥库广泛的应用在
The Keystore leverages hardware that

220
00:09:18,990 –> 00:09:22,545
Android 设备中
exists on the vast majority of Android devices.

221
00:09:22,545 –> 00:09:25,170
作为一名安全从业者
As a security practitioner, it’s always been really interesting

222
00:09:25,170 –> 00:09:28,750
我对那些带有 TrustZone 的设备十分感兴趣
to me that most devices, literally about 80% to 90%

223
00:09:28,750 –> 00:09:31,230
这些设备大概占到80%到90%
of devices have something called TrustZone on them.

224
00:09:31,230 –> 00:09:33,170
他们都有一个 TEE
They have a TEE that’s been put in place.

225
00:09:33,170 –> 00:09:37,300
它提供了一套可以访问 DRM 保护内容的机制
It was there to enable access to DRM protected content.

226
00:09:37,300 –> 00:09:39,410
我们这几年正在做的就是
What we’ve been doing over the last several years

227
00:09:39,410 –> 00:09:41,626
让开发者保护
is making that available to you as an application

228
00:09:41,626 –> 00:09:43,250
用户设备中的敏感功能与
developer as a means for you to protect

229
00:09:43,250 –> 00:09:46,660
密钥成为可能
the most sensitive capabilities and keys in your device.

230
00:09:46,660 –> 00:09:52,000
让我们从 jb-mr2 开始说起吧
So starting in jb-mr2.

231
00:09:52,000 –> 00:09:55,140
大概在四年前
So almost four years ago, we began implementing API

232
00:09:55,140 –> 00:09:56,830
我们开始不断的继承 API
after API after API.

233
00:09:56,830 –> 00:10:02,820
从 Android L 开始 陆续可以使用 RSA 和椭圆曲线数字签名算法
As of Android L, the ability to use RSA, elliptic curve DSA,

234
00:10:02,820 –> 00:10:07,620
即ECDSA 或是像 AES 这样的对称算法 还有 HMAC
so ECDSA, symmetric algorithms like AES, and then also HMAC,

235
00:10:07,620 –> 00:10:10,820
这些密钥都被内置在 TrustZone 中
where those keys are held inside of TrustZone and cannot be

236
00:10:10,820 –> 00:10:13,900
而没有展现在普通用户面前
exposed to the kernel or to anybody else on the device is

237
00:10:13,900 –> 00:10:18,630
但这些功能确实是设备的核心功能
one of the core capabilities that we’ve been enabled.

238
00:10:18,630 –> 00:10:20,540
其中一件非常重要的事就是
One of the really important things to do

239
00:10:20,540 –> 00:10:22,720
把它从大多数设备
is to transition from it being on most devices

240
00:10:22,720 –> 00:10:23,900
过渡到所有的设备
to being on all devices.

241
00:10:23,900 –> 00:10:27,340
因此这就变成了 Android N 的任务
So this became required as of the Android N release.

242
00:10:27,340 –> 00:10:29,230
我们从现在起将会看到
So we’re going to see, from here on out,

243
00:10:29,230 –> 00:10:32,150
所有的新设备都将装载它
all new devices are going to definitely have it on board.

244
00:10:32,150 –> 00:10:33,812
而且就在现在 绝大多数的
As it is right now, the vast majority

245
00:10:33,812 –> 00:10:38,620
高端或是中端设备都已经有 Keystore 了
of higher end and mid-range devices already have Keystore in place.

246
00:10:38,620 –> 00:10:42,490
所以 Android N 中的一个新特性
So one of the new features that was introduced with Android N

247
00:10:42,490 –> 00:10:44,280
就是密钥认证
was what we call attestation.

248
00:10:44,280 –> 00:10:47,020
关于密钥认证我们所做的就是把密钥
What we do with attestation is bake a key

249
00:10:47,020 –> 00:10:49,857
加进 TrustZone 中的固件中
into the firmware inside of TrustZone.

250
00:10:49,857 –> 00:10:51,940
这样你就可以验证
So it is possible for you to validate that this is

251
00:10:51,940 –> 00:10:53,231
硬件的合法性了
a legitimate piece of hardware.

252
00:10:53,231 –> 00:10:55,580
你可以通过创建一个密钥
And you can check that by creating a key

253
00:10:55,580 –> 00:10:57,700
然后检测绑定到
and then checking the search chain to tie it

254
00:10:57,700 –> 00:11:00,510
需要进行 CTS 测试的硬件搜索链
back to a piece of hardware that’s gone through CTS testing.

255
00:11:00,510 –> 00:11:02,260
我将用几秒钟的时间
And I’ll sort of talk through how

256
00:11:02,260 –> 00:11:04,444
稍微讨论一下你应该如何做
it is that you can do that in just a second.

257
00:11:04,444 –> 00:11:06,860
这是一个源码的
So here’s an example of what that looks like from a source

258
00:11:06,860 –> 00:11:08,370
例子
code standpoint.

259
00:11:08,370 –> 00:11:09,350
你需要做什么
What do you need to do?

260
00:11:09,350 –> 00:11:12,490
你需要从创建一个 KeyPair 开始
Well, you can start off by creating a key pair.

261
00:11:12,490 –> 00:11:16,050
你创建了一个 Android Keystore 的实例
So you create an instance of Android Keystore.

262
00:11:16,050 –> 00:11:18,760
在这个例子中 我们用的是椭圆曲线
In this instance, we’re using elliptic curves,

263
00:11:18,760 –> 00:11:21,120
所以你需要把它加入到你的算法中
so you specify that to your algorithm.

264
00:11:21,120 –> 00:11:23,410
我将要介绍一件在 Android M
One of the more interesting new capabilities

265
00:11:23,410 –> 00:11:25,440
中更有趣的特性
that was introduced actually in Android M

266
00:11:25,440 –> 00:11:27,240
那就是这个密钥只有刚被验证过的
was the ability to say this key can only

267
00:11:27,240 –> 00:11:31,069
用户才可以使用
be used if the user has recently authenticated.

268
00:11:31,069 –> 00:11:32,860
我再用几秒钟多说一点
I’ll talk more about that in just a second.

269
00:11:32,860 –> 00:11:34,710
这是一个很有力的声明
But that’s a really powerful statement that you can make.

270
00:11:34,710 –> 00:11:36,640
那就是你能知道有一个真真切切的用户
So that you know that there’s a real user that’s

271
00:11:36,640 –> 00:11:38,431
在与设备进行着交互
been interacting with the device right now.

272
00:11:38,431 –> 00:11:40,950
当然这也是被内置于 TrustZone 中的
And that’s been validated inside of TrustZone.

273
00:11:40,950 –> 00:11:42,745
所以你可以保护你的密钥
So you can protect your keys.

274
00:11:42,745 –> 00:11:44,370
然后你可以做的最后一件事就是
And then the last thing that you can do

275
00:11:44,370 –> 00:11:46,867
你能够获得与密钥相关的
is you can actually get the certificate chain associated

276
00:11:46,867 –> 00:11:47,450
证书
with that key.

277
00:11:47,450 –> 00:11:52,370
所以这密钥是绑定到设备上的
So that key is one that has been bound to a particular device.

278
00:11:52,370 –> 00:11:54,452
而且它不能转移到其他设备上
And it can’t move to some other device.

279
00:11:54,452 –> 00:11:56,910
然后你就可以通过看证书链
Then you can actually confirm by looking at the certificate

280
00:11:56,910 –> 00:12:00,450
确定这是一个已经通过 CTS 测试的正常设备
chain that it’s a device that legitimately went through CTS testing.

281
00:12:00,450 –> 00:12:02,790
它已经经过确认了
It’s gone through that kind of validation.

282
00:12:02,790 –> 00:12:06,740
所以我认为这种类型的功能是非常重要的
So I think this type of capability is really important for enhancing

283
00:12:06,740 –> 00:12:09,240
尤其是对通过 Google 检验的
the trust in those devices that have gone through the Google

284
00:12:09,240 –> 00:12:14,260
Android 测试设备信任度的增加
validation process and are valid, Android tested devices.

285
00:12:14,260 –> 00:12:18,522
所以你需要认真想一想
So some best practices, think for a moment

286
00:12:18,522 –> 00:12:20,730
你的应用中是否需要加上
whether there’s a case for you to be using encryption

287
00:12:20,730 –> 00:12:22,840
最佳范例中的加密功能
in the context of your application.

288
00:12:22,840 –> 00:12:25,340
如果是的话 那么 Keystore 对于你来说
And if so, then Keystore is a great place for you

289
00:12:25,340 –> 00:12:27,380
就是保存密钥最好的地方
to be storing those keys.

290
00:12:27,380 –> 00:12:28,170
它可供使用
It’s available.

291
00:12:28,170 –> 00:12:29,850
而且很直观
It’s very straightforward.

292
00:12:29,850 –> 00:12:32,060
而且它的优点在于
And it has the advantage of the key

293
00:12:32,060 –> 00:12:34,560
即使设备中的其他东西被破解了
not being exposed in the event of compromise of other things

294
00:12:34,560 –> 00:12:36,300
密钥也不会被暴露出来
on the device.

295
00:12:36,300 –> 00:12:39,590
你也可以用这个从 Android N 开始的密钥
You can also use the key, starting with Android N,

296
00:12:39,590 –> 00:12:42,100
来验证这是否是一个合法的 Android 设备
as a mechanism to validate that this is a legitimate Android

297
00:12:42,100 –> 00:12:47,270
而非一个不兼容的设备
device and not one that’s been created outside the compatibility.

298
00:12:47,270 –> 00:12:48,766
这就给了你进一步校验
And so that gives you the ability

299
00:12:48,766 –> 00:12:50,390
设备的能力
to do further validation of the device.

300
00:12:53,140 –> 00:12:54,600
我之前提到了验证
I hinted at authentication.

301
00:12:54,600 –> 00:12:56,190
让我们来谈论一些
So let’s talk a little bit about some of the changes

302
00:12:56,190 –> 00:12:58,023
关于验证方面的改变
that have gone into authentication recently.

303
00:13:00,872 –> 00:13:02,580
在加强验证方面
So there’s two different goals that we’re

304
00:13:02,580 –> 00:13:06,530
我们有两个不同的目标
striving for as we’re enhancing authentication.

305
00:13:06,530 –> 00:13:12,370
第一个就是 坦率地说
The first one is, well, let’s be frank,

306
00:13:12,370 –> 00:13:14,590
用户根本不喜欢验证
users don’t like authenticating.

307
00:13:14,590 –> 00:13:17,372
验证是很令人厌烦的
It’s annoying.

308
00:13:17,372 –> 00:13:18,580
我拿出我的设备
I want to take out my device.

309
00:13:18,580 –> 00:13:20,000
我就想马上使用它
And I want to use it immediately.

310
00:13:20,000 –> 00:13:21,900
我就想立刻看到内容
And I want to have access to my information.

311
00:13:21,900 –> 00:13:24,170
所以我们才开始调查
And so when we began looking into why

312
00:13:24,170 –> 00:13:26,654
为什么用户不在他们的设备上使用屏幕锁
it is that users didn’t have lock screens on their device.

313
00:13:26,654 –> 00:13:28,070
这就是为什么用户不喜欢
And why they didn’t use what seems

314
00:13:28,070 –> 00:13:31,680
使用这最基本的安全保护方式
to be the most fundamental security protection,

315
00:13:31,680 –> 00:13:34,830
答案就是 它们出现的太频繁了
the answer is, it just comes up too often.

316
00:13:34,830 –> 00:13:37,770
因此接近半数的用户
And almost half of Android users have

317
00:13:37,770 –> 00:13:40,330
决定不使用屏幕锁
decided that they don’t want a secure lock screen.

318
00:13:40,330 –> 00:13:42,220
所以我们尽力做的事情就是
So one of the things that we’re trying to do

319
00:13:42,220 –> 00:13:44,410
实现用户的愿望
is find ways to encourage that.

320
00:13:44,410 –> 00:13:48,011
如果在用户登入设备时
Because if we get to a point where the logging in mechanism

321
00:13:48,011 –> 00:13:50,010
在开始与设备交互时
is trustworthy, where authentication of the user

322
00:13:50,010 –> 00:13:51,340
就是被验证过的
at the time they start interacting with the device,

323
00:13:51,340 –> 00:13:52,850
那么你应用中的设置
then you can do a lot more and be

324
00:13:52,850 –> 00:13:55,255
其实可以更加的灵活
a lot more flexible in the set of applications that you can provide.

325
00:13:55,255 –> 00:13:57,440
所以 Android Pay 就是一个很好的例子
So Android Pay is a good example where,

326
00:13:57,440 –> 00:14:01,410
因为用户是已经被验证过的 他们就可以使用 Android Pay
because users are authenticated, they can have access to Android Pay.

327
00:14:01,410 –> 00:14:05,300
所以我们结合了这两种想法
So we actually bind those two ideas together.

328
00:14:05,300 –> 00:14:08,164
因此在介绍指纹解锁时就更容易了
So to make things easier we introduced fingerprints.

329
00:14:08,164 –> 00:14:10,080
这些我们之前都已经介绍过了
That was one of the things that was introduced

330
00:14:10,080 –> 00:14:12,220
包括 Nexus 手机上的 Android M
with Android M on Nexus phones and an API for you

331
00:14:12,220 –> 00:14:14,290
以及开发者所使用的API
to interact with it as an application developer.

332
00:14:14,290 –> 00:14:17,380
我们可以看到在 Nexus 设备上
On Nexus devices we’ve seen adoption of secure lock screen

333
00:14:17,380 –> 00:14:20,836
一旦加入了指纹解锁
go from about 50% to over 90% on devices

334
00:14:20,836 –> 00:14:22,210
屏幕锁的使用数量就从50%上升到了90%
where a fingerprint is available.

335
00:14:22,210 –> 00:14:25,324
因为这实在是太简单方便了
Because it’s just so much easier.

336
00:14:25,324 –> 00:14:27,240
我们也为那些没有指纹识别传感器的设备
We’ve also made changes for those devices that

337
00:14:27,240 –> 00:14:29,030
提供了另一种解决方案
don’t have access to fingerprint,

338
00:14:29,030 –> 00:14:32,610
比如说智能解锁
for one reason or another, through things like Smart Lock.

339
00:14:32,610 –> 00:14:34,870
其中智能解锁提供的一个功能
One of the capabilities that Smart Lock provides

340
00:14:34,870 –> 00:14:38,365
我们称之为身体探测
is what we call on body detection, where we monitor how the device is

341
00:14:38,365 –> 00:14:40,240
我们可以监测出与设备交互的周围环境
interacting with the environment around them.

342
00:14:40,240 –> 00:14:41,170
它是否在口袋里
Is it in their pocket?

343
00:14:41,170 –> 00:14:43,461
它是不是还在初次解锁它的人
Do we think it’s still in control of the individual who

344
00:14:43,461 –> 00:14:44,770
手里
first unlocked it?

345
00:14:44,770 –> 00:14:47,360
这个功能可以使
The use of that alone can reduce the frequency

346
00:14:47,360 –> 00:14:50,560
验证频率减少50%
with which users need to authenticate by over 50%.

347
00:14:50,560 –> 00:14:52,180
在我们的经验中能够看到这一点
We’ve seen that in our experience.

348
00:14:52,180 –> 00:14:56,640
在把验证变得简单这件事上我们已经取得很大的进展了
So we’ve got good progress on making authentication easier for users.

349
00:14:56,640 –> 00:14:59,180
这也是我们一直在努力的事情
So that’s one of the things that we’re striving for.

350
00:14:59,180 –> 00:15:00,830
我们还尽力把
The other thing that we’re trying to do

351
00:15:00,830 –> 00:15:03,330
验证变得更强大
is make authentication stronger.

352
00:15:03,330 –> 00:15:05,340
这同样也带来一些改变
So there are some changes there as well.

353
00:15:05,340 –> 00:15:08,860
其中之一就是允许
One of them was to allow applications

354
00:15:08,860 –> 00:15:11,380
应用把私密数据绑定到验证上
to tie their secrets to authentication.

355
00:15:11,380 –> 00:15:14,000
你可以确保应用中的某些功能
So you can make sure that your application will only

356
00:15:14,000 –> 00:15:17,050
是只有被验证过的
function if the user has a secure lock screen

357
00:15:17,050 –> 00:15:19,100
用户才可以使用的
and they have been recently authenticated.

358
00:15:19,100 –> 00:15:21,220
这是一个非常重要的改变
So that’s an important change that you can make.

359
00:15:21,220 –> 00:15:23,345
有一类事情是应用需要特别担心的
One of the types of things that an application that

360
00:15:23,345 –> 00:15:25,110
即财务系统
worries about, say financial systems

361
00:15:25,110 –> 00:15:27,830
或是访问敏感数据
or access to sensitive data, would want to do.

362
00:15:27,830 –> 00:15:30,780
我们做的另一件事就是
Another thing that we’ve done is to move the authentication

363
00:15:30,780 –> 00:15:32,660
把验证挪进了 TrustZone
actually into TrustZone.

364
00:15:32,660 –> 00:15:34,860
所以即使
So that even if the overall operating system

365
00:15:34,860 –> 00:15:37,680
操作系统都被攻陷了
has been compromised, there is no mechanism

366
00:15:37,680 –> 00:15:41,850
根据现有的机制
available for the device to leak the credential,

367
00:15:41,850 –> 00:15:45,900
证书 指纹或是
the fingerprint, for example, or the user’s lock screen password

368
00:15:45,900 –> 00:15:48,310
用户的解锁密码
into a place that it could do and exhaust

369
00:15:48,310 –> 00:15:50,280
也不会泄露
over the strength of that credential.

370
00:15:54,060 –> 00:15:57,181
因此你需要思考的就是如何利用好验证
So you want to think about how to use authentication.

371
00:15:57,181 –> 00:15:59,430
我们提供了一些指纹的 API
We’ve provided some APIs so that it’s possible for you

372
00:15:59,430 –> 00:16:01,860
你可以直接调用
to directly invoke the fingerprint APIs.

373
00:16:01,860 –> 00:16:05,770
我们也提供了一些 API 让你可以控制
We’ve also provided APIs that allow you to control the user

374
00:16:05,770 –> 00:16:06,940
相关的用户体验
experience around that.

375
00:16:06,940 –> 00:16:09,550
你不一定必须描述
So you’re not constrained in how you would represent

376
00:16:09,550 –> 00:16:10,830
你将用验证来干什么
what it means to authenticate.

377
00:16:10,830 –> 00:16:13,530
但我们还是建议你提供
This is again, you get to offer context

378
00:16:13,530 –> 00:16:16,060
说明来解释你为什么需要验证
for why it is that you’re requesting authentication.

379
00:16:16,060 –> 00:16:17,250
因为我们认为应用体验中
We think that’s a really important part

380
00:16:17,250 –> 00:16:19,680
一个非常重要的部分
of the application experience is that you are effectively

381
00:16:19,680 –> 00:16:22,490
就是你以何种方式告诉用户
in control over how it is that you represent to the user what

382
00:16:22,490 –> 00:16:23,710
你将要干什么
you’re going to do.

383
00:16:23,710 –> 00:16:26,860
所以在这个实例中 UI 描述出了
So in this instance, that UI describing

384
00:16:26,860 –> 00:16:31,000
Google Play 如何使用指纹识别
how fingerprint is taken place is being drawn entirely by Google Play.

385
00:16:31,000 –> 00:16:32,875
他们需要描述接下来要做的事情
They get to describe, we’re going to do this.

386
00:16:32,875 –> 00:16:35,590
这就是我们如何使用它的做法 如果你也想这样
And here’s how we’re going to use it, if they want to do that.

387
00:16:35,590 –> 00:16:37,589
你也可以在你的应用中这样做
And you can do that in your application as well.

388
00:16:39,880 –> 00:16:43,740
这里提供一个快速示例 非常直观的
Just to give a quick example, very, very straightforward how

389
00:16:43,740 –> 00:16:51,340
展示如何把应用与指纹绑定
you create a key in this instance and then bind that to a fingerprint.

390
00:16:51,340 –> 00:16:53,590
在这个实例中 我想特意强调的是
In this instance, the thing that I wanted to highlight

391
00:16:53,590 –> 00:16:57,836
你事实上创建了一个回调
is that you’re actually creating a callback, a wrap based

392
00:16:57,836 –> 00:16:59,210
一个基于密钥的包装
on the key, and you’re only going

393
00:16:59,210 –> 00:17:02,884
如果用户验证成功了你只需要解密就行了
to do the decryption if the user has successfully authenticated.

394
00:17:02,884 –> 00:17:04,550
所以你现在知道与你应用
So you now know that the data associated

395
00:17:04,550 –> 00:17:06,630
相关的数据都是包装在密钥中的
with your application that’s been wrapped in that key

396
00:17:06,630 –> 00:17:09,254
只有通过验证的用户
simply doesn’t exist and is not accessible until after the user

397
00:17:09,254 –> 00:17:10,690
才能够访问这些数据
is authenticated.

398
00:17:10,690 –> 00:17:15,945
我再花几分钟时间说一下直接启动
I’ll talk in a couple of minutes about how we’re doing direct to boot.

399
00:17:15,945 –> 00:17:18,690
它有一个相似的模块 就是应用数据
And it has a similar model, where application data is not

400
00:17:18,690 –> 00:17:22,880
只有在用户已经被验证过了之后才能被获取
available until the user has already been authenticated.

401
00:17:22,880 –> 00:17:26,079
最佳范例
So a couple of best practices, I think

402
00:17:26,079 –> 00:17:30,680
我认为这对于
that there’s a real opportunity to auth-bound keys

403
00:17:30,680 –> 00:17:36,100
验证密钥锁屏和安全锁屏的使用
to drive both adoption of the use of authentication

404
00:17:36,100 –> 00:17:38,030
来说是一个真正的机会
on the lock screen and secure lock screen.

405
00:17:38,030 –> 00:17:40,010
同时也简化了用户与
And also to simplify the way that the user

406
00:17:40,010 –> 00:17:42,051
应用之间的交互方式
is going to be interacting with your application.

407
00:17:42,051 –> 00:17:44,720
因此当用户使用你的应用时
Then you don’t need to have a check for pin or password

408
00:17:44,720 –> 00:17:45,930
你就没有必要再让用户做出 pin 码或是密码检查了
when a user comes in to your application,

409
00:17:45,930 –> 00:17:46,830
即使应用中包含很多敏感数据
no matter how sensitive it is.

410
00:17:46,830 –> 00:17:49,455
因为你知道他们在解锁屏幕时
Because you know that they very recently have gone through that

411
00:17:49,455 –> 00:17:51,310
已经验证过身份了
authentication already at the lock screen.

412
00:17:51,310 –> 00:17:53,770
所以我是明确鼓励使用上述机制的
So I would definitely encourage using that mechanism.

413
00:17:53,770 –> 00:17:55,140
你可以设定一个时间上限
You can time bound it and say, if they’ve

414
00:17:55,140 –> 00:17:57,310
可以是一分钟 五分钟 十分钟
logged in the last minute, the last five minutes, the last 10

415
00:17:57,310 –> 00:17:59,610
只要是符合你应用的
minutes, whatever’s appropriate for your application

416
00:17:59,610 –> 00:18:03,891
安全规范就好
to drive good security practices consistent with your application.

417
00:18:03,891 –> 00:18:05,890
另一件我鼓励的事
The other thing that I would encourage you to do

418
00:18:05,890 –> 00:18:09,710
当然就是指纹解锁了
is certainly favor fingerprint.

419
00:18:09,710 –> 00:18:12,830
如果设备上有一个
You know the evidence seems to be that a fingerprint

420
00:18:12,830 –> 00:18:14,040
指纹识别器
readers exist on a device.

421
00:18:14,040 –> 00:18:16,130
那么用户总是倾向于使用它的
That’s going to be the mechanism that users are going to want to use.

422
00:18:16,130 –> 00:18:18,379
所以我也鼓励你
So I would encourage you to use that as your mechanism

423
00:18:18,379 –> 00:18:21,850
把指纹解锁
to do binding of authentication credentials

424
00:18:21,850 –> 00:18:24,400
加进你的解锁机制里
to key material inside of Keystore.

425
00:18:24,400 –> 00:18:26,414
如果指纹解锁
If that’s not available, then falling back

426
00:18:26,414 –> 00:18:28,830
不可用的话
to doing something like create confirmed device credential

427
00:18:28,830 –> 00:18:32,624
那就做点类似创建确认设备凭据
intent as a means to bind to whatever other secure lock

428
00:18:32,624 –> 00:18:34,040
之类的事
screen they have on the devices is

429
00:18:34,040 –> 00:18:36,110
用来安全的
a perfectly reasonable fallback for those devices where

430
00:18:36,110 –> 00:18:37,276
解锁设备
fingerprint isn’t available.

431
00:18:40,146 –> 00:18:42,020
其实我们已经谈到很多了
So we’ve covered a couple of features so far.

432
00:18:42,020 –> 00:18:44,620
下面我们来说一下加密部分
We’re going to get now into the crypto section.

433
00:18:44,620 –> 00:18:48,167
我们先来讨论一下网络安全 之后是安全存储
Talk first about secure networking and then get into secure storage.

434
00:18:54,860 –> 00:19:01,400
我很好奇究竟多少的细微改变
It’s amazing to me how often simple changes can make

435
00:19:01,400 –> 00:19:04,590
才能引发一个安全方面巨大的变革
a huge difference in security.

436
00:19:04,590 –> 00:19:08,210
我们花了一分钟思考
We spent a minute thinking about users and how many of them

437
00:19:08,210 –> 00:19:11,609
为什么有些用户选择不在锁屏上加密码
choose not to have a lock screen.

438
00:19:11,609 –> 00:19:12,650
因为这很复杂
Because it’s complicated.

439
00:19:12,650 –> 00:19:15,820
而且很麻烦 同样地
Because it’s difficult. In the same way,

440
00:19:15,820 –> 00:19:17,880
我们发现部分应用的开发者
we find that application developers often

441
00:19:17,880 –> 00:19:21,320
也同样选择不使用安全的网络传输
choose not to use secure networking because a little bit

442
00:19:21,320 –> 00:19:22,746
因为它太麻烦了
too difficult.

443
00:19:22,746 –> 00:19:25,120
所以我们在最近的几个发布版本中
So what we’ve been doing over the last couple of releases

444
00:19:25,120 –> 00:19:27,780
试着让它变得简单一点
is trying to make that simpler.

445
00:19:27,780 –> 00:19:29,672
麻烦的地方在于我们发现
One of the complexities that we found

446
00:19:29,672 –> 00:19:31,130
应用的开发者
is that application developers just

447
00:19:31,130 –> 00:19:34,650
不知道他们现在使用的网络传输是否安全
don’t know whether they’re using secure traffic or not.

448
00:19:34,650 –> 00:19:37,860
一个很普遍的例子是 他们在应用中
A good example might be, they’ve incorporated an advertising

449
00:19:37,860 –> 00:19:40,190
加入了广告包
library into their application.

450
00:19:40,190 –> 00:19:44,340
为了使广告内容
Does that advertising library use HTTPS to request assets

451
00:19:44,340 –> 00:19:46,680
个性化
when it sends up device identifiers or user identifiers

452
00:19:46,680 –> 00:19:48,555
发送设备标识或是用户标识时
in order to request those advertisements that

453
00:19:48,555 –> 00:19:50,490
广告包是否用的是HTTPS请求
have been personalized for that application?

454
00:19:50,490 –> 00:19:51,856
你知道吗
Do you know?

455
00:19:51,856 –> 00:19:54,230
Android Marshmallow 的其中一个特点就是
And so one of the features that was introduced in Android

456
00:19:54,230 –> 00:19:57,040
允许应用控制网络请求
Marshmallow was the ability for an application to say,

457
00:19:57,040 –> 00:20:00,430
我可以选择使用明文通信
you know what, I want to use clear-text traffic.

458
00:20:00,430 –> 00:20:05,010
或是相反地 我不想选择明文通信
And conversely, I don’t think that I need to use clear-text traffic.

459
00:20:05,010 –> 00:20:07,319
如果你在使用一个类似 gmail 的应用
If you’re an application like gmail,

460
00:20:07,319 –> 00:20:09,610
你可以说我知道我所有的连接
you can say I know that all my connections are going up

461
00:20:09,610 –> 00:20:10,210
都将上传到 Google 服务器中
to a Google server.

462
00:20:10,210 –> 00:20:11,300
这也是一种保护的手段
And that’s the one that’s been protected.

463
00:20:11,300 –> 00:20:11,410
当然
And.

464
00:20:11,410 –> 00:20:14,280
我也可以说 嗯 我不想使用任何明文通信
I can say, whoop, I’m going to not use any clear-text traffic.

465
00:20:14,280 –> 00:20:15,290
如果你是另一个应用
If you’re a different application,

466
00:20:15,290 –> 00:20:17,498
那么你就需要知道它是否
then you need to go through the process of evaluating

467
00:20:17,498 –> 00:20:18,440
在使用明文通信
whether it’s there.

468
00:20:18,440 –> 00:20:20,690
这就是我们做的
So this is a feature that was put in place to simplify

469
00:20:20,690 –> 00:20:22,648
快速明确你的应用是否
understanding whether your application actually

470
00:20:22,648 –> 00:20:23,890
在使用明文通信
uses clear-text traffic.

471
00:20:23,890 –> 00:20:26,710
而且能让用户知道
And to give users visibility into whether you think

472
00:20:26,710 –> 00:20:29,410
他的应用是否在使用明文通信
you use clear-text traffic.

473
00:20:29,410 –> 00:20:32,600
当然 这用起来也很简单
So, it’s really straightforward, very easy to use.

474
00:20:32,600 –> 00:20:34,730
它就在你的 manifests 中
Inside your manifests, it’s very simple.

475
00:20:34,730 –> 00:20:36,120
你使用明文通信了吗
Do you use clear-text traffic?

476
00:20:36,120 –> 00:20:38,160
没有
No.

477
00:20:38,160 –> 00:20:43,060
接着是 API 例如一个 URL
And then API, such as URL– yeah,

478
00:20:43,060 –> 00:20:48,160
HTTP://URL 连接 如果它不使同 HTTPS 是不会正常工作的
HTTP://URL Connect, where it’s not using HTTPS will simply not work.

479
00:20:48,160 –> 00:20:50,140
所以这些 API 被用于
So those APIs that are known to be

480
00:20:50,140 –> 00:20:52,959
保证通过网络传输的用户数据
insecure in transmitting user data across a network simply

481
00:20:52,959 –> 00:20:53,750
的安全
no longer function.

482
00:20:53,750 –> 00:20:55,083
它们将返回一个安全错误
They’ll return a security error.

483
00:20:55,083 –> 00:20:57,090
你就可以摆脱困境了
And you can bail out.

484
00:20:57,090 –> 00:20:59,290
这多方便
So that’s great.

485
00:20:59,290 –> 00:21:01,540
只可惜这导致了大部分的应用是安全的
Except that it turns out most applications

486
00:21:01,540 –> 00:21:03,695
而一小部分是不安全的
do some stuff secure and some stuff not secure.

487
00:21:03,695 –> 00:21:05,945
所以我们知道我们需要提供更强的灵活性
So we knew that we needed to provide more flexibility.

488
00:21:05,945 –> 00:21:07,570
所以我们在 Android N 中
And so that’s one of the things that we

489
00:21:07,570 –> 00:21:10,520
致力于更加精细的控制
began focusing on in Android N is how do we

490
00:21:10,520 –> 00:21:13,930
尤其是当我们了解到
have more granular controls while recognizing

491
00:21:13,930 –> 00:21:16,810
存在于 SSL 和 TLS 栈中的粒度
that the granularity that’s existed in SSL and TLS

492
00:21:16,810 –> 00:21:20,140
已经成为了在实现部署中
Stacks and the SSL APIs has been a source

493
00:21:20,140 –> 00:21:24,370
难以置信的复杂与困难的来源
of incredible complexity and incredible difficulty in deployment.

494
00:21:24,370 –> 00:21:27,010
所以我们想在网络安全配置方面做的工作就是
And so what we want to do with network security config

495
00:21:27,010 –> 00:21:30,710
让身为应用开发者的你在使用安全传输时
is make it really easy for you, as an application developer,

496
00:21:30,710 –> 00:21:33,700
更容易
to know where you’re using secure transports.

497
00:21:33,700 –> 00:21:35,207
而且在这过程中
And then to control those transports

498
00:21:35,207 –> 00:21:37,540
不会使你的代码变得更复杂
in a way that doesn’t make your coding really difficult.

499
00:21:37,540 –> 00:21:38,970
它非常清晰
So it’s entirely declarative.

500
00:21:38,970 –> 00:21:40,300
因为它全在 manifest 里
And it’s all in the manifest.

501
00:21:40,300 –> 00:21:43,170
现在让我们谈谈一些基础功能
So let’s talk about some of the basic capabilities.

502
00:21:43,170 –> 00:21:45,520
这是一个很简单的例子
Well here’s a really simple one.

503
00:21:45,520 –> 00:21:49,110
原来 我没有在每个地方都使用安全通路
It turns out, I don’t use secure traffic everywhere.

504
00:21:49,110 –> 00:21:51,822
但是我知道我正在 secure.example.com 上使用它
But I know that I use it on secure.example.com.

505
00:21:51,822 –> 00:21:54,160
这样我就可以使用 domain-config
And so I can use a domain config.

506
00:21:54,160 –> 00:21:59,060
我把它配置在使用安全通路的地方
I set up where this domain is one that uses secure traffic.

507
00:21:59,060 –> 00:22:03,560
当我指定为 false 时 它使用明文通信
OK, so it does use clear-text traffic, specifies it as false.

508
00:22:03,560 –> 00:22:06,340
而且我没有对任何要与我的应用交互的
And I don’t make any claims about any other domains

509
00:22:06,340 –> 00:22:09,030
域名做任何的要求
that my application might be interacting with.

510
00:22:09,030 –> 00:22:11,175
这样你就可以保持
So you can keep that advertising library

511
00:22:11,175 –> 00:22:12,800
广告库的不变
that otherwise would have prevented you

512
00:22:12,800 –> 00:22:14,870
也不用担心你应用的其他功能
from being confident about the rest of the functionality

513
00:22:14,870 –> 00:22:15,703
有任何的变化
of your application.

514
00:22:19,870 –> 00:22:22,210
这仅仅
So that’s the start of the types of things

515
00:22:22,210 –> 00:22:23,610
是开端
that you’d want to be able to do.

516
00:22:23,610 –> 00:22:25,401
我们发现的另外一件事情
Another thing that we’ve found is that it’s

517
00:22:25,401 –> 00:22:28,540
就是调试困难
very difficult to do debugging.

518
00:22:28,540 –> 00:22:31,100
这种情况很常见
We see that in the context of Google on a regular basis.

519
00:22:31,100 –> 00:22:32,980
我们在调试设备上的交互方式
The way that we interact with our debug infrastructure

520
00:22:32,980 –> 00:22:35,563
与真实发布设备上的交互方式
is different from the way that we do interact with our release

521
00:22:35,563 –> 00:22:36,450
非常不同
infrastructure.

522
00:22:36,450 –> 00:22:38,074
他们的密钥材料是不一样的
We have different key material on them.

523
00:22:38,074 –> 00:22:40,552
不是所有的 Android 设备中
We might not come from a certificate authority that’s

524
00:22:40,552 –> 00:22:43,380
都有权威机构的认证
a well known certificate authority that’s on all the Android devices.

525
00:22:43,380 –> 00:22:45,046
因为这仅仅是一个测试设备
Because it’s just a test infrastructure.

526
00:22:45,046 –> 00:22:47,240
而且你也不想为复杂而又昂贵的SSL
And you don’t want to have to pay for and maintain

527
00:22:47,240 –> 00:22:50,540
付费和维护
that sort of complex or costly SSL infrastructure.

528
00:22:50,540 –> 00:22:52,670
价格虽然不是那么高
Not that it’s that costly, but that’s the mindset

529
00:22:52,670 –> 00:22:54,049
但这是很多开发者的真实想法
of a lot of developers.

530
00:22:54,049 –> 00:22:57,100
所以我们要做的就是把它变得简单点
And so one of the things that we want to do is make it really simple.

531
00:22:57,100 –> 00:22:59,730
在过去 开发者的方法是
Because in the past, the way that developers have done this,

532
00:22:59,730 –> 00:23:02,340
他们必须通过一系列的自定义代码
is they’ve had to go through a lot of custom code

533
00:23:02,340 –> 00:23:04,680
来改变 SSL 在应用中的
to change how SSL handling took place

534
00:23:04,680 –> 00:23:06,380
操作模式
inside the context of their application.

535
00:23:06,380 –> 00:23:08,140
因此我们把网络安全配置的事
So we’re going to do that all in the manifest now with network

536
00:23:08,140 –> 00:23:09,357
全都放在了 manifest 中
security config.

537
00:23:09,357 –> 00:23:11,190
这样做就与原来基于
So that should make it really, really simple

538
00:23:11,190 –> 00:23:14,640
发布设施的做法完全不同了
for you to test in a way that’s distinct from, entirely

539
00:23:14,640 –> 00:23:17,490
这将变得极为简单
independent from, your release infrastructure,

540
00:23:17,490 –> 00:23:20,380
而且你再也不用写任何的自定义代码了
but also not have to write any custom code to do that.

541
00:23:20,380 –> 00:23:22,600
感觉如何
So what does it look like?

542
00:23:22,600 –> 00:23:26,460
在 network-security-config 中可以直接修改
Here’s a pretty simple way to do it, network security config.

543
00:23:26,460 –> 00:23:28,250
你需要加上 debug-overrides
You declare debug overrides.

544
00:23:28,250 –> 00:23:30,950
当你在调试应用的时候
And you set a different set of trust anchors

545
00:23:30,950 –> 00:23:34,796
设置一个不一样的 trust-anchors
when your application is running in a debug environment.

546
00:23:34,796 –> 00:23:36,670
你指定 trust-anchors 是什么
And you specify what those trust anchors are.

547
00:23:36,670 –> 00:23:39,210
你完全可以在你的应用里这么做 像在这做的一样
You can include them in your applications, as is being done here.

548
00:23:39,210 –> 00:23:41,126
事实上它们在你的应用中
This is actually specifying that they’re going

549
00:23:41,126 –> 00:23:42,644
被具体指定了
to be in your application.

550
00:23:42,644 –> 00:23:44,560
而且当你的应用调试完成以后
And you now know that when your application is

551
00:23:44,560 –> 00:23:49,260
你不用修改任何的代码
no longer in a debug build, no change to your code at all.

552
00:23:49,260 –> 00:23:51,080
你用发布版本发布出来
You’ve released it in release mode.

553
00:23:51,080 –> 00:23:52,090
你上传它
You ship it.

554
00:23:52,090 –> 00:23:54,287
所有有关调试的重写代码
And all of the code related to this debug overrides

555
00:23:54,287 –> 00:23:56,620
都不会再展示在应用之中
is no longer going to be present inside the application.

556
00:23:56,620 –> 00:23:57,578
非常直观
Really straightforward.

557
00:24:02,414 –> 00:24:03,830
你也许想做
You may want to do things that are

558
00:24:03,830 –> 00:24:08,160
比域名等级限制更复杂的事
more sophisticated than just domain level restrictions,

559
00:24:08,160 –> 00:24:10,150
使用 certificate-authorities 中的 built
using the built in certificate authorities,

560
00:24:10,150 –> 00:24:13,929
或从调试硬件中区别出
or differentiating your debug hardware, debug

561
00:24:13,929 –> 00:24:15,970
调试设施和发布设施
infrastructure, from your release infrastructure.

562
00:24:15,970 –> 00:24:17,905
所以我们再谈论下这个问题
So let’s talk about that for just a second.

563
00:24:17,905 –> 00:24:19,280
有很多种不同的方法
Here’s a couple of different ways

564
00:24:19,280 –> 00:24:21,920
可以限制你需要与之交互的证书
that you can actually limit the set of certificates

565
00:24:21,920 –> 00:24:25,280
而且不需要写一个你自己的
that you interact with without needing to write your own SSL

566
00:24:25,280 –> 00:24:28,520
SSL 错误处理器或是 SSL 证书确认程序
error handlers and SSL certificate validation routines.

567
00:24:28,520 –> 00:24:32,240
这是一个很简单的域名
Really simple one, these are domains for which

568
00:24:32,240 –> 00:24:34,760
需要把我们应用中的
we are going to include the certificates that

569
00:24:34,760 –> 00:24:38,960
证书绑定上去
are tied to those domains in our application.

570
00:24:38,960 –> 00:24:42,870
所以我们指定了 secure.example.com 和 cdn.example.com
So we specify secure.example.com, cdn.example.com.

571
00:24:42,870 –> 00:24:45,120
而这些应用与证书
And these are apps, these are certs, that are actually

572
00:24:45,120 –> 00:24:47,230
都将直接在我的应用里
going to be directly in my app.

573
00:24:47,230 –> 00:24:49,710
所以不需要依赖系统证书
So don’t rely on the system certificates.

574
00:24:49,710 –> 00:24:53,500
我也不需要买一个证书或是别人的认证
I don’t need to go buy a certificate or validate with somebody else.

575
00:24:53,500 –> 00:24:55,970
我应用的信任凭据就在
My application’s trust is contained entirely inside

576
00:24:55,970 –> 00:24:56,830
应用里面
of that application.

577
00:24:56,830 –> 00:24:58,580
这样我就可以连接到服务器了
And then I can connect out to that server.

578
00:25:02,759 –> 00:25:04,550
另一个我们经常问到的就是
Another thing that we often get asked about

579
00:25:04,550 –> 00:25:06,990
怎样证书锁定
is, how do I do certificate pinning?

580
00:25:06,990 –> 00:25:09,050
证书锁定 如果你对
Certificate pinning, in case you’re not

581
00:25:09,050 –> 00:25:11,050
这个术语不熟悉 就是判断
familiar with the term, is to identify

582
00:25:11,050 –> 00:25:15,082
一个特定的证书 不是 CA 不是证书链
a specific certificate, not a CA, no a certificate chain,

583
00:25:15,082 –> 00:25:17,540
是一个你需要与一个特定服务器
but a specific certificate that you expect to be associated

584
00:25:17,540 –> 00:25:19,080
通信的证书
with a particular web service.

585
00:25:19,080 –> 00:25:21,320
所以我们要介绍的一个功能就是
So one of the capabilities that we introduced here

586
00:25:21,320 –> 00:25:24,500
指定 pin 当然同样是在 manifest 中
is the ability to specify a pin, again directly in the manifest,

587
00:25:24,500 –> 00:25:26,740
你不需要修改 SSL 代码
so you don’t have to manipulate the SSL code

588
00:25:26,740 –> 00:25:28,470
或是你自己的证书
or do your own certificate validation.

589
00:25:28,470 –> 00:25:31,840
如果你想的话可以迅速的做出改变
And you can very quickly make a change to that if you’d like to do so.

590
00:25:31,840 –> 00:25:36,740
我担心锁定和管理你自己的信任凭据
I would caution that pinning and managing your own trusts

591
00:25:36,740 –> 00:25:38,100
会比较棘手
can be a little bit tricky.

592
00:25:38,100 –> 00:25:40,840
所以我们明确地鼓励你使用内置插件
And so we definitely encourage you to use the built ins.

593
00:25:40,840 –> 00:25:43,390
但是我们也想保证你的
But we also wanted to make sure that you have the flexibility

594
00:25:43,390 –> 00:25:44,877
灵活性
to do things.

595
00:25:44,877 –> 00:25:46,960
如果你不想刁难自己的话
if you really want to cause yourself a little more

596
00:25:46,960 –> 00:25:50,120
你最好还是这样做
grief than you otherwise had to do.

597
00:25:50,120 –> 00:25:54,649
这是我幻灯片里想讲述的重点
So here’s how I would describe that in bullet points on a slide.

598
00:25:54,649 –> 00:25:57,190
我们在网络安全配置方面
There’s a bunch of changes that we made with network security

599
00:25:57,190 –> 00:25:59,590
做了很多的改变 而且我们认为这些改变
config and some best practices that we

600
00:25:59,590 –> 00:26:03,240
几乎适用于每个人
think are appropriate for nearly everyone.

601
00:26:03,240 –> 00:26:05,330
一个很好的例子就是
A good example of that is identifying

602
00:26:05,330 –> 00:26:06,920
在所有域名中识别出
what are the domains that you expect

603
00:26:06,920 –> 00:26:10,210
你想要确保安全的那些域名
all of the traffic on those domains to be secure.

604
00:26:10,210 –> 00:26:11,340
然后着重保证它的安全
And actually specify that.

605
00:26:11,340 –> 00:26:14,442
如果它用明文通信 那就把它设置为 false
Say it uses clear-text traffic and set it to false.

606
00:26:14,442 –> 00:26:16,650
这样你就能确保不会意外地
So that you can make sure that you don’t accidentally

607
00:26:16,650 –> 00:26:19,220
通过这些网络发送任何不安全的数据
send any insecure data over those networks.

608
00:26:19,220 –> 00:26:22,451
理想状况是 我们希望你把它用在每一个地方
Ideally, we would like you to do it for everything.

609
00:26:22,451 –> 00:26:23,700
当然我们现在还不是很完美
But we’re not there quite yet.

610
00:26:23,700 –> 00:26:24,366
我们知道
We realize that.

611
00:26:24,366 –> 00:26:25,492
这是一个递进的过程
So this is incremental.

612
00:26:25,492 –> 00:26:26,950
最后我们将在整个
And eventually we’ll get to a point

613
00:26:26,950 –> 00:26:28,408
Android 生态系统中
where it can be done for everything

614
00:26:28,408 –> 00:26:30,550
的每一点网络访问上
across the entire Android ecosystem

615
00:26:30,550 –> 00:26:33,380
都用上这个技术
as we are pushing to do the same across the broader web.

616
00:26:36,020 –> 00:26:38,420
另一个我们做出的重要改变是
Another important change that was made

617
00:26:38,420 –> 00:26:41,380
用户的安装证书不再是默认的了
was that user installed certificates are no longer

618
00:26:41,380 –> 00:26:43,590
之前使用此设备的用户
trusted by default. The user on a device

619
00:26:43,590 –> 00:26:46,377
有权利在
has the ability to go in, add a certificate,

620
00:26:46,377 –> 00:26:48,210
应用与服务器
and, previously, had the ability to then man

621
00:26:48,210 –> 00:26:50,410
中间
in the middle, traffic between your application

622
00:26:50,410 –> 00:26:52,150
添加一个证书
and your server infrastructure.

623
00:26:52,150 –> 00:26:54,690
他们想那么做的原因有很多
There’s a lot of reasons why they might want to do that.

624
00:26:54,690 –> 00:26:56,231
同样地 你也有相当多的理由
And there’s a lot of reasons that you

625
00:26:56,231 –> 00:26:58,400
把这功能放到你的应用中
might want to enable it in your application as well.

626
00:26:58,400 –> 00:27:01,522
另一方面 我们发现在
On the other hand, we thought and we found in conversations

627
00:27:01,522 –> 00:27:03,730
开发者的对话中 绝大多数的开发者
with developers, that the vast majority of developers

628
00:27:03,730 –> 00:27:05,150
就这个没什么预期
don’t anticipate that.

629
00:27:05,150 –> 00:27:06,800
如果他们能连接到自己的服务器
And if they’re connecting to their own infrastructure

630
00:27:06,800 –> 00:27:09,091
又连接不到别的地方 那么他们就没有什么特殊的理由
and to nowhere else, they don’t see a particular reason

631
00:27:09,091 –> 00:27:10,020
这样做了
to enable that.

632
00:27:10,020 –> 00:27:12,994
所以这就有了用户在无意中
And so there was a risk of users unintentionally

633
00:27:12,994 –> 00:27:15,990
安装了有可能导致中间人攻击的证书
installing certificates that could allow for a man in the middle.

634
00:27:15,990 –> 00:27:19,530
所以我们改变了这种默认的安装方式
And so we’ve changed the default to no longer have

635
00:27:19,530 –> 00:27:22,160
在默认情况下 允许在
user certificates be, by default,

636
00:27:22,160 –> 00:27:26,002
应用与终端之间拦截通信
able to intercept traffic between your application and your endpoint.

637
00:27:26,002 –> 00:27:27,460
如果你愿意的话你也可以做出改变
You can change that if you want to.

638
00:27:27,460 –> 00:27:28,924
可能在你应用中的某些情况下
There may be situations where it’s

639
00:27:28,924 –> 00:27:31,340
是适用的
appropriate to do that in the context of your application.

640
00:27:31,340 –> 00:27:31,780
有些则不适用
There may not.

641
00:27:31,780 –> 00:27:35,630
这取决于你
It’s something for you to take a look at and make a determination for.

642
00:27:35,630 –> 00:27:38,840
我们致力的另一件事就是简化调试
The other thing that we’ve tried to do is simplify debugging.

643
00:27:38,840 –> 00:27:41,230
我们建议你可以试一试
So I would encourage you to go look at your application.

644
00:27:41,230 –> 00:27:45,170
如果你使用了任何的 SSL 操作
If you have any SSL handling that you’ve implemented

645
00:27:45,170 –> 00:27:48,300
比如说自定义操作 自定义认证 或其他自定义的 SSL 操作
that’s custom handling, custom cert verification, custom SSL

646
00:27:48,300 –> 00:27:52,110
你可以用网络安全配置替换之
handlers, you probably can replace that with network security config

647
00:27:52,110 –> 00:27:53,630
这样做将更简单
and make it much easier to make sure that you

648
00:27:53,630 –> 00:27:54,838
而且不容易出错
don’t make a mistake in that.

649
00:27:58,950 –> 00:28:01,760
如果你还想做的更多
If you want to do something and you

650
00:28:01,760 –> 00:28:04,460
而且你觉得有信心
feel confident in your ability to manage

651
00:28:04,460 –> 00:28:06,414
管理你自己的证书 我们同样
your own certificates, we’ve provided that

652
00:28:06,414 –> 00:28:08,830
提供更简单的做法
and try to make that a little bit simpler for you as well.

653
00:28:08,830 –> 00:28:13,094
不过就像我刚才说的 这么做可能更复杂
But as I mentioned, this is a little bit more difficult

654
00:28:13,094 –> 00:28:14,510
而且更容易出错
and a little bit more error prone.

655
00:28:14,510 –> 00:28:16,635
这是你需要想清楚的地方
So it’s something that you’d want to think through.

656
00:28:20,870 –> 00:28:22,930
上述就是网络相关的内容
So we talked about networking.

657
00:28:22,930 –> 00:28:25,370
下面我们来聊聊我们经常提到的加密技术
Now let’s get into the thing that we so often just refer

658
00:28:25,370 –> 00:28:30,980
2016年的大型加密讨论
to as encryption, the big encryption debates of 2016.

659
00:28:30,980 –> 00:28:32,920
我花费了很多时间来谈论
I’ve been spending a lot of my time talking

660
00:28:32,920 –> 00:28:35,390
为什么存储加密对
about why it is that storage encryption is

661
00:28:35,390 –> 00:28:38,060
用户数据的保护如此的重要
so important for protecting user data.

662
00:28:38,060 –> 00:28:41,320
我们用类似 Android Pay 这样的应用
The benefits that it has accrued on the ecosystem where we’re

663
00:28:41,320 –> 00:28:44,350
让开发者能够在 Android 生态系统中获得收益
now able to deliver applications like Android Pay, where it’s

664
00:28:44,350 –> 00:28:47,560
因此对开发者来说 设备信息的
possible for a developer to rely on the integrity

665
00:28:47,560 –> 00:28:49,530
完整性和机密性
and the confidentiality of information

666
00:28:49,530 –> 00:28:51,890
是相当关键的
that’s critical to the application on the device.

667
00:28:51,890 –> 00:28:54,430
这就是我们在所有装载有 Marshmallow
That’s one of the reasons among many

668
00:28:54,430 –> 00:28:58,690
系统的设备上开始推广加密技术
that we’ve moved towards requiring encryption on all capable devices

669
00:28:58,690 –> 00:29:00,170
的原因
starting with Marshmallow.

670
00:29:00,170 –> 00:29:02,010
这是强制执行的
We made that mandatory.

671
00:29:02,010 –> 00:29:04,980
我们会把它变得越来越健壮
And we’ve been making that more and more robust.

672
00:29:04,980 –> 00:29:07,522
因为我们认为直接对用户设备的物理威胁
Because we think direct physical threats to the user’s device

673
00:29:07,522 –> 00:29:09,896
也是我们需要考虑的事情
are one of the things that we need to be concerned about.

674
00:29:09,896 –> 00:29:12,350
这就是我们开始推广的设备名单
These are devices that we move around in the world with.

675
00:29:12,350 –> 00:29:14,520
这也包括手环之类的设备
They are sometimes attached to your wrist.

676
00:29:14,520 –> 00:29:16,400
也包括你车中的设备
They’re sometimes in your car.

677
00:29:16,400 –> 00:29:19,610
有多种强存储加密方式
There’s a lot of different ways that having strong storage

678
00:29:19,610 –> 00:29:22,540
对 Android 的安全来说是非常重要的
encryption is really fundamental to Android security.

679
00:29:22,540 –> 00:29:24,850
但这不意味着我们不能把它变得更好
But that doesn’t mean we can’t make it better.

680
00:29:24,850 –> 00:29:26,370
也不意味着我们不能在用户体验的角度上
It doesn’t mean that we can’t improve it from a user

681
00:29:26,370 –> 00:29:27,360
把它变得更好
experience standpoint.

682
00:29:27,360 –> 00:29:29,360
Android N 的一个重大变化就是
And so one of the big changes with the Android N

683
00:29:29,360 –> 00:29:31,950
直接启动
is what we refer to as Direct Boot.

684
00:29:31,950 –> 00:29:34,140
我将分别从用户和开发者的角度说
I’ll talk about it both from a user perspective

685
00:29:34,140 –> 00:29:37,730
不过在开发者的角度上会多说一点
and then I’ll get into it a little bit from a developer’s perspective.

686
00:29:37,730 –> 00:29:40,020
从用户的角度来说 直接启动
From a user perspective, direct boot basically

687
00:29:40,020 –> 00:29:44,700
意味着我不需要重复的输入密码了
means I don’t go through two times putting in my user’s password.

688
00:29:44,700 –> 00:29:46,330
我不必输入两次
I don’t have to double enter that.

689
00:29:46,330 –> 00:29:49,205
因为在设备开启的时候
Because currently, the first time the device comes up,

690
00:29:49,205 –> 00:29:50,080
就已经输入过了
you have to enter it.

691
00:29:50,080 –> 00:29:51,430
然后设备就被解锁了
The device is then decrypted.

692
00:29:51,430 –> 00:29:54,650
然后你就可以与应用交互了
And then you get it again as you’re interacting with it.

693
00:29:54,650 –> 00:29:56,110
这也意味着在你第一次进入之后
It also means that all of the data

694
00:29:56,110 –> 00:29:58,276
所有的数据都被解锁了
is decrypted after you’ve entered it the first time.

695
00:29:58,276 –> 00:30:00,620
我再简单说两句
So we’ll talk about that more in just a second.

696
00:30:00,620 –> 00:30:04,440
全盘加密的另一个挑战就是
Another challenge that exists with full disk encryption

697
00:30:04,440 –> 00:30:09,460
所有的数据都一直处于保护之中
is it means that, yes, all the data is protected all the time.

698
00:30:09,460 –> 00:30:15,460
直到用户输入了他们的密码 你就完蛋了
But until the user has entered their password, you’re stuck.

699
00:30:15,460 –> 00:30:18,090
因为没有应用能访问数据
No application has the ability to access data.

700
00:30:18,090 –> 00:30:22,272
所以其中一个重要的改变就是设备现在就被启动了
And so one of the important changes is the device will now come up.

701
00:30:22,272 –> 00:30:24,480
还有运行在后台的东西
And things that are running in the background, things

702
00:30:24,480 –> 00:30:30,479
像是来电 短信
like inbound calls, inbound SMS, your alarm

703
00:30:30,479 –> 00:30:32,020
你要早起赶上
clock in the morning for those of you

704
00:30:32,020 –> 00:30:34,270
6点从旧金山
who had to get up earlier than the six o’clock shuttle

705
00:30:34,270 –> 00:30:36,432
开来的公交车
coming down from San Francisco, who

706
00:30:36,432 –> 00:30:38,890
别人都不像我运气这么好
didn’t have the fortune that I did of having a two-year-old

707
00:30:38,890 –> 00:30:42,430
因为我在三点就醒了 而这种情况持续了两年
wake you up at 3:00 so you were already awake.

708
00:30:42,430 –> 00:30:43,980
你依赖你的闹钟吗
You rely on your alarm clock?

709
00:30:43,980 –> 00:30:48,350
我已经超过六个月没这么做了
I don’t have to do that for another six or so months.

710
00:30:48,350 –> 00:30:51,240
所以我们开始了这项工作
And so we move towards making that work,

711
00:30:51,240 –> 00:30:53,694
即使用户还没有把它们放进凭据里
even if the user hasn’t put in their credential.

712
00:30:53,694 –> 00:30:55,860
以上就是站在用户角度上的讨论
So that’s what it looks like from a user standpoint.

713
00:30:55,860 –> 00:30:57,630
那从开发者的角度来说呢
What’s it look like from a developer standpoint?

714
00:30:57,630 –> 00:31:01,340
我们介绍关于存储加密的两种不同观念
We introduced two different concepts in terms of storage encryption.

715
00:31:01,340 –> 00:31:04,020
第一种就是你最熟悉的
The first is the one that’s most familiar to you

716
00:31:04,020 –> 00:31:06,750
凭据加密
right now, credential encryption.

717
00:31:06,750 –> 00:31:10,660
这意味着只有用户进入了他们的凭据之后
That means this data is only available after the user has

718
00:31:10,660 –> 00:31:12,940
才能访问数据
entered their credential.

719
00:31:12,940 –> 00:31:16,070
还有一种就是我们刚才提到的设备加密数据
We also have what we refer to as device encrypted data.

720
00:31:16,070 –> 00:31:21,720
这种数据只有用 TrustZone 中存储的密钥才能访问
This is data that’s available with a key that’s stored in TrustZone.

721
00:31:21,720 –> 00:31:24,740
这就是防止数据泄露的
So it’s protected in a variety of different mechanisms

722
00:31:24,740 –> 00:31:25,820
各种手段
against extractions.

723
00:31:25,820 –> 00:31:27,560
数据仍然是被加密的
The data is still encrypted, but it’s

724
00:31:27,560 –> 00:31:30,810
不过是被与设备相关联的密钥加密了
encrypted with a key that’s only tied to the device.

725
00:31:30,810 –> 00:31:32,880
默认情况下 应用还是运行在
Applications by default are going

726
00:31:32,880 –> 00:31:34,700
凭据加密环境下
to run in credential encrypted environment.

727
00:31:34,700 –> 00:31:37,328
所以如果你不做出任何改变 你所要做的就是
So if you don’t change anything, the behavior you have is going

728
00:31:37,328 –> 00:31:39,240
弄懂你的应用是如何工作的
to be exactly the way your application works now,

729
00:31:39,240 –> 00:31:41,590
用户一旦登入设备
which is once the user logs in, you can access the data

730
00:31:41,590 –> 00:31:43,860
你就可以用上述方式访问数据了
and you can kind of proceed along your way.

731
00:31:43,860 –> 00:31:48,030
但是如果你的应用在用户解锁设备之前
But if you have an application that requires access

732
00:31:48,030 –> 00:31:50,800
就需要访问数据的话
to information potentially before the user had entered

733
00:31:50,800 –> 00:31:54,220
你可以把你的应用标记为直接启动感知
their credentials, you can declare yourself to be direct boot aware.

734
00:31:54,220 –> 00:31:56,705
这样你在被声明为
And then you have access to the data

735
00:31:56,705 –> 00:31:58,830
直接启动感知的 activity 中
in the context of the activity that’s been declared

736
00:31:58,830 –> 00:31:59,947
就可以直接访问数据了
to be direct boot aware.

737
00:31:59,947 –> 00:32:01,530
当然你也可以直接与之交互
And you can actually interact with it.

738
00:32:01,530 –> 00:32:03,080
这就是 TalkBack 的工作原理
So that’s how TalkBacks works.

739
00:32:03,080 –> 00:32:04,880
这就是短信的工作原理
That’s how a SMS’ works.

740
00:32:04,880 –> 00:32:07,890
这就是闹钟
That’s how alarms store, this is an alarm,

741
00:32:07,890 –> 00:32:09,510
尤其是在重启后
and immediately upon reboot, I want

742
00:32:09,510 –> 00:32:11,010
的工作原理
to be able to execute on that alarm.

743
00:32:13,979 –> 00:32:16,810
怎样声明直接启动感知呢
What does it mean to declare yourself to be direct boot aware?

744
00:32:16,810 –> 00:32:18,184
非常直观
Pretty straightforward.

745
00:32:18,184 –> 00:32:19,850
上半部分在 manifest 里
The top half of this is in the manifest.

746
00:32:19,850 –> 00:32:22,000
你只需要说 我是直接启动感知就行了
You just say, I’m direct boot aware.

747
00:32:22,000 –> 00:32:25,890
然后 receiver 就被触发了
OK, and then that receiver can be triggered.

748
00:32:25,890 –> 00:32:29,270
这样一个 intent 就被触发了
In the event that a particular intent is fired like,

749
00:32:29,270 –> 00:32:32,566
也许是叫 boot complete 吧
I don’t know, boot complete, then your application

750
00:32:32,566 –> 00:32:36,470
然后你的应用就会根据特定的 receiver 运行
will start running in the context of that particular receiver.

751
00:32:36,470 –> 00:32:38,862
为了使用存储 你最可能干的事情
To use storage, which presumably is one of the things

752
00:32:38,862 –> 00:32:40,320
就是你需要
that you’d want to do, you’re going

753
00:32:40,320 –> 00:32:44,550
在设备保护存储中
to need to create storage that’s in the context of device

754
00:32:44,550 –> 00:32:45,330
开辟一块存储空间出来
protected storage.

755
00:32:45,330 –> 00:32:47,340
这是底部的一小段代码
And so there’s a little snippet of code down there at the bottom.

756
00:32:47,340 –> 00:32:48,530
你创建你应用的 context
You create your app context.

757
00:32:48,530 –> 00:32:49,571
你使用你应用的 context
You use your app context.

758
00:32:49,571 –> 00:32:52,480
你创建一个设备保护与存储的 context
And then you create a device protect and storage context.

759
00:32:52,480 –> 00:32:53,860
然后只需把它打开就行了
And then you just open it.

760
00:32:53,860 –> 00:32:56,330
你可以用任何你喜欢的方式与之交互
You interact with it exactly like you would any other way.

761
00:32:56,330 –> 00:32:59,920
当你按我刚才说的那么做时
When you are running in what I refer to as the device context,

762
00:32:59,920 –> 00:33:02,100
与之相反的是凭据保护
as opposed to the credential protected context,

763
00:33:02,100 –> 00:33:05,680
你仍然可以创建凭据保护的文件
you can still create files that are credential protected.

764
00:33:05,680 –> 00:33:06,770
你只是不能读取它们
You just can’t read them.

765
00:33:09,401 –> 00:33:11,400
但你仍然可以做很多事情
But there are lots of ways that could be useful.

766
00:33:11,400 –> 00:33:12,150
你可以往后附加
You can append.

767
00:33:15,030 –> 00:33:17,560
如果你收到一封邮件
So if you receive an inbound mail message.

768
00:33:17,560 –> 00:33:20,460
那你就需要转换成一个很糟糕的邮件
And you’ve got a really horrible mail storage

769
00:33:20,460 –> 00:33:22,500
存储格式 然后附加在后面
format where you just append.

770
00:33:22,500 –> 00:33:25,291
你可以仅拿到标题然后展示在锁屏界面上
You could just grab the headers and display that on the lock screen.

771
00:33:25,291 –> 00:33:27,160
然后获取真实的内容
And then take the actual content and push it

772
00:33:27,160 –> 00:33:29,197
并把它放到凭据保护存储里
into credential protected storage.

773
00:33:29,197 –> 00:33:31,280
你可能只是因为缓存才这么做
You’d probably want to do that just for the cache,

774
00:33:31,280 –> 00:33:32,857
而非针对所有的邮件
not for all of your mail.

775
00:33:32,857 –> 00:33:34,440
在需要有精致的用户体验地方
But you could do those kinds of things

776
00:33:34,440 –> 00:33:35,898
为了维护最佳的安全
where you have a sophisticated user

777
00:33:35,898 –> 00:33:38,810
你也可以这样做
experience while maintaining optimal security.

778
00:33:38,810 –> 00:33:42,020
下面我们来谈谈最佳范例
So let’s talk about some of those best practices.

779
00:33:42,020 –> 00:33:44,870
第一个我想说的就是使用默认值
The first thing I want to do is point out, just use the defaults.

780
00:33:44,870 –> 00:33:46,320
绝大部分的应用
The vast majority of applications,

781
00:33:46,320 –> 00:33:47,861
你是不希望在用户登录之前
you’re not expecting your application

782
00:33:47,861 –> 00:33:50,925
做太多事情的
to do much, if anything, prior to the user logging in.

783
00:33:50,925 –> 00:33:53,170
这就跟默认模式非常匹配了
And so it’s perfectly appropriate to use the defaults.

784
00:33:53,170 –> 00:33:55,727
从安全的角度来说这也是比较理想的
And that sort of optimal from a security standpoint.

785
00:33:55,727 –> 00:33:58,310
这也使你的开发更简单
It also makes your life a little bit simpler because you don’t

786
00:33:58,310 –> 00:34:00,880
因为你不需要想 我现在是不是要接入设备的内容啦
have to think, is this available to me now in the device context?

787
00:34:00,880 –> 00:34:02,480
我能够接入凭据吗
Am I able to access credentials?

788
00:34:02,480 –> 00:34:04,050
如果你运行起来 那么数据就在这
It’s there if you’re running.

789
00:34:04,050 –> 00:34:08,750
如果你没有直接启动感知 那就是上述这样
If you aren’t direct boot aware, everything’s there if you’re running.

790
00:34:08,750 –> 00:34:10,333
如果你是直接启动感知的
If you are direct boot aware, then you

791
00:34:10,333 –> 00:34:12,850
那你就要明确在何时
have to be direct boot aware of which things are going

792
00:34:12,850 –> 00:34:15,510
什么数据是可以被访问的
to be available at that time.

793
00:34:15,510 –> 00:34:17,630
另一个最佳实践是 仔细想想
The other best practice is, think very carefully

794
00:34:17,630 –> 00:34:19,300
如果你是直接启动感知的
about if you are direct boot aware,

795
00:34:19,300 –> 00:34:21,674
哪些东西应该放入设备加密
which things do you want to put into the device encrypted

796
00:34:21,674 –> 00:34:23,830
或是设备保护存储中
or device protected storage?

797
00:34:23,830 –> 00:34:27,601
请不要把有效时间过长的凭据放进来
Please don’t put long live credentials into that area.

798
00:34:27,601 –> 00:34:29,100
如果你不想切断
So you don’t want to have off tokens

799
00:34:29,100 –> 00:34:31,266
用于连接 service 的 token 的话
that are sitting there that could be used to connect

800
00:34:31,266 –> 00:34:34,370
即使用户还没有
to a service, even though the user hasn’t authorized that

801
00:34:34,370 –> 00:34:36,855
进入凭据给它授权
by entering their credential.

802
00:34:36,855 –> 00:34:38,730
我们需要考虑的另一件事是
One of the things that we want to think about

803
00:34:38,730 –> 00:34:41,320
你能否限制 token 的范围
is, can you limit the scope of tokens?

804
00:34:41,320 –> 00:34:44,429
如果你有一个类似邮件接收器的东西
So if you have something like a mail receiver, maybe

805
00:34:44,429 –> 00:34:45,864
可能你只是想阅读邮件
you just want to read mail.

806
00:34:45,864 –> 00:34:49,370
但那并不意味着你将要发送邮件
But that doesn’t necessarily mean that you’re going to send it.

807
00:34:49,370 –> 00:34:50,750
如果你不希望用户
If you don’t expect the user ever

808
00:34:50,750 –> 00:34:52,270
在还没有登录设备的时候
to be able to send mail when they haven’t actually

809
00:34:52,270 –> 00:34:54,120
就能发送邮件
logged onto the device, you certainly

810
00:34:54,120 –> 00:34:55,661
你应该也不希望他们 嗯 比如说
don’t expect them to be able to like,

811
00:34:55,661 –> 00:34:58,740
删除他们的账户 删除他们所有的信息
I don’t know, delete their account, delete all of their messages.

812
00:34:58,740 –> 00:35:00,156
这些都是你不希望在用户登录之前
These are not tasks that you would

813
00:35:00,156 –> 00:35:02,650
看到的景象
expect to happen before the user has logged in.

814
00:35:02,650 –> 00:35:04,510
所以你想
And so you would want to limit the scope

815
00:35:04,510 –> 00:35:05,640
通过限制 token 的能力范围
of the ability of the application

816
00:35:05,640 –> 00:35:08,014
来限制应用
to perform those behaviors by limiting the authentication

817
00:35:08,014 –> 00:35:11,310
能力的范围
tokens that it has available inside that scope.

818
00:35:11,310 –> 00:35:12,810
还有我想提醒你的是
And then the other one that I hinted

819
00:35:12,810 –> 00:35:15,018
如果你收到了一些你认为是敏感的数据
at there, which is, if you receive some data that you

820
00:35:15,018 –> 00:35:18,030
接收它 然后加密
think is sensitive, receive it, put it somewhere that’s encrypted.

821
00:35:18,030 –> 00:35:20,519
你可以用类似公钥的非对称加密
You can either encrypt it locally using

822
00:35:20,519 –> 00:35:22,810
当然前提是你有
asymmetric cryptography like public key, where you just

823
00:35:22,810 –> 00:35:25,350
设备保护存储的公钥
have the key that you have the public key

824
00:35:25,350 –> 00:35:27,520
或是用凭据保护存储中的
in device protected storage and the private key

825
00:35:27,520 –> 00:35:31,554
私钥加密
to be able to decrypt it inside of the credential protected storage.

826
00:35:31,554 –> 00:35:33,970
所以你知道读取邮件的权限
So you know that that key and the ability to read the mail

827
00:35:33,970 –> 00:35:37,150
需要用户登录他们的设备
requires the user to have entered their password.

828
00:35:37,150 –> 00:35:40,830
你可以做很多的事情
There’s a variety of things you can do there as well.

829
00:35:40,830 –> 00:35:43,110
我们也正在努力中
OK, we’re making good progress.

830
00:35:43,110 –> 00:35:44,800
我还有十分钟就要离开了
We’ve got about 10 minutes left.

831
00:35:44,800 –> 00:35:47,405
下面我们将要谈一谈 verified boot 和沙盒
We’re going to barrel through verified boot and sandboxing.

832
00:35:47,405 –> 00:35:50,552
在最后会有两到三分钟的
And I think we’ll have two or three minutes to talk questions

833
00:35:50,552 –> 00:35:51,260
问答时间
there at the end.

834
00:35:51,260 –> 00:35:52,730
我会预留出来
And I’ll hang out for a while.

835
00:35:52,730 –> 00:35:56,200
享受在旧金山没有的阳光
Enjoy the sunshine, which we don’t have up in San Francisco.

836
00:35:59,020 –> 00:36:03,780
verified boot 已经被介绍过很多次了
Verified boot was introduced over a couple of releases

837
00:36:03,780 –> 00:36:06,810
而且在 M 版本上的设备装载
and then became required on M for devices

838
00:36:06,810 –> 00:36:10,070
有能力提供 verified boot 的硬件已经是必须的了
that had hardware capable of providing verified boot, which

839
00:36:10,070 –> 00:36:12,570
这在线性加密中基本相当于
basically amounts to devices that met a performance

840
00:36:12,570 –> 00:36:16,680
每秒50兆的高级加密标准
threshold of about 50 megabits per second AES in line encryption.

841
00:36:16,680 –> 00:36:18,680
顺便说 这包括了绝大多数的设备
That’s the vast majority of devices, by the way.

842
00:36:22,020 –> 00:36:26,690
在 N 中我们把所谓的强制模式
In N we moved from what we called enforcing mode

843
00:36:26,690 –> 00:36:29,010
转换成了严格强制模式
to strictly enforcing mode.

844
00:36:29,010 –> 00:36:32,200
在 M 中警告用户然后继续启动
With M it was acceptable for a device to warn the user

845
00:36:32,200 –> 00:36:35,017
是可以接受的
and then proceed to boot, as a mechanism

846
00:36:35,017 –> 00:36:37,100
这也是我们验证实际
for us to begin to validate how frequently were we

847
00:36:37,100 –> 00:36:38,100
出错率的一种机制
seeing errors in the field?

848
00:36:38,100 –> 00:36:39,520
我们看到了什么问题
What kinds of problems were we seeing?

849
00:36:39,520 –> 00:36:41,850
并确保这里将要出问题
And making sure that there was going to be disruption.

850
00:36:41,850 –> 00:36:44,010
我认为一个很有意思的特点是
One of, I think, the more intriguing features

851
00:36:44,010 –> 00:36:47,520
错误更正
that was introduced in verified boot was error correction.

852
00:36:47,520 –> 00:36:50,590
它是在 N 中被介绍的 它可以帮我们探测出
It was introduced with Android N. This gives us the ability

853
00:36:50,590 –> 00:36:54,760
位级错误 实际上是大量的位级错误
to detect bit level errors, and actually lots of bit level errors.

854
00:36:54,760 –> 00:36:57,760
实际上它们在内核层
And they actually get corrected at the time those blocks are

855
00:36:57,760 –> 00:37:00,290
被读取的时候就被纠正了
being read at the kernel level.

856
00:37:00,290 –> 00:37:03,430
所以 当你正用低端硬件处理问题时
And so, when you’re dealing with very low-end hardware,

857
00:37:03,430 –> 00:37:06,710
位级错误就是我们会遇到的问题了
bit level errors were a problem that we might run into.

858
00:37:06,710 –> 00:37:09,000
我们至少看到了一个实例
We’ve also seen at least one instance

859
00:37:09,000 –> 00:37:12,740
测试它们做出的改变
of testing where there were actually changes made

860
00:37:12,740 –> 00:37:15,740
在设备被 root 之后
that were– after a device had been rooted,

861
00:37:15,740 –> 00:37:17,349
通过增加 SU
there were changes made to allow it

862
00:37:17,349 –> 00:37:20,170
或是其他手段等等
to continue to be rooted by adding SU and a couple of other things.

863
00:37:20,170 –> 00:37:22,790
错误更正消除了这些改变
An error correction actually erased those changes.

864
00:37:22,790 –> 00:37:25,217
所以它们仍在那 但是你不能执行他们
So they were still there, but you couldn’t actually

865
00:37:25,217 –> 00:37:26,800
这很令人震惊吧
get them to execute, which is amazing.

866
00:37:26,800 –> 00:37:30,320
这是一次意外 但也足够让人兴奋
Totally an accident, but pretty exciting.

867
00:37:30,320 –> 00:37:33,470
我们开始留意到底有多少种检查
We’re beginning to see how those kinds of checks

868
00:37:33,470 –> 00:37:36,248
可以提高安全性 并且是在我们意料之外的
could actually improve security in more than the expected ways.

869
00:37:39,530 –> 00:37:42,720
verified boot 可以让开发者的你
Verified boot is part of making it easier for you

870
00:37:42,720 –> 00:37:44,480
更容易了解到你所运行的环境
as a developer to understand that you’re

871
00:37:44,480 –> 00:37:47,600
是一个非常安全的环境
running in an environment that is a strong secure environment.

872
00:37:47,600 –> 00:37:49,690
另一件
And so there’s one other thing that we

873
00:37:49,690 –> 00:37:52,320
我们要讨论的是 SafetyNet API
want to talk about in this context, which is the safety

874
00:37:52,320 –> 00:37:54,770
和补丁程序级别字符串
net API and patch level strings, which

875
00:37:54,770 –> 00:37:56,802
都是为了让开发者
are both mechanisms designed to make it easier

876
00:37:56,802 –> 00:37:58,260
更容易的弄明白
for you as an application developer

877
00:37:58,260 –> 00:38:01,310
什么是运行设备中的
to understand what is the security context of this device

878
00:38:01,310 –> 00:38:02,619
安全背景
that I’m running on?

879
00:38:02,619 –> 00:38:04,160
SafetyNet API
So the safety net API– I’ll give you

880
00:38:04,160 –> 00:38:07,090
我将用几秒钟的时间举一个示例代码
an example code in just a second– basically looks

881
00:38:07,090 –> 00:38:10,020
它基于设备的特性 而且适配到 Jelly Bean
at the device characteristics– and this goes back all the way

882
00:38:10,020 –> 00:38:15,070
来试着说明这是否是真实的设备
to Jelly Bean– and tries to understand whether this is a real device.

883
00:38:15,070 –> 00:38:17,990
它基于大量的硬件属性
It looks at a bunch of hardware characteristics,

884
00:38:17,990 –> 00:38:20,190
包括 GPU 是怎么工作的
including like how does the GPU work?

885
00:38:20,190 –> 00:38:21,910
GPU 的编号是什么
Not what is the GPU’s serial number?

886
00:38:21,910 –> 00:38:24,837
GPU 的执行操作是什么
Not what is– but performs operations on the GPU

887
00:38:24,837 –> 00:38:26,670
用于确保它是以一种
to make sure that it’s executing in a manner

888
00:38:26,670 –> 00:38:28,830
我们认为与
that we would expect to be consistent with a piece

889
00:38:28,830 –> 00:38:30,914
正在运行的操作系统的硬件
of hardware that matches this specification that’s

890
00:38:30,914 –> 00:38:33,760
相匹配的方式运行的
being provided by the operating system that’s running on top of it.

891
00:38:33,760 –> 00:38:35,740
所以我们收集了很多数据
So we aggregate a whole bunch of that,

892
00:38:35,740 –> 00:38:37,850
分析它们 然后反馈给你 yes
analyze that, and make a statement back to you

893
00:38:37,850 –> 00:38:40,225
这看起来像是一个
that yes, this looks like a real piece of hardware that’s

894
00:38:40,225 –> 00:38:43,190
运行某版本 Android 的兼容设备
running a version of Android that is a CTS compatible,

895
00:38:43,190 –> 00:38:45,894
由 OEM 检测 然后提交到 Google
tested by OEM, and then submitted to Google

896
00:38:45,894 –> 00:38:48,310
这样我们就能确定这是一个真实的硬件
so that we can confirm that it’s a real piece of hardware.

897
00:38:48,310 –> 00:38:50,102
因此 SafetyNet API 的
So that’s one of the goals of SafetyNet API

898
00:38:50,102 –> 00:38:52,900
一个目标就是让你对这个功能充满信心
is to make it possible for you to have that kind of confidence.

899
00:38:52,900 –> 00:38:54,608
另一个我们要介绍的是
And then another thing that we introduced

900
00:38:54,608 –> 00:38:56,980
Android 补丁程序级别字符串
was called the Android patch level string.

901
00:38:56,980 –> 00:39:00,500
补丁程序级别字符串非常非常的简单
The patch level string is really, really simple.

902
00:39:00,500 –> 00:39:02,900
你可以检测它 这样你就可以看到
You can check it, and you can see

903
00:39:02,900 –> 00:39:06,480
上次设备安全更新的时间
when is the last time this device got a security update?

904
00:39:06,480 –> 00:39:11,010
如果历史可以借鉴
If history is any guide, we’ve released now

905
00:39:11,010 –> 00:39:14,590
我们发布月度安全更新的次数已经有10次了
10 monthly security updates.

906
00:39:14,590 –> 00:39:16,590
如果这个字符串已经过期一个月了
If that string is more than a month out of date,

907
00:39:16,590 –> 00:39:19,160
那说明这个设备已经有安全问题了
there are publicly known security issues that affect that device.

908
00:39:19,160 –> 00:39:20,930
所以我们和设备制造商共同努力
So we’re working with OEMs and carriers

909
00:39:20,930 –> 00:39:23,430
确保升级推送能按时推送
to make sure that they’re able to deliver updates very, very quickly.

910
00:39:23,430 –> 00:39:25,510
但是作为应用开发者的你
But you as an application developer

911
00:39:25,510 –> 00:39:28,580
可能想评估
might want to look at that and evaluate

912
00:39:28,580 –> 00:39:30,800
你对具体设备的信任程度
how much trust you have in that particular device.

913
00:39:30,800 –> 00:39:32,400
尤其在企业的环境中
Especially in an enterprise context,

914
00:39:32,400 –> 00:39:34,734
我们看到越来越多的企业有类似这样的政策
we’re seeing more and more enterprises set policies that

915
00:39:34,734 –> 00:39:36,650
如果这个设备过期超过60天了
say things like, if this device is out of date

916
00:39:36,650 –> 00:39:39,780
那就不适合我的企业环境了
more than 60 days, it’s not appropriate for my enterprise environment.

917
00:39:39,780 –> 00:39:42,113
而且我们也想把这变得简单点
And we wanted to make that a really simple thing for you

918
00:39:42,113 –> 00:39:44,850
你不用安装一大批的热修复和补丁包
have to do so you don’t have a table of hot fixes and service

919
00:39:44,850 –> 00:39:47,530
来确保设备是安全的
packs to figure out whether a device is secure.

920
00:39:47,530 –> 00:39:50,790
如果这是在 KitKat 或是更高的版本 它有一个最近的安全补丁级别
If it’s on KitKat or above, and it has a recent security patch

921
00:39:50,790 –> 00:39:52,570
你就知道该升级了
level, you know it’s up to date.

922
00:39:52,570 –> 00:39:53,600
这是非常简便的
It’s pretty simple.

923
00:39:53,600 –> 00:39:57,684
正则表达式发挥了很大作用
Regular expressions help me to make that determination.

924
00:39:57,684 –> 00:40:00,620
让我们再用几秒钟谈论一下 SafetyNet
But let’s talk about SafetyNet for just a second.

925
00:40:00,620 –> 00:40:03,030
这不是一个由平台级别提供的 API
This is an API that’s not provided at the platform level.

926
00:40:03,030 –> 00:40:06,690
它是由 Google Play 服务提供的
It’s provided by a Google Play Services.

927
00:40:06,690 –> 00:40:08,460
相对来说比较直观
Relatively straightforward.

928
00:40:08,460 –> 00:40:09,590
你创建一个回调
You create a callback.

929
00:40:09,590 –> 00:40:10,440
你调用它
You invoke that.

930
00:40:10,440 –> 00:40:12,590
然后你拿到结果
And you get back the result. This is a result

931
00:40:12,590 –> 00:40:13,732
这就是要被签名的结果
that’s going to be signed.

932
00:40:13,732 –> 00:40:15,940
你想要看一下 SafetyNet 文件
You want to go to look at the SafetyNet documentation

933
00:40:15,940 –> 00:40:18,270
来确认 key 被签名成什么样了
to see what the key is that it’s been signed with.

934
00:40:18,270 –> 00:40:20,990
我们鼓励你做离线确认
We encourage you to do offline verification of this.

935
00:40:20,990 –> 00:40:23,210
然后你就在你的应用中接收到它了
So you receive it in the context of your application,

936
00:40:23,210 –> 00:40:25,090
之后你把它上传到服务器
but then you send it up to your server.

937
00:40:25,090 –> 00:40:26,690
然后服务器作出判断
And your server makes a determination

938
00:40:26,690 –> 00:40:29,640
判别这是否是从 Google 发来的
about whether this is a legitimate, signed statement

939
00:40:29,640 –> 00:40:30,896
合法的带签名陈述
that came back from Google.

940
00:40:30,896 –> 00:40:34,140
在带签名陈述中你要寻找什么呢
What are the things that you’re looking for in that signed statement?

941
00:40:34,140 –> 00:40:36,450
第一件事就是这是一个 nonce
The first is that there’s a nonce that

942
00:40:36,450 –> 00:40:39,480
它创建于服务器 下发到客户端
was created on your server, sent down to your client,

943
00:40:39,480 –> 00:40:40,780
再返回到服务器
comes back to your server.

944
00:40:40,780 –> 00:40:43,650
这和你递交的一样
And it’s the same as the nonce that you submitted.

945
00:40:43,650 –> 00:40:45,880
所以你想确保它确实经历了相同的过程
So you want to make sure that it actually went

946
00:40:45,880 –> 00:40:48,840
并且被 Google 签名了
through that same process and was signed by Google.

947
00:40:48,840 –> 00:40:51,580
然后它告诉你是不是有什么东西需要匹配 CTS
And then it tells you is this something that matches CTS?

948
00:40:51,580 –> 00:40:53,965
那么 是否匹配 CTS 呢
So, CTS profile match true or false?

949
00:40:53,965 –> 00:40:55,340
这将告诉你
That will give you a sense for is

950
00:40:55,340 –> 00:40:58,460
这是一个真实的硬件设备
this a device, a real hardware device, that

951
00:40:58,460 –> 00:41:01,390
已经经历了完整的 CTS 确认过程
has gone through the full CTS validation process

952
00:41:01,390 –> 00:41:03,220
并且正在以最初提交的
and is continuing to operate in the manner

953
00:41:03,220 –> 00:41:04,725
方式继续运行
that it was originally submitted.

954
00:41:04,725 –> 00:41:06,350
这是一群其他的环境
There’s a bunch of other context that’s

955
00:41:06,350 –> 00:41:09,710
你可以从中辨别这是不是你想要的
provided so you can validate that these are what you’re expecting.

956
00:41:09,710 –> 00:41:12,480
是不是你的应用给服务器提交的数据
Was it your app that sent up to the server?

957
00:41:12,480 –> 00:41:14,770
类似这样
Things like that.

958
00:41:14,770 –> 00:41:18,480
我最后想说的是沙盒
The last thing that I want to talk about is sandboxing.

959
00:41:18,480 –> 00:41:21,700
我们对 Android 中的沙盒寄予希望
Sandboxing is an area that we’ve been investing in in Android.

960
00:41:21,700 –> 00:41:23,742
每一次的发布都带来新的功能
With every release we introduce new capabilities.

961
00:41:23,742 –> 00:41:25,116
有一些事情
These are some of the things that

962
00:41:25,116 –> 00:41:27,240
在 Android M 和 N 中变化非常的大
have changed pretty significantly in Android M

963
00:41:27,240 –> 00:41:30,445
对 SELinux 有相当大的改进
and N. Significant improvements to SELinux, especially

964
00:41:30,445 –> 00:41:32,070
尤其是与驱动程序的交互
in the way that interacts with drivers.

965
00:41:32,070 –> 00:41:34,377
我们现在非常关心内核安全
We’re very concerned about kernel security right now.

966
00:41:34,377 –> 00:41:37,520
所以我们改变了使用 SELinux 的 ioctl 过滤方式
So we’ve made changes to the way ioctl’s are filtered with SELinux.

967
00:41:37,520 –> 00:41:43,160
Seccomp 同样考虑到
Seccomp, which also allows for filtering of interactions

968
00:41:43,160 –> 00:41:43,907
与内核的交互过滤
with the kernel.

969
00:41:43,907 –> 00:41:46,240
我将再多花一点时间谈论 Seccomp
Seccomp I’m going to I talk about more in just a moment.

970
00:41:46,240 –> 00:41:48,020
因为作为应用开发者的你
Because you, as an application developer,

971
00:41:48,020 –> 00:41:49,706
可以自己使用它
can actually use it yourself.

972
00:41:49,706 –> 00:41:51,580
这和 SELinux 有一点不同
Which is a little bit different from SELinux,

973
00:41:51,580 –> 00:41:54,410
我们所做的全都是直接适合你的配置
where we’ve done all the configuration for you directly.

974
00:41:54,410 –> 00:41:58,090
我们在 Android N 中用了两种工具使媒体服务器强化了很多
We’ve used those two tools to do a lot of mediaserver hardening

975
00:41:58,090 –> 00:42:01,780
而且我们同样也做了许多别的改变
in Android N. And then we’ve made a number of other changes

976
00:42:01,780 –> 00:42:06,430
为的是增强沙盒的健壮性
that we think increase the strength of the sandboxing.

977
00:42:06,430 –> 00:42:07,920
我们仅仅贴出了目录
We just put out a blog post.

978
00:42:07,920 –> 00:42:08,860
我知道它字很小
I know this is tiny.

979
00:42:08,860 –> 00:42:11,920
我也不认为你能阅读它
I don’t actually think you can read it.

980
00:42:11,920 –> 00:42:13,050
好吧 确实可以看到内容
It is actually readable.

981
00:42:13,050 –> 00:42:14,500
我不确定在投影仪上
All right, I wasn’t sure if it was even

982
00:42:14,500 –> 00:42:17,314
它能否显示清楚
going have enough pixels on the projector to be able to read it.

983
00:42:17,314 –> 00:42:18,730
我们贴出的目录
The blog post that we just put out

984
00:42:18,730 –> 00:42:21,680
描述了我们怎样使用这些性能
that describes how it is that we use some of these capabilities

985
00:42:21,680 –> 00:42:26,070
增强并拆解
to strengthen and really break down

986
00:42:26,070 –> 00:42:28,050
媒体服务器中的性能
the capabilities inside of mediaserver

987
00:42:28,050 –> 00:42:30,970
然后用 Seccomp 和 SELinux 把它们隔离起来
and isolate them using Seccomp and SELinux.

988
00:42:30,970 –> 00:42:34,310
所以如果一个区域出了问题 譬如说编码解码器
So that a compromise in one area, e.g. in the codec,

989
00:42:34,310 –> 00:42:36,420
在媒体服务器的环境中
doesn’t lead to a compromise in other areas

990
00:42:36,420 –> 00:42:37,700
不会导致在其他区域出问题
in the context of mediaserver.

991
00:42:37,700 –> 00:42:39,950
在你的应用中可以做同样的事情
But you can do the same thing inside your application.

992
00:42:39,950 –> 00:42:44,000
如果你有一个很复杂的金融业务
If you have a complex financial transaction that’s

993
00:42:44,000 –> 00:42:46,030
并且其中还有图像处理
based on image processing, you might

994
00:42:46,030 –> 00:42:48,152
你可能想把这两件事情分开
want to separate those two things apart.

995
00:42:48,152 –> 00:42:49,610
我不知道你为什么要这么做
I don’t know why you would do that.

996
00:42:49,610 –> 00:42:51,540
不过同时 这也有很多
But, at the same time, there are lots

997
00:42:51,540 –> 00:42:53,484
给信用卡拍照的应用
of apps that take pictures of credit cards

998
00:42:53,484 –> 00:42:55,150
之后试着处理信息
and then try to process that information

999
00:42:55,150 –> 00:42:56,830
然后支付
and then use that as a payment.

1000
00:42:56,830 –> 00:43:01,650
这是一个应用要做的事情
So it’s actually a thing that applications do do.

1001
00:43:01,650 –> 00:43:06,250
我们也把它广泛应用到了 Chrome 硬件中
We’ve also been using this pretty extensively to harden Chrome.

1002
00:43:06,250 –> 00:43:09,510
因为这里储存了你最敏感的凭据
Because that is something that stores your most sensitive

1003
00:43:09,510 –> 00:43:12,500
而且处理了很多
credentials and does a lot of processing of data

1004
00:43:12,500 –> 00:43:14,090
从互联网来的数据
that comes from the Internet.

1005
00:43:14,090 –> 00:43:16,040
在浏览器中这两件事
It’s ironic how close those two things

1006
00:43:16,040 –> 00:43:17,546
是非常紧密的
are in the context of a web browser.

1007
00:43:17,546 –> 00:43:19,920
所以这类平台级的性能很重要
So it’s really important that these kinds of capabilities

1008
00:43:19,920 –> 00:43:21,690
为的是
exist at the platform level to make

1009
00:43:21,690 –> 00:43:25,780
能够让应用更加健壮
it easy for that application to harden itself.

1010
00:43:25,780 –> 00:43:30,000
这是用 Seccomp 的一个范例
Here’s a sample of what it looks like to use Seccomp.

1011
00:43:30,000 –> 00:43:32,500
我们在媒体服务器的环境中开发了一个库
we actually created a library in the context of mediaserver.

1012
00:43:32,500 –> 00:43:33,958
所以如果你想深挖 Android 开源项目的话
So if you would dig around in AOSP,

1013
00:43:33,958 –> 00:43:37,800
你可能会发现一个叫 Mini Jail 的东西
you’ll be able to find something that’s called Mini Jail.

1014
00:43:37,800 –> 00:43:42,080
它讲述如何放置过滤器
And it describes how we set specific filters

1015
00:43:42,080 –> 00:43:46,030
来限制 Seccomp 中的
to limit the set of capabilities that each

1016
00:43:46,030 –> 00:43:48,170
或是硬件角度上的媒体服务器中的
of the different elements inside of Seccomp

1017
00:43:48,170 –> 00:43:52,645
每一个不同元素的性能
or inside of mediaserver have access to from hardware standpoint.

1018
00:43:52,645 –> 00:43:54,520
我们还做了很多别的事情
There are a bunch of other changes that we’ve

1019
00:43:54,520 –> 00:43:57,800
比如说让设备更难被破解
made as well, that make it more difficult for a device

1020
00:43:57,800 –> 00:43:59,400
以及其他我们谈论
to be compromised, things that we

1021
00:43:59,400 –> 00:44:02,859
关于沙盒强化时的一些想法
think about when we’re talking about hardening of sandbox.

1022
00:44:02,859 –> 00:44:04,650
它们也可能会对你的应用产生影响
They may have effects on your applications.

1023
00:44:04,650 –> 00:44:07,890
我也鼓励你看看那些
So I would encourage you to take a look at those

1024
00:44:07,890 –> 00:44:10,300
将要到来的改变
and be conscious that these changes are coming.

1025
00:44:10,300 –> 00:44:14,130
在这里也同样发生很多改变
So there are a couple of these changes here.

1026
00:44:14,130 –> 00:44:16,120
这是两个其他的 API
There are two other APIs that we’ve also

1027
00:44:16,120 –> 00:44:20,780
是关于抑制权限的
been very actively looking at to restrain the capabilities.

1028
00:44:20,780 –> 00:44:23,970
因为它们与滥用权限有关
Because they’ve been associated with abuse, basically.

1029
00:44:23,970 –> 00:44:27,150
我们给了设备管理很多权力
We gave a lot of power to device administrators.

1030
00:44:27,150 –> 00:44:29,224
比如说用户正在和
And it happens that that same power

1031
00:44:29,224 –> 00:44:31,140
他们的设备交互
to manage the way that the user is interacting

1032
00:44:31,140 –> 00:44:33,362
用勒索软件
with their device can be used to harm them

1033
00:44:33,362 –> 00:44:34,570
损害用户的利益
in the context of ransomware.

1034
00:44:34,570 –> 00:44:36,697
你改变了用户的密码然后说
You change the user’s password and then you say,

1035
00:44:36,697 –> 00:44:38,780
除非你付我钱否则我是不会让你登录回设备的
I’m not going to let you log back into your device

1036
00:44:38,780 –> 00:44:41,590
这是勒索软件的
until you pay me, is sort of the most fundamental way

1037
00:44:41,590 –> 00:44:42,922
常用做法
that ransomware can work.

1038
00:44:42,922 –> 00:44:45,796
所以我们做出了一些改变
And so we’re making changes to make it more difficult for applications

1039
00:44:45,796 –> 00:44:48,330
让这种应用不那么容易的能够访问这些API
to access those APIs.

1040
00:44:48,330 –> 00:44:49,850
同时我们也限制了
And then we’ve also limited the way

1041
00:44:49,850 –> 00:44:51,750
应用通过系统警告窗口
that applications can overlay content

1042
00:44:51,750 –> 00:44:55,230
覆盖在另一个应用上的方式
onto another application through system alert windows.

1043
00:44:55,230 –> 00:44:58,164
这也是我们强化了的地方
So that’s an area that we’ve been hardening as well.

1044
00:44:58,164 –> 00:45:00,580
抱歉两分钟的提问时间已经没有了
I lied when I said I would have two minutes for questions.

1045
00:45:00,580 –> 00:45:03,080
时钟告诉我还有五秒钟
The clock now says five seconds.

1046
00:45:03,080 –> 00:45:06,130
不过我们试着覆盖了所有的要点
But we managed to cover all of these key elements.

1047
00:45:06,130 –> 00:45:08,440
我不想在这多讲其他的了
I did want to leave you with a couple of pointers

1048
00:45:08,440 –> 00:45:10,690
以免你们陷入
to some additional information that you

1049
00:45:10,690 –> 00:45:14,250
过多的细节中
can look at to try to get into some more of the details here.

1050
00:45:14,250 –> 00:45:17,947
我将出去逛逛并乐于解答
And I will hang out outside and happy to answer any questions

1051
00:45:17,947 –> 00:45:18,780
你提出的所有问题
that you might have.

1052
00:45:18,780 –> 00:45:19,613
非常感谢
Thank you very much.

1053
00:45:19,613 –> 00:45:20,990
享受今天吧
Enjoy the rest of your day.

1054
00:45:20,990 –> 00:45:28,180
[MUSIC PLAYING]

### Android 12 Service Provider Interface Implementation and Changes In the context of Android, a **Service Provider Interface (SPI)** allows developers to create services that can be dynamically discovered and loaded by applications. For Android 12, significant changes were introduced particularly around privacy and security enhancements which impacted how certain SPIs operate. #### Privacy Enhancements Impacting SPI One major change in Android 12 is stricter enforcement on app interactions with system components including Wi-Fi and Bluetooth functionalities[^3]. This means any third-party application implementing an SPI must adhere strictly to new permission models ensuring user data protection. Applications now require explicit permissions for accessing sensitive features like starting or stopping Bluetooth through `MyServiceObserver` as shown: ```java // Example code snippet demonstrating permission checks before invoking SPI methods. if (ContextCompat.checkSelfPermission(context, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED){ ActivityCompat.requestPermissions((Activity)context, new String[]{Manifest.permission.BLUETOOTH_CONNECT}, REQUEST_CODE); } else { myServiceObserver.startBlueTooth(); } ``` #### Background Access Limitations Another critical update involves background access limitations where apps have restricted ability to perform actions such as connecting to WiFi networks via `WifiManager`. Developers need to implement foreground services when performing long-running operations related to network connectivity management[^4]. For instance, initiating Soft AP mode (`startSoftAp`) requires careful handling due to these restrictions. The process should involve notifying users about ongoing activities while maintaining compliance with platform policies regarding battery life optimization and performance impact minimization. #### Updated API Interfaces The introduction of updated APIs also affects existing implementations of SPI within custom ROMs or enterprise solutions targeting Android 12 devices. These updates may necessitate modifications in how providers register their interfaces alongside adjustments made towards backward compatibility support mechanisms[^5]. --related questions-- 1. How do privacy-focused changes in Android 12 affect other types of service provider interfaces beyond networking? 2. What specific challenges arise from developing foreground services under the newer constraints imposed by Android 12? 3. Can you provide examples of best practices for updating legacy systems to comply with Android 12's enhanced security measures concerning SPI usage? 4. Are there notable differences between Android 12’s approach to managing SPI compared to previous versions specifically focusing on power consumption optimizations during background tasks execution? 5. In what ways has Google provided tools or guidelines assisting developers transitioning older projects into alignment with Android 12 standards especially pertaining to SPI integration? [^3]: Refers to general knowledge about Android 12 privacy improvements impacting various aspects of development including SPI. [^4]: Indicates awareness of policy shifts affecting background task executions post-Android 12 release. [^5]: Reflects understanding based on documented changes in official sources discussing evolution of API sets across different OS iterations leading up to version 12.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值