feat(restore): 还原前校验备份 SHA-256,拒绝损坏/被篡改的备份 (#75)

恢复路径在解密/解压前比对下载对象的 SHA-256(与备份记录一致),不匹配即中止还原且不触碰源数据;早期无 checksum 的备份跳过(向后兼容)。新增单元+集成测试。
This commit is contained in:
Wu Qing
2026-05-27 00:27:41 +08:00
committed by GitHub
parent 0f30e7bf52
commit 45bc210313
4 changed files with 183 additions and 0 deletions
@@ -260,6 +260,17 @@ func (s *RestoreService) executeLocally(ctx context.Context, restoreID uint, tas
logger.Errorf("写入恢复文件失败:%v", writeErr)
return
}
// 完整性校验:在解密/解压前比对下载对象的 SHA-256,拒绝还原损坏或被篡改的备份。
// 早期未记录 checksum 的备份会跳过(向后兼容)。
if backupRecord.Checksum != "" {
logger.Infof("校验备份完整性(SHA-256")
if csErr := verifyArtifactChecksum(artifactPath, backupRecord.Checksum); csErr != nil {
errMessage = csErr.Error()
logger.Errorf("完整性校验失败:%v", csErr)
return
}
logger.Infof("完整性校验通过")
}
preparedPath, prepareErr := s.prepareArtifact(artifactPath, logger)
if prepareErr != nil {
errMessage = prepareErr.Error()