简介
1) 数字签名是指附加在数据单元上的一些数据,或是对数据单元所作的密码变换。这种数据或变换能使数据单元的接收者确认数据单元的来源和数据完整性,并保护数据,防止被人伪造。签名机制的本质特征是该签名只通过签名者的私有信息才能产生,也就是说,一个签名者的签名只能唯一地由他自己产生。当收发双方发生争执时,第三方(仲裁机构)就能够根据消息上的数字签名来裁定这条消息确实由发送方发出,从而实现安全性服务。
2)普通纯软件实现的数字签名方案是完全在操作系统进程中进行的,包括密钥的生成,存储和应用。尽管这样的密钥系统在密钥存储中可能会采用分层加密的方式以提高用户密钥的私密性。
3)现有的可用于数字签名的安全方案如加密机,TPM等一般都采用物理隔离,即采用额外的硬件来使数字签名系统与操作系统分离。TPM作为信息计算平台的核心安全控制和运算部件,它的工作要先于操作系统和BIOS,不可能使用计算机的内存外存和处理器,因此必须内部实现一些公开的安全算法,以便与其它部件的接口标准化,提供内部一些安全操作中的密码运算。
4)除了TPM这类比较简单的单片机加载装置以外,也有像加密机这样比较复杂,可以被多台计算机共享的加密装置,如加密机。
加密机是一个基于安全的操作系统平台,具有高级通信保密性、完整性保护功能的控制系统。它是专用软、硬件设备,可具有多个网络接口,可安装于内联网各区域网出口处。它是专用软硬件设备,可具有多个网络接口,可安装于内联网各局域网出口处,或安装于内联网与公共网络接口处,或集成于网络防火墙中,提供网络边界之间的加密,认证功能。
使用场景
BIOS更新固件
1、BIOS生成固件,在BIOS的某一块区域存储验签证书。
2、更新固件时,先检验该区域中的证书是否一致,如果一致就能刷flash,不一致则弹出证书验证失败。保证其它平台的固件不能互刷。
typedef struct _KL_VERIFY_BIOS_PROTOCOL{
VERIFY_BIOS_CHECK_BIOS_VERSION CheckBiosVersion;
VERIFY_BIOS_CERT_SIGN_BY_PSS_PADDING VerifyBiosCertSignByPssPadding;
VERIFY_BIOS_CERT_SIGN_BY_PKCS1 VerifyBiosCertSignByPkcs1;
} KL_VERIFY_BIOS_PROTOCOL;
RetValue = VerifyBiosProtocol->VerifyBiosCertSignByPssPadding (
(CONST UINT8 *)BiosSubCert, BiosSubCertSize,
BiosSignData, BiosSignDataSize,
SignImageBuffer, (UINT32)FileSize,
(CONST UINT8 *)BiosCaCert, BiosCaCertSize);
if (!RetValue) {
DEBUG((EFI_D_ERROR, "Verify Bios Cert Fail 1,Line:%d \n",__LINE__));
PrintHelpMessage(PRINT_VERIFY_ERR_MESSAGE);
gBS->Stall(3000000);
Status = EFI_SECURITY_VIOLATION;
//goto Done;
}
安全启动功能
1、安全启动是电脑行业成员开发的一种安全标准,用于帮助确保设备仅使用受原始设备制造商 (OEM) 信任的软件进行启动。 当电脑启动时,固件会检查每个启动软件片段的签名,包括 UEFI 固件驱动程序(也称为选项 ROM)、EFI 应用程序和操作系统。 如果签名有效,则电脑将会启动,而固件会将控制权转递给操作系统。 每类操作系统,如麒麟,UOS都有自己的证书,当安全启动功能被打开后,有该证书的固件成功进入系统。
2、大多数情况下,操作系统都是存放在本地存储器上的,例如本地的硬盘。UEFI引导管理器首先验证操作系统加载器的签名,如果通过,就将权限移交。在获得控制权后,加载器将加载os,并在此过程中的某一时刻调用 ExitBootServices() 。该调用结束后,只有UEFI运行时服务仍然可用。
/**
This code checks if the file content complies with EFI_VARIABLE_AUTHENTICATION_2 format
The function reads file content but won't open/close given FileHandle.
@param[in] FileHandle The FileHandle to be checked
@retval TRUE The content is EFI_VARIABLE_AUTHENTICATION_2 format.
@retval FALSE The content is NOT a EFI_VARIABLE_AUTHENTICATION_2 format.
**/
BOOLEAN
IsAuthentication2Format (
IN EFI_FILE_HANDLE FileHandle
)
{
EFI_STATUS Status;
EFI_VARIABLE_AUTHENTICATION_2 *Auth2;
BOOLEAN IsAuth2Format;
IsAuth2Format = FALSE;
//
// Read the whole file content
//
Status = ReadFileContent(
FileHandle,
(VOID **) &mImageBase,
&mImageSize,
0
);
if (EFI_ERROR (Status)) {
goto ON_EXIT;
}
Auth2 = (EFI_VARIABLE_AUTHENTICATION_2 *)mImageBase;
if (Auth2->AuthInfo.Hdr.wCertificateType != WIN_CERT_TYPE_EFI_GUID) {
goto ON_EXIT;
}
if (CompareGuid(&gEfiCertPkcs7Guid, &Auth2->AuthInfo.CertType)) {
IsAuth2Format = TRUE;
}
ON_EXIT:
//
// Do not close File. simply check file content
//
if (mImageBase != NULL) {
FreePool (mImageBase);
mImageBase = NULL;
}
return IsAuth2Format;
}
TPM完整性存储
1、Tcg安全服务建立在一个完整的引导保护序列,刚开机时,首先是BIOS取得控制权,BIOS系统将建立一个基本的I/O系统并初始化一些硬件。
2、引导程序开始于一个被称为CRTM(信任根,CORE Root of Trust for Measurement),按顺序引导其它硬件,TPM正是用来存储这些记录值,这些信息被存储到平台 配置存储器(PCR)中。通过检查PCR中的值,就可以判断这些值是否对应着可信的程序。
3、当一个使用者通过因特网连接一个远程计算机时,如何才能确信其所得TPM的PCR值就是当前远程计算机的系统启动顺序列值呢?
1)系统中采用一个nonce询问机制后,就能获得当前PCR值的签名集。Nonce 是作为质询发给对方的一串毫无意义的字符串或者随机数。通过在签名的返回值中加入nonce,对方就能知道得到的签名是新的。
2)TPM有一对由TPM内部产生的唯一背书密钥,这些密钥为身份标识,其主要作用是:为其他不可迁移的密钥创建认证证书,对PCR进行签名,以证明PCR的值是正确且是当前的值。
TCG_DXE_DATA mTcgDxeData = {
{
sizeof (EFI_TCG2_BOOT_SERVICE_CAPABILITY), // Size
{ 1, 1 }, // StructureVersion
{ 1, 1 }, // ProtocolVersion
EFI_TCG2_BOOT_HASH_ALG_SHA1, // HashAlgorithmBitmap
EFI_TCG2_EVENT_LOG_FORMAT_TCG_1_2, // SupportedEventLogs
TRUE, // TPMPresentFlag
TCG2_DEFAULT_MAX_COMMAND_SIZE, // MaxCommandSize
TCG2_DEFAULT_MAX_RESPONSE_SIZE, // MaxResponseSize
0, // ManufacturerID
0, // NumberOfPCRBanks
0, // ActivePcrBanks
},
};