11 Security Management
11.1 What is Security Management?
安全管理是自适应平台体系结构中的一个功能集群。
作为一个功能集群,安全管理由多个模块组成,这些模块向在Adaptive Platform上共同支持安全应用程序的应用程序提供C++/面向服务的API。
密码栈是安全管理功能集群中的一个模块,它提供C++ API,以支持通过一个AutoSar标准化接口对加密和解密的多个加密算法的构造和使用。密码堆栈C++ API在命名空间ara::crypto中实现。
因此,作为RTA-VRTE库的一部分提供的功能群集代码必须链接到使用加密堆栈的任何应用程序中。
注意:总的来说,RTA-VRTE本版本中的API与AUTOSAR AP18-03规范一致,存在一些偏差,以解决规范中的不一致和/或歧义。
11.2 Encryption/Decryption
加密堆栈支持密钥生成、密钥管理以及基于生成或导入密钥的后续加密和解密。
11.2.1 Key Management
键接口由抽象基类键定义。RTA-VRTE加密堆栈定义了实现由Key定义的接口的子类KeyStruct。
构造函数定义密钥的属性,例如,密钥是用于加密还是用于解密。
KeyStruct key( keyID, // Identifier
KeyUsage::Decrypt, // Usage
KeyProtection::Unprotected, // Protection
keySize, // Size
KeyType::Symmetric, // Type
key_seedval ); // Randomization seed
密钥管理接口由单独的抽象基类KeyManagement定义。
RTA-VRTE加密堆栈接口定义了实现基类定义的接口的子类KeyManagementStruct。接口方法包括生成关键数据的Generate。
KeyManagementStruct key_mgmt;
key_mgmt.Generate(key, NULL);
11.2.2 Cipher
生成密钥后,它可以与密码方法一起使用,根据密钥使用情况进行加密或解密。RTA-VRTE提供流式和基于进程的机制。
流接口提供开始-更新-完成方法,使大量数据能够以任意大小的块进行处理。在调用Start和Finish方法之间,可以根据需要多次调用Update方法来加密/解密可用的新数据。
注意:调用Start方法将根据密钥使用情况初始化管理流接口对象的对象,以进行加密或解密。对于RTA-VRTE,可以但不建议使用单个流接口对象混合加密和解密,但不建议这样做,因为不能保证其可移植性。因此,如果使用单个对象,建议进行顺序处理。
一旦一个密码对象被实例化,就必须使用Start方法对其进行初始化以进行加密或解密;这将传递要使用的密钥和可用于进一步随机加密结果的初始值设定项。
初始化之后,可以调用Update方法来处理数据块,数据块的参数作为对第一个字符的引用传递。
处理完所有数据后,必须调用Finish方法来完成加密并刷新内部缓冲区-这一点很重要,因为加密使用的算法的结果取决于以前的纯文本输入块,因此可能存在要加密的训练数据。
unsigned char encrypted[128];
CipherStruct cipher;
cipher.Start( key, "initializaer" );
cipher.Update( key, *plaintext, 128, *encrypted );
cipher.Finish( key, *encrypted );
RTA-VRTE的此版本使用全局上下文进行加密/解密,因此流接口不可重入。
基于Cipher process的接口提供了一个方法process,该方法允许在一个方法调用中对数据进行加密或解密。
unsigned char* plaintext = "Data to encrypt";
unsigned char encrypted[128];
CipherStruct cipher;
cipher.Process( plaintext, *encrypted, 128, key, "initializaer" );
11.2.3 Symmetric Keys
类密钥和子类KeyStruct都提供了复制构造函数,可用于复制密钥,从而使用(非AUTOSAR)SetUsage API将一个密钥设置为加密,另一个密钥设置为解密。然后,可以将这两个密钥分别分发给发送方和接收方,以启用消息加密和后续解密。
11.2.4 Import Keys
可以首先使用LoadKeystrageProvider函数将密钥加载到加密堆栈中,以获得对密钥存储提供程序的访问权,然后使用ImportPublicObject和LoadKey方法分别导入密钥并从密钥槽中检索密钥。
// Gain access to the key storage mechanism
KeyStorageProvider::Sptr ksp = LoadKeyStorageProvider();
// Import the public key (stored within ’pubKey’) into CryptoProvider
// slotUid - Identifier for slot (so we can find it)
// publicKey - Array containing public key
ReadOnlyMemRegion publicKey(pubKey.begin(),pubKey.end());
cp->ImportPublicObject(slotUid, publicKey,
CryptoObjectType::kPublicKey);
// Find the key storage slot and load the previously imported key from that slot
auto slotNum = ksp->FindSlot(slotUid, crypProviderId);
cp->LoadKey(slotNum);
11.3 Hashing
加密堆栈支持使用哈希生成进行身份验证-单向哈希函数用于从输入数据生成哈希,并与消息本身进行安全通信(使用加密)。由此生成的散列数据或摘要形成可与消息数据本身一起发送的消息数据的签名,并提供认证机制,确保只有经过认证的发送者才能生成该消息。
使用发送者和接收者之间共享的私人信息——“密钥”,散列提供的身份验证可以与加密相结合,以形成一个安全的通信通道,防止传输过程中发生篡改或损坏。
安全通信过程如图11.1所示。
在这里消息的发送者首先使用共享的私有信息和散列函数生成签名。
然后在将加密数据(包括散列)传输到接收器之前,将纯文本消息和生成的散列摘要串联并加密。在接收时,加密的消息数据被解密,接收方使用纯文本、共享的私有信息和与发送方相同的散列算法重新生成散列。
然后,接收方可以比较生成的和接收的哈希值-如果它们匹配,则接收方可以确保消息在传输过程中未被篡改(否则加密数据将被破坏),并且消息来自真实来源(否则两个哈希值将不匹配)。
与加密/解密一样,支持流式和基于进程的哈希生成。
streaming API包含与启用相同的Start-Update-Finish方法,将大量数据散列在任意大小的块中。
#include <ara/crypt/hash.hpp>
HashStruct hash;
std::string data = "Data to hash";
std::string digest;
hash.Start();
hash.Update( data );
hash.Finish( digest );
生成的摘要是单向散列函数的结果,可在加密前附加到消息以启用篡改保护。
基于流程的API生成与流式API相同的摘要,但在单个步骤中生成哈希摘要:
#include <ara/crypt/hash.hpp>
HashStruct hash;
std::string data = "Data to hash";
std::string digest;
hash.Process( data, digest );
11.4 AUTOSAR API
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)