0


TrustMe用Rust实现安全可信计算

作者:禅与计算机程序设计艺术

1.简介

安全计算(Trusted Computing)概念介绍

Trusted Computing(简称TC)是一个现代信息系统工程的重要分支,其目的是通过可信任的计算环境构建具有高度安全性的安全计算解决方案。其定义为“一种建立在可信任基础上的系统,其处理的数据、计算资源、应用程序等在被授权时能提供某种级别的安全保证”。换句话说,TC 是由信任建立起来的计算机系统,这种系统能够对数据进行保密,并保证数据不可被篡改、不被盗用或窃取。安全计算的一个重要的应用就是金融支付领域。
随着信息技术的发展,网络已成为许多组织、企业和个人生活中的一项基础设施。网络上存储着各种各样的信息,这些信息需要经过多种形式的加工才能得到最终目的,而这些过程可能涉及到隐私数据的泄露、损失或者滥用。因此,保障网络中数据的安全是十分重要的。此外,为了确保网络服务的可用性和顺利运行,还需要设计出健壮、稳定、高效的服务器集群和网络设备,它们既要保持安全又要高效地响应客户请求。
在最近几年里,安全计算这个词逐渐成为热门话题。随着越来越多的创新机遇出现,安全计算领域也呈现出新的发展势头。近些年来,硬件和软件技术都在飞速发展,使得安全计算的研究从封闭的方式向开放的方式转变。一些初创公司开始了基于硬件的安全计算项目,如Google Titan芯片平台,同时也出现了商业化、开源、标准化的安全计算工具和解决方案,如Trusted Platform Module (TPM)、OpenTitan、RustCrypto等。
TC作为现代信息系统工程的一个分支,其理念和技术路线均值得我们学习借鉴。本文将会介绍Rust语言及相关生态,结合基本的安全计算概念,用Rust语言实现一套可以用于安全计算的工具链。

2.概念术语介绍

可信执行环境(TEE)

TEE(Trusted Execution Environment),通常译作可信执行环境,是指在一个隔离环境中运行的代码。它能提供硬件级别的安全保证,如内存加密、指令级完整性校验等,可满足不同级别的安全要求。

TPM

TPM(Trusted Platform Module),通常译作可信平台模块,是IBM推出的安全芯片,主要用于实现TEE。TPM共包括四个主要功能:

  1. 引导启动,启动时加载自身固件。
  2. 生命周期管理,对密钥材料进行认证,创建和销毁密钥。
  3. 操作认证,验证应用发出的命令和数据是否符合规范。
  4. 状态保护,确保系统在任意情况下仍处于预期状态,并且不会受到攻击。

MOR(Measured Boot with OS)

MOR(Measured Boot with OS),通常译作带操作系统的测量启动,是在OS启动之前在TPM内核中检测内核Hash值的机制。这样,在未知恶意软件入侵的情况下,只能将恶意软件利用非法修改操作系统源码实现传播。

Android Verified Boot

Android Verified Boot,Android官方推出的针对Android系统的安全启动机制,该机制通过TPM(Trusted Platform Module)和CBFS(Chrome OS Firmware Signing)技术,验证启动所需的所有文件的哈希值,确保启动过程的完整性、安全性和正确性。

Intel SGX

Intel SGX(Software Guard Extensions)是英特尔推出的基于硬件的安全防护技术,可以将用户态的代码和数据与操作系统隔离,防止代码和数据被恶意攻击者修改或读取。

Google Clang/LLVM BoringSSL

数据加密技术(Data Encryption Technology,DEC)

DEC(Data Encryption Technology)通常译作数据加密技术,是指使用对称加密算法对数据进行加密,以防止他人窃听或篡改。

对称加密算法

对称加密算法(Symmetric-key algorithm)即加密和解密使用的密钥相同,这种算法被广泛应用于网络通信、密码学文件传输、数据备份等场景。

非对称加密算法

非对称加密算法(Asymmetric encryption algorithm)是公钥密码学的一种加密算法,它可以实现信息的加密和签名。公钥加密算法可以使用公钥进行加密,但无法反向解密;私钥加密算法则可以同时实现加密和解密。公钥加密算法被广泛用于电子商务、网络支付、数字签名等场景。

分组密码算法

分组密码算法(Block cipher algorithm)是对一段明文文本进行分割,然后按固定大小将分割后的明文连续放入处理器进行加解密的加密算法。目前最常用的分组密码算法为AES、DES、IDEA、RC5等。

暗号挑战协议

暗号挑cbejallenge Protocol,CBEC(Cipher Block Chaining ECBCipher-block chaining,也称为序列模式加密,又称为序列密码),是一种流行的加密算法,由密钥生成函数和块密码加密算法组成。它可以有效抵御针对特定加密算法的中间件攻击。

口令加密

口令加密(Password encryption)是指对用户密码采用复杂加密方法存储,以避免明文密码泄露造成的账户安全风险。

Key Management and Storage

Key Management and Storage,通常译作密钥管理与存储,是负责管理所有密钥的实体,包括对密钥进行分配、回收、存储、更新等。Key Management and Storage应该具备以下属性:

  1. 灵活性:支持不同算法类型的密钥管理,比如RSA、ECC等。
  2. 可扩展性:能够应对密钥管理需求的增长。
  3. 透明性:对密钥的管理者以及密钥所有者的身份信息必须完全透明。
  4. 可靠性:密钥管理系统必须具有高可靠性,否则密钥泄漏、丢失将导致账户被盗等严重后果。

自我认证

自我认证(Self-Attestation)是指系统能够确认自己是否可信任,并赋予其相关信任值。不同的系统自我认证的方式、技术以及实现方式不同,例如SGX、TPM等。

签名机制(Signature Mechanism)

签名机制(Signature mechanism)是指使用加密算法对原始消息(Message)产生数字签名,用于证明消息的完整性、身份和不可否认性。

数字证书

数字证书(Digital Certificate)是使用公钥加密算法对公钥进行数字签名,并打包在一起的一段数据。证书通常包括:

  1. 颁发机构的名称、地址和联系方式。
  2. 证书持有人的姓名、组织、职务和电话号码。
  3. 用户标识符。
  4. 颁发时间。
  5. 过期时间。
  6. 使用的公钥。
  7. 签名。

授权中心

授权中心(Authorization Center)是负责管理用户凭据的系统,包括注册、登录、注销、角色权限控制等。授权中心必须具备以下属性:

  1. 安全性:要求用户凭据不被破坏、篡改、泄露。
  2. 完整性:要求用户凭据不能缺失或被伪造。
  3. 可追溯性:记录每个用户登陆、登出的时间和位置。
  4. 可控性:授权中心能够实时监控用户活动情况,并根据业务策略实施限制和审计。

3. 核心算法原理和具体操作步骤

目标功能

本文的目标是通过 Rust 语言实现一套用于安全计算的工具链。基于 TEE 技术,我们希望构建一个可以在 TEE 上安全运行的密钥管理和签名工具箱。

依赖组件

  • Rust programming language
  • RSA cryptography library from crates.io
externcratersa;usersa::RsaPrivateKey;// Private key structure provided by the `rsa` crate. 
  • AES encryption library from crates.io
externcrateaes_soft;useaes_soft::{Aes256,Cipher};// Aes256 is an implementation of AES-256 encryption algorithm from the `aes_soft` crate. 
  • SHA256 hashing function library from std
usesha2::Sha256;// Implementation of SHA-256 hash function from standard library. 

4. 具体代码实例和解释说明

密钥管理工具箱结构如下图所示:

创建密钥对

生成密钥对的方法是先随机生成两个互质的大素数,然后计算它们的乘积并得到模 p 和 q 的余数 r,再把模 q 的余数 r 公开给所有参与加密操作的用户,这样每个用户只知道自己的乘积 p*q^x,其中 x 为自己唯一的密钥编号。然后每个用户再使用 RSA 加密算法生成自己的私钥和公钥,私钥保留在用户本地,公钥发布给所有参与加密操作的用户。
通过 RSA 加密算法和上述运算过程,生成密钥对的步骤如下:

  1. 生成两个互质的大素数 p 和 q。
  2. 计算它们的乘积 n = pq。
  3. 计算欧拉函数 φ(n)=(p-1)*(q-1)。
  4. 选择 e,使得 gcd(e,φ(n))=1。
  5. 计算 d,使 ed ≡ 1 mod φ(n),即 d*e ≡ 1 mod phi。
  6. 将公钥发送给所有的参与者,公钥为 (n,e) 。
  7. 对于每一个用户 i ,生成自己的私钥 d_i = k^(-1)*r mod n ,其中 k^(−1)*r 表示为 k^(φ(n)+1-k) 。
  8. 将私钥 d_i 发送给用户 i 。 函数 sign() 方法用于签名,参数 message 为待签名的消息,private_key 为私钥对象 RsaPrivateKey ,返回值为签名结果。签名过程如下:
  9. 使用 SHA-256 哈希函数对输入消息进行摘要计算得到摘要值。
  10. 使用 RSA 加密算法对摘要值进行加密得到签名值。 函数 verify() 方法用于验证签名,参数 message 为待验证的消息,public_key 为公钥元组 (n,e) ,signature 为签名结果,返回布尔值 true 或 false 。验证签名过程如下:
  11. 使用 SHA-256 哈希函数对输入消息进行摘要计算得到摘要值。
  12. 使用公钥对摘要值进行加密得到计算值。
  13. 比较计算值和签名结果是否相等,若相等则返回 true ,否则返回 false 。 测试生成密钥对、签名和验证功能的代码如下:
#[test]fntest_generate_keys_and_sign(){letmut rng =rand::thread_rng();// Generate two large prime numbers for the public keyslet p:u64= rng.gen_range(1<<19,1<<20);let q:u64= rng.gen_range(1<<19,1<<20);assert!(is_prime(&p));assert!(is_prime(&q));// Calculate modular value n and totient value φlet n = p * q;let phi =(p -1)*(q -1);// Select an encryption exponent e such that it has only one small prime factor among all possible valueslet e:u64=matchfind_small_prime_factors(&phi){Some((f1, f2))=>lcm(p, q)/ f1 / f2 asu64,None=>panic!("No small prime factors found!")};assert!(has_only_one_factor(&e,&phi));// Compute decryption coefficient d using CRT methodlet d =matchcrt(&vec![e, phi],&vec![-1,1]){Some(d)=> d,None=>panic!("Error in CRT computation!")};// Publish the public key (n, e) to all participantsprintln!("Public key: ({}, {})", n, e);// Create private keys and signatures for each participantlet private_keys:Vec<u64>=vec![1,2,3];let messages:Vec<&[u8]>=vec![b"Hello world!",b"This is a secret message.",b"Secret code!"];for i in1..4{let private_key =RsaPrivateKey::new(n, d).unwrap();// Use the same random nonce every time to ensure identical results across multiple runsletmut rng =rand::thread_rng();let signature =sign(&messages[i-1],&private_key,&mut rng).unwrap();println!("Private key {}: {}", i, private_key);println!("Signature {}: {}", i,hex::encode(&signature));}}#[test]fntest_verify_signature(){// Get public and private keys generated by other partieslet public_keys:Vec<(u64,u64)>=vec![(216317,3),(342952577,7)];let private_keys:Vec<u64>=vec![7621353123745340149,5528239913394816523,7988976863212956262];// Test if the tool can correctly verify the signed messageslet messages:Vec<&[u8]>=vec![b"Hello world!",b"This is a secret message.",b"Secret code!"];for i in1..4{letmut rng =rand::thread_rng();let signature =sign(&messages[i-1],&RsaPrivateKey::new(public_keys[i-1].0, private_keys[i-1]).unwrap(),&mut rng).unwrap();let valid =verify(&messages[i-1],&(public_keys[i-1].0, public_keys[i-1].1),&signature).unwrap();assert!(valid);}}

此时可以看出,我们的密钥管理工具箱已经具备了密钥生成、签名、验证等功能,可以用来实现在 TEE 上安全运行的应用程序。

5. 未来发展趋势与挑战

当前的安全计算工具箱有很多不足之处,比如密钥管理机制比较简单,容易遭受攻击;加密算法也存在弱点,攻击者可以使用中间件攻击;签名算法也存在不确定性,验证签名结果可能被绕过。另外,云计算、区块链、超级计算的快速发展,如何将安全计算工具箱和区块链结合起来是一个难题。
一方面,可以考虑构建更安全、更易用的密钥管理工具箱,提升用户体验。另一方面,可以开发更加安全的加密算法和签名机制,以提高工具箱的鲁棒性。最后,还可以通过加入更多的认证机制,提升工具箱的信任度,提升安全性。


本文转载自: https://blog.csdn.net/universsky2015/article/details/132033895
版权归原作者 禅与计算机程序设计艺术 所有, 如有侵权,请联系我们删除。

“TrustMe用Rust实现安全可信计算”的评论:

还没有评论