在企业安全技术(1):检查平台AESNI支持一文中,笔者介绍了如何检查平台是否支持AESNI指令。对于AES指令的使用,我们需要产生一个随机的Key值,利用这个key值来做相关的数据加解密。按照传统的软件Key产生器而言,Key是通过伪随即数列来产生,这个伪随即数列的种子一般是时间种子。在现在的高速计算机的计算能力,甚至是云计算的出现,让本来很难被破解的Key值变得有很有可能。紧跟行业安全需求,Intel提供了硬件Secure Key产生器,其Key值是通过CPU采集多个管脚数据做为Secure Key的产生熵,管脚数据可以是噪声,可以是某个时间段的数据等。通过这种方式,让产生的随机数会更加的安全和随机。
Secure key是Intel Ive Bridge开始支持的,那么我们如何才能够识别平台是否支持Secure Key呢?一种方式是参看CPU的具体型号,另外一种是通过软件来检测。前一种方法不是很好,对于笔记本、平板电脑等这类设备,你要看到CPU上的标签其实不容易,再者这样做也没有通用性可说。后面一种方式相对比较简单,我们仅仅需要运行一下程序,结果就马上出来了,并且这种检查方法完全可以集成到其他应用中去,就有普遍意义。本篇博客也就以此为目的,看一下如何才能够达到我们的目标。
在Intel® 64 and IA-32 Architectures Software Developer’s Manual中,我们可以在7.3.17章节看到:通过CPUID指令,检查ECX的第30位标记位就能够知道本系统是否支持Secure Key。补充一下,在Intel指令中RDRAND对应的就是Secure Key的产生指令,只要支持此条指令,也就意味着本平台支持Secure Key。
图1
这里我们顺便看一下RDRAND指令的格式,如图2所示,它支持16bit,32bit和64bit,将来开发者会利用这个指令为自己的应用程序产生安全key值。
图2
在ECX中,对应RDRAND的标志位如图3所示,判断RDRAND是否支持可以使用类似于如下的伪代码:(ECX & (1 << 30)) != 0来检查。
图3
还记得在企业安全技术(1):检查平台AESNI支持一文中介绍的两种方法获取ECX的值吗?我们更加推荐使用现有的函数来完成取值工作!对了!就是微软的__cpuid()函数,具体参考企业安全技术(1):检查平台AESNI支持。笔者这里仅仅提供一个Sample code,如下:
int main( void ) { int CPUInfo[4] = { 0, 0, 0, 0 }; int InfoType = 0x01;
//CPUID(); __cpuid( CPUInfo, InfoType );
printf( "ECX: 0x%x\n", CPUInfo[ 2 ] ); if ( CPUInfo[ 2 ] & (1 << 30) ) printf( "RDRAND --- supported\n" );
getchar(); return 0; } |
还不试一下?成功了吗J
参考:
图标图像:
