|(hag与固件build_id为1877及以上版本支持) 用户在使用TKM设备中,有将一台设备所有内部密钥备份恢复到另一台设备的需求,这里共提供三种场景供用户参考。 #### 3.10.1 备份恢复场景一:同一CPU备份与恢复 **场景说明:** 该场景通过使用CPU内唯一机密信息派生密钥,由该密钥对内部密钥进行加密及完整性保护,从而支持将设备内所有内部密钥备份,且仅支持在该设备内恢复,其他设备由于CPU内唯一机密信息不同,派生出来的密钥也将不同,因此将无法通过该密钥镜像进行恢复,如下图所示为一个基本的过程。这里在密钥恢复成功后做了一个简单的测试来验证密钥被成功恢复,即指定机器原密钥加密一段数据,使用机器恢复后的密钥解密,通过对比明文与解密后的明文是否一致即可进一步验证密钥备份恢复的正确性。   ![[Image.jpg]] **操作过程说明:** (1)在机器中生成待备份密钥,这里以类型为sm4索引为666号密钥为例,然后使用该密钥对一段数据明文进行加密; ``` $ sudo hag tkm intl_key_gen -type sm4 -idx 666 -auth intl.auth $ sudo hag tkm sm4 -handle 0x200029a -auth intl.auth -iv iv.data -in data64.plain -out enc_data.bin -e -m ecb -p pkcs7 ``` 命令正确执行的结果如下图: ![[Image 1.jpg]] (2)调用密钥备份接口对上一步生成的sm4密钥进行备份,备份成功后,将上一步生成的sm4密钥销毁; ``` $ sudo hag tkm key_backup -auth sys.auth -scheme same_cpu -outfile key_same_cpu.bin $ sudo hag tkm key_destroy -handle 0x200029a -auth intl.auth ``` 命令正确执行的结果如下图: ![[Image 2.jpg]] (3)调用密钥恢复接口对密钥进行恢复,密钥恢复成功后,使用被恢复的sm4密钥解密备份前的数据密文,得到解密明文;将解密明文与数据明文对比,若一致表示恢复正常,否则恢复密钥异常; ``` $ sudo hag tkm key_restore -auth sys.auth -scheme same_cpu -infile key_same_cpu.bin $ sudo hag tkm sm4 -handle 0x200029a -auth intl.auth -iv iv.data -in enc_data.bin -out dec_data.bin -d -m ecb -p pkcs7 $ sudo cmp -b data64.plain dec_data.bin && echo $? ``` 命令正确执行的结果如下图: ![[Image 3.jpg]] (4)清理测试环境。 ``` $ sudo rm -rf enc_data.bin dec_data.bin key_same_cpu.bin $ sudo hag tkm key_destroy -handle 0x200029a -auth intl.auth ``` 命令正确执行的结果如下图: ![[Image 4.jpg]] #### 3.10.2 备份恢复场景二:同一代CPU备份与恢复 **场景说明:** 该场景通过使用同一代CPU相同的密钥,由该密钥对内部密钥进行加密及完整性保护,从而支持将设备S内所有内部密钥备份,且在同一代的CPU的D设备内恢复,如下图所示为一个基本的过程。这里在密钥备份恢复成功后做了一个简单的测试来验证密钥被成功在另一台设备恢复,即指定机器S原密钥加密一段数据,使用机器D恢复后的密钥解密,通过对比明文与解密后的明文是否一致即可进一步验证密钥恢复的正确性。 ![[Image 5.jpg]]  **操作过程说明:** (1)在机器S中生成待备份密钥,这里以类型为sm4索引为666号密钥为例,然后使用该密钥对一段数据明文进行加密,加密成功后,调用备份接口对机器S密钥进行备份,并将加密数据密文、备份密钥文件传递给机器D用于恢复验证; ``` $ sudo hag tkm intl_key_gen -type sm4 -idx 666 -auth intl.auth $ sudo hag tkm sm4 -handle 0x200029a -auth intl.auth -iv iv.data -in data64.plain -out enc_data.bin -e -m ecb -p pkcs7 $ sudo hag tkm key_backup -auth sys.auth -scheme same_gen -outfile key_same_gen.bin ``` 命令正确执行的结果如下图: ![[Image 6.jpg]] (2)机器D使用从机器S获取的备份密钥文件调用恢复接口进行恢复,并使用恢复后的密钥解密从机器S收到的数据密文,得到解密明文;将解密明文与数据明文对比,若一致表示恢复正常,否则恢复密钥异常; ``` $ sudo hag tkm key_restore -auth sys.auth -scheme same_gen -infile key_same_gen.bin $ sudo hag tkm sm4 -handle 0x200029a -auth intl.auth -iv iv.data -in enc_data.bin -out dec_data.bin -d -m ecb -p pkcs7 $ sudo cmp -b data64.plain dec_data.bin && echo $? ``` 命令正确执行的结果如下图: ![[Image 7.jpg]] (3)机器S与机器D清理测试环境。 机器S清理: ``` $ sudo rm -rf enc_data.bin key_same_gen.bin $ sudo hag tkm key_destroy -handle 0x200029a -auth intl.auth ``` 命令正确执行的结果如下图: ![[Image 8.jpg]] 机器D清理: ``` $ sudo rm -rf dec_data.bin enc_data.bin key_same_gen.bin $ sudo hag tkm key_destroy -handle 0x200029a -auth intl.auth ``` 命令正确执行的结果如下图: ![[Image 9.jpg]] #### 3.10.3 备份恢复场景三:设备证书方式备份与恢复 **场景说明:** 该场景通过使用TKM设备证书,由恢复机器D将自己证书链提供给机器S,机器S首先对其进行证书链验证,验证通过后使用其TKM设备证书中的公钥在设备内通过密钥协商方式生成密钥,并将协商共享数据导出供后续机器D使用,之后使用该生成密钥对内部密钥进行加密及完整性保护,从而支持将设备S内所有内部密钥备份;在机器D恢复时,设备将会首先使用自己的设备私钥以及S传递的共享数据计算出协商密钥,之后该协商密钥对备份的密钥文件进行解密恢复,如下图所示为一个基本的过程。这里在密钥备份恢复成功后做了一个简单的测试来验证密钥被成功在另一台设备恢复,即指定机器S原密钥加密一段数据,使用机器D恢复后的密钥解密,通过对比明文与解密后的明文是否一致即可进一步验证密钥恢复的正确性。 ![[Image 10.jpg]] **操作过程说明:** (1)机器D首先获取自己的证书链文件,并将自身证书链文件提供给机器S; ``` $ sudo hag tkm cert_chain_get -cert_type sign -outfile certchain.bin ``` 命令正确执行的结果如下图: ![[Image 11.jpg]] (2)在机器S中生成待备份密钥,这里以类型为sm4索引为666号密钥为例,然后使用该密钥对一段数据明文进行加密,加密成功后,调用备份接口对机器S密钥进行备份,并将加密数据密文、备份密钥文件、共享数据文件传递给机器D用于恢复验证; ``` $ sudo hag tkm intl_key_gen -type sm4 -idx 666 -auth intl.auth $ sudo hag tkm sm4 -handle 0x200029a -auth intl.auth -iv iv.data -in data64.plain -out enc_data.bin -e -m ecb -p pkcs7 $ sudo hag tkm key_backup -auth sys.auth -scheme dev_cert -outfile key_dev_cert.bin -cert certchain.bin -sharedfile shared_data.bin ``` 命令正确执行的结果如下图: ![[Image 12.jpg]] (3)机器D使用从机器S获取的备份密钥文件、共享数据文件调用恢复接口进行密钥恢复,并使用恢复后的密钥解密从机器S收到的数据密文,得到解密明文;将解密明文与数据明文对比,若一致表示恢复正常,否则恢复密钥异常; ``` $ sudo hag tkm key_restore -auth sys.auth -scheme dev_cert -infile key_dev_cert.bin -sharedfile shared_data.bin $ sudo hag tkm sm4 -handle 0x200029a -auth intl.auth -iv iv.data -in enc_data.bin -out dec_data.bin -d -m ecb -p pkcs7 $ sudo cmp -b data64.plain dec_data.bin && echo $? ``` 命令正确执行的结果如下图: ![[Image 13.jpg]] (4)机器S与机器D清理测试环境 机器S清理: ``` $ sudo rm -rf enc_data.bin shared_data.bin key_dev_cert.bin $ sudo hag tkm key_destroy -handle 0x200029a -auth intl.auth ``` 命令正确执行的结果如下图: ![[Image 14.jpg]] 机器D清理: ``` $ sudo rm -rf key_dev_cert.bin shared_data.bin dec_data.bin enc_data.bin $ sudo hag tkm key_destroy -handle 0x200029a -auth intl.auth ``` 命令正确执行的结果如下图: ![[Image 15.jpg]] ### 3.11.环境清理 清理公共部分初始化的数据 ``` $ sudo rm -rf intl.auth intl2.auth apk.auth iv.data data32.plain data64.plain sys.auth ```