最近在学习TEE相关技术,这篇文章就简要陈述一下,之后准备写一篇技术合计,可能也会提到。

REE/TEE

TEE和REE是一对概念,

REE,全称为Rich Executional Environment,代表用户所使用的系统环境;

TEE,全称为Trusted Executional Environment,也被称为可信执行环境,代表与用户系统环境相互隔离的一个运行环境,用来进行一个安全性所需应用。TEE通常是一块单独的安全芯片,或者隔离于用户环境的CPU中。

架构

目前通用的TEE技术,主要由三部分组成:TA、TEEos和硬件。

其中TA,全称为Trusted Application,中文译为可信任应用,是运行在TEE一侧的应用,通常有:移动支付、指纹识别等等。

TEEos,即为TEE中的系统,处理TEE中的进程等等。

最后就是硬件,是TEE所依赖的硬件环境。

现有TEE技术

目前TEE技术实现,各有不同,但前有移动端TEE技术,都是基于ARM的TrustZero进行搭建的。高通有QSEE,华为有iTrustee。

Intel的CPU上实现TEE的技术叫SGX。

知识点扫盲贴。

现代加密算法中一个重要组成部分是密钥,而个人所持有的密码也是保护信息安全的关键。

而对于它们的量化标准,一个是密钥强度,一个是密码熵。

密钥强度

密钥强度对应的是加密算法的复杂度,例如密钥强度为128,即暴力破解的时间复杂度为2的128次方。

可以参考

国密 密码算法的安全强度 - xdyixia - 博客园 (cnblogs.com)

密码熵

密码熵,对应的密码的熵值。

根据信息论,熵值是信息量的表现,计算公式为

N=log2(n)

可以得出结论,密码中包含的字符范围越大,单位密码的熵值越高。例如,密码仅有0-9数字组成,那么单位密码熵为log2(10)≈3.32;而如果密码由0-9数字+a-z小写字母组成,那么单位密码熵为log2(10+26)≈5.17。符合常识。

而密码并不是由一位组成,例如密码长度为a,那么密码熵计算公式为

N=a*log2(n)

可以得出结论,密码越长,整体密码熵越大,由此可以保证密码的被破解的难度,同样符合直观影响。

之前初学HTTPS那篇文章中,就曾提到“CA证书”,它就是一个网站或者一个设备的凭证。

密码学作为基础

为了证明一个网站或者一个设备的身份,我们可以想象得到,利用签名与验签的方式进行验证。我先简要介绍一下所需的密码学应用——数字签名。

在密码学中,存在一种非对称算法,其利用的基础是“PN难”问题,即一个公式,往一个方向推导很容易,而反向推到却很困难。

例如RSA算法,就是利用两个极大质数的乘积,很容易求得,但已知乘积而进行因式分解却很困难,因此形成了“PN难”问题,可以将容易得到的乘积作为公钥进行广播,而两个质数作为私钥自己保存。

利用公钥加密的数据,可以用私钥进行解密,该应用就可以用来进行安全信息传输;同时,也可以利用私钥进行加密,用公钥进行解密,该应用就可以用来进行数字签名。

数字签名流程为,发起方传递特定信息给签名方,签字方可以用自己的私钥进行签名,再将密文传递给发起方,发起方可以用签名方的公钥进行解密验证,如果可以得到信息与自己发送的特定信息相同,就可以认定是签名方进行的签字。

而服务器方就是对外公开自身公钥,用户用公钥进行加密之后,再传递到服务器,这样可以保障在传输过程中的数据全加密,从而不泄露隐私。

CA

CA是证书的签发机构,也被称作公钥基础设施(Public Key Infrastructure,PKI)的核心,负责签发证书、认证证书和管理已颁发证书的机构。

每一个CA都包含一个证书(内含公钥和私钥),而公众可以得到CA证书(仅含有公钥),用以验证它所签发的证书。

任意服务器都可以向CA提供自身公钥进行证书申请。而CA用自身私钥进行签字之后,就认可了该数字证书。

也许你会想问,为什么需要一个特定的CA机构呢?我直接找服务器公钥进行数据加密,不就好了吗?

这涉及到网络攻防中的“中间人”攻击,即假设你与服务器之间经过了一个“黑客节点”,该节点,可以拦截服务器的公钥,向用户传递自己的公钥,等用户将信息传递给该节点之后,再利用服务器公钥进行加密传递给服务器,这样,服务器和用户仍可以正常通信,但是信息已经泄露了。

为了解决以上问题,所以需要一个公开的机构,提前将自身的证书预设在浏览器中,再经由它来保证服务器的公钥正确,而不是“黑客”的公钥。

CA证书

CA证书,顾名思义,就是CA颁发的证书。

CA证书的内容包括:电子签证机关的信息、公钥用户信息、公钥、权威机构的签字和有效期等等。证书的格式和验证方法普遍遵循X.509国际标准。

CA存在的证书叫根证书,由于存在根证书信息,所以浏览器可以进行验证服务器提供的CA证书是否为正确的证书,而保障验证服务器的身份。

并不是仅有根证书可以颁发证书,被CA证书验证的证书同样可以颁发证书,由于可以一级一级去追溯验证,所以可以验证其真实性。

在了解keystore之前,首先需要对安卓平台架构有一定的了解,整体可以参考图如下:

安卓平台架构

其具体内容,可以参考官方文档
平台架构 | Android 开发者 | Android Developers

密钥存储技术,由三部分技术组成:keystore、keymaster,以及TEE(Trusted Execution Environment,可信执行环境),它们分别对应本地C/C++库、hal层,以及linux内核。

keystore是密钥与证书的管理系统,为软件提供密钥存储与加密的API。

keystore提供:

密钥管理
对称/非对称加解密
证书管理
其他功能
keystore整个都是利用TEE技术所存在的,当然也存在没有TEE技术的设备,就利用软件虚拟化TEE,个人感觉是并不安全的,因为可以访问、修改到其中的文件。

可以参考官方说法

Android 密钥库系统 | Android 开发者 | Android Developers

https://source.android.google.cn/security/keystore/?hl=zh-cn

大部分的TEE,也是调用的ARM的trustzone技术进行实现。

TA(Trusted Application)是TEE中完成特定功能的应用。

静态库,是程序运行过程中会直接加载,作为程序一部分的文件;而动态库,仅是在程序运行过程中,作为一个接口的存在。

静态库在程序加载完成之后,就不再被程序需要,后缀常常为.a或者.lib;而动态库,需要一直等待文件的请求,一直与程序间存在链接,因此不能在程序运行过程中进行移动或删除,动态库的解耦可以比静态库做的更好,同时也更加灵活,后缀常常为.so或者.dll。

在程序启动过程中,常常被提示“*.dll组件缺失或者找不到”,就是该动态库没有被存储,或者位置不正确,而程序调用了一些常见的系统动态库,就会有以上报错,通常只需要去安装VC++即可解决大部分组件缺失问题。

具体实现代码,可以参考该网页

Windows上Clion C语言调用动态库(静态库)_我是谁??的博客-CSDN博客_clion 静态编译

其具体不同,CLion中细微体现在CMakeLists.txt中

cmake_minimum_required(VERSION 3.22)
project(staticH C)

set(CMAKE_C_STANDARD 99)

link_directories(new_lib)
include_directories(include)

add_executable(staticH main.c)

target_link_libraries(staticH libsharedHello.dll)
# target_link_libraries(staticH libstaticHello.a)

已经对于动态库,需要添加一个环境变量(或许在是系统自带的,或许是编译器虚拟出来的)