基于寄存器的密钥安全方案
原理
确保密钥数据只以明文形态储存在cpu寄存器上
安全目标
1.密钥长期储存寄存器
- 特权资源,不被用户态访问;
- 除加解密任务外不访问该寄存器
2.密钥初始化
3.加解密计算过程
安全性分析
基于寄存器的对称密码算法实现采用多重安全措施,有效抵御冷启动攻击,将密钥长期存储在特权寄存器中,并通过原子操作、系统补丁等手段避免泄露到内存。方案防范只读DMA攻击,但对于读写DMA和内核态软件攻击存在一定潜在风险,同时通过无密钥相关跳转提高了对侧信道攻击的防御。
基于寄存器的公钥密码算法实现方案
1)初始化:进行口令派生算法计算 AES 主密,并将AES 主密钥安全存储在特权寄存器中。
2)RSA 私钥解密:在从内存中接收到 RSA 计算请求时,从外部读取加密的 RSA 密钥在 CPU 中将RSA私行解密,并将明文形态的 RSA私钥临时存放在寄存器上。
3)RSA计算:在通用寄存器上完成 RSA 计算过程。
难点:仅用寄存器完成涉及大量中间变量的RSA计算
1.全寄存器
- Montgomery乘法
2.寄存器 + 内存加密
- 加密内存空间的构建
- Montgomery乘法实现
- 模幂实现
- RSA实现
基于寄存器的密钥安全方案对比
基于Cache的密钥安全方案
原理
利用Cache代替内存进行计算和储存(Cache As RAM),确保敏感数据只以明文形态出现在寄存器和Cache中
密钥架构步骤
- 1.从用户输入的口令中导出主密钥并复制到每个 CPU 核的调试寄存器中。
- 2.从硬盘将加密的私钥读入内存。
- 3.需要进行私钥操作时,将主密钥从调试寄存器中载入 Cache。
- 4.加密的私钥被载入 Cache。
- 5.私钥被主密钥解密来进行密码计算。
- 6.如果在签名时需要 DRBG(随机数发生器),那么DRBG种子先被解密,再生成随机比特,并更新DRBG 内部状态。随后敏感信息被擦除。
基于Cache的安全计算环境构建
- 1.从被TRESOR机制保护的调试寄存器载人主密钥。
- 2.由AES主密钥初始化AES 计算上下文。
- 3.加密的私钥被主密钥解密。
- 4.使用私钥构造私钥上下文。
- 5.进行所请求的私钥操作,其中,在计算 ECDSA时,DRBG子需要被解密来生成随机比特,然后更新。
- 6.输出被写回内存
系统实现
CAR技术实现
1.执行保护环境
struct CACHE CRYPTO ENV{
unsigned char masterKey[128/8];
AES CONTEXT aes;
union {
RSA rsaCtx;
ECDSA{
ECDSA KEY ecdsaKey;
unsigned char mallocBuffer[DMEM SIZE];
} ecdsaCtx;
}pkcontext;
DRBG drbg;
PRECOMPUTATION TABLE table;
unsigned char CacheStack[CSTACK SIZE];
unsigned long privKeyId;
unsigned char input[MAX IN LENGTH];
unsigned char output[MAX OUT LENGTH];
}CacheCryptoEnv;
2.L1 D-Cache使用
计算过程中,保证整个CacheCryptoEnvironment都在L1 D-Cache中。
3.栈切换
4.原子性
- 调用preempt_disable()禁止内核抢占
- 调用local_irq_save()关闭可屏蔽中断,阻止上下文切换发生
5.对SMP支持
密码算法实现
- RSA
- DRBG
- ECDSA
用户接口
通过ioctl系统调用请求服务
- 1.获取私钥的数量。
- 2.根据密钥唯一标识符(privateKeyId)指定的密对做私运算。
- 3.根据密钥对来获取公信息,包括算法标识符和公钥