Skip to content
Toggle navigation
Toggle navigation
This project
Loading...
Sign in
csbr-daop
/
fe-data-trusted-space
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Network
Create a new issue
Builds
Commits
Issue Boards
Files
Commits
Network
Compare
Branches
Tags
16852fd6
authored
2026-06-24 09:44:00 +0800
by
lihua
Browse Files
Options
Browse Files
Tag
Download
Email Patches
Plain Diff
修改匿名化报告
1 parent
78bc58ff
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
119 additions
and
92 deletions
src/api/modules/dataAnonymization.ts
src/views/data_anonymization/anonResultReportView.vue
src/views/data_anonymization/anonTaskCreate.vue
src/views/data_anonymization/components/anonResultAnalysis.vue
src/api/modules/dataAnonymization.ts
View file @
16852fd
...
...
@@ -352,6 +352,13 @@ export const htmlToWord = (params) => request({
responseType
:
'blob'
})
export
const
downloadAnonReport
=
(
params
)
=>
request
({
url
:
`
${
import
.
meta
.
env
.
VITE_APP_ANONYMIZATION_BASEURL
}
/anon-task/download`
,
method
:
'postJsonD'
,
data
:
params
,
responseType
:
'blob'
})
/** 发送评测报告到邮箱 */
export
const
sendAnonReport
=
(
params
)
=>
request
({
url
:
`
${
import
.
meta
.
env
.
VITE_APP_DIGITAL_CONTRACT_URL
}
/anon-task/send-mail-and-msg`
,
...
...
src/views/data_anonymization/anonResultReportView.vue
View file @
16852fd
...
...
@@ -4,6 +4,7 @@
<
script
lang=
"ts"
setup
name=
"anonResultReportView"
>
import
{
downloadAnonReport
,
getAnonAnalyzePageData
,
getAnonAnalyzeResult
,
getAnonTaskDetail
,
...
...
@@ -16,11 +17,14 @@ import anonResultAnalysis from './components/anonResultAnalysis.vue';
import
{
commonPageConfig
,
USERROLE
}
from
'@/utils/enum'
;
import
{
calcColumnWidth
}
from
'@/utils'
;
import
html2canvas
from
'html2canvas'
;
import
useUserStore
from
"@/store/modules/user"
;
const
route
=
useRoute
();
const
router
=
useRouter
();
const
fullPath
=
route
.
fullPath
;
const
taskGuid
=
ref
(
route
.
query
.
guid
);
const
userStore
=
useUserStore
();
const
userData
=
JSON
.
parse
(
userStore
.
userData
)
const
{
proxy
}
=
getCurrentInstance
()
as
any
;
const
resultDataLoading
=
ref
(
false
);
...
...
@@ -209,7 +213,7 @@ const downloadWord = () => {
loadingText
.
value
=
`评测报告正在
${
route
.
query
.
dataOwner
==
'1'
?
'发送'
:
'下载'
}
中,请勿关闭浏览器...`
;
downPromise
.
value
=
convertHtml2Img
(
report
,
dom
).
then
(()
=>
{
if
(
route
.
query
.
dataOwner
==
'1'
)
{
sendAnonReport
({
taskGuid
:
taskGuid
.
value
,
html
:
encodeURIComponent
(
`<div>
${
getHTML
(
dom
.
innerHTML
)}
</div>`
)
}).
then
((
res
:
any
)
=>
{
sendAnonReport
({
taskGuid
:
taskGuid
.
value
,
title
:
`
${
analysisResultInfo
.
value
.
tenantName
}
持有的“
${
oldAnonTaskValueInfo
.
value
.
taskName
}
”`
,
evaluationDate
:
analysisResultInfo
.
value
.
execTime
,
deIdentProcessorName
:
userData
.
tenantName
,
html
:
encodeURIComponent
(
`<div>
${
getHTML
(
dom
.
innerHTML
)}
</div>`
)
}).
then
((
res
:
any
)
=>
{
downPromise
.
value
=
null
loadingText
.
value
=
''
;
resultDataLoading
.
value
=
false
;
...
...
@@ -220,7 +224,7 @@ const downloadWord = () => {
}
})
}
else
{
htmlToWord
({
html
:
encodeURIComponent
(
`<div>
${
getHTML
(
dom
.
innerHTML
)}
</div>`
)
}).
then
((
res
:
any
)
=>
{
downloadAnonReport
({
taskGuid
:
taskGuid
.
value
,
title
:
`
${
analysisResultInfo
.
value
.
tenantName
}
持有的“
${
oldAnonTaskValueInfo
.
value
.
taskName
}
”`
,
evaluationDate
:
analysisResultInfo
.
value
.
execTime
,
deIdentProcessorName
:
userData
.
tenantName
,
html
:
encodeURIComponent
(
`<div>
${
getHTML
(
dom
.
innerHTML
)}
</div>`
)
}).
then
((
res
:
any
)
=>
{
downPromise
.
value
=
null
loadingText
.
value
=
''
;
resultDataLoading
.
value
=
false
;
...
...
@@ -273,7 +277,7 @@ onBeforeMount(() => {
<div
class=
"table_tool_wrap"
v-loading=
"resultDataLoading"
ref=
"containerRef"
:element-loading-text=
"loadingText"
>
<!-- 连接器不需要显示下载报告按钮 -->
<template
v-if=
"!isDataProvider"
>
<el-button
v-show=
"!isWordStyle"
style=
"margin-bottom: 8px;"
type=
"primary"
@
click=
"transfer"
<el-button
v-show=
"!isWordStyle
&& analysisResultInfo.rating >= 2
"
style=
"margin-bottom: 8px;"
type=
"primary"
@
click=
"transfer"
v-preReClick
>
预览Word评估报告
</el-button>
<div
v-show=
"isWordStyle"
style=
"margin-bottom: 8px;"
>
<el-button
@
click=
"isWordStyle = false"
>
返回
</el-button>
...
...
src/views/data_anonymization/anonTaskCreate.vue
View file @
16852fd
...
...
@@ -168,7 +168,7 @@
</anonResultAnalysis>
<!-- 连接器只能查看报告 -->
<
template
v-if=
"!isDataProvider"
#
header
>
<el-button
v-show=
"isExecEnd && analysisResultInfo.status == 'Y' && !isWordStyle"
type=
"primary"
<el-button
v-show=
"isExecEnd && analysisResultInfo.status == 'Y' && !isWordStyle
&& analysisResultInfo.rating >= 2
"
type=
"primary"
v-loading=
"!!downPromise"
@
click=
"transfer"
>
预览Word评估报告
</el-button>
<div
v-show=
"isWordStyle"
>
<el-button
@
click=
"isWordStyle = false"
>
返回
</el-button>
...
...
@@ -237,6 +237,7 @@ import {
getDicomMeta
,
getDicomStatistics
,
retryDicom
,
downloadAnonReport
,
sendAnonReport
}
from
'@/api/modules/dataAnonymization'
;
import
{
...
...
@@ -268,6 +269,7 @@ import html2canvas from 'html2canvas';
const
anonymizationStore
=
useDataAnonymizationStore
();
const
{
proxy
}
=
getCurrentInstance
()
as
any
;
const
userStore
=
useUserStore
();
const
userData
=
JSON
.
parse
(
userStore
.
userData
)
const
route
=
useRoute
();
const
router
=
useRouter
();
const
fullPath
=
route
.
fullPath
;
...
...
@@ -1252,6 +1254,7 @@ const dialogBtnClick = (btn) => {
if
(
taskGuid
.
value
)
{
saveParams
.
guid
=
taskGuid
.
value
;
}
saveParams
.
dataSharingTypeName
=
saveParams
.
dataSharingTypeCode
&&
dataSharingTypeList
.
value
.
find
(
d
=>
d
.
value
==
saveParams
.
dataSharingTypeCode
)?.
label
;
dicomStatisticsData
.
value
=
{};
folderFileTableInfo
.
value
.
data
=
[];
if
(
!
taskGuid
.
value
)
{
//保存
...
...
@@ -2219,7 +2222,8 @@ const downloadWord = () => {
loadingText
.
value
=
'报告正在下载中,请勿关闭浏览器...'
;
downloadLoading
.
value
=
true
;
downPromise
.
value
=
convertHtml2Img
(
report
,
dom
).
then
(()
=>
{
htmlToWord
({
html
:
encodeURIComponent
(
`<div>
${
getHTML
(
dom
.
innerHTML
)}
</div>`
)
}).
then
((
res
:
any
)
=>
{
downloadAnonReport
({
taskGuid
:
oldAnonTaskValueInfo
.
value
.
guid
,
title
:
`
${
analysisResultInfo
.
value
.
tenantName
}
持有的“
${
oldAnonTaskValueInfo
.
value
.
taskName
}
”`
,
evaluationDate
:
analysisResultInfo
.
value
.
execTime
,
deIdentProcessorName
:
userData
.
tenantName
,
html
:
encodeURIComponent
(
`<div>
${
getHTML
(
dom
.
innerHTML
)}
</div>`
)
}).
then
((
res
:
any
)
=>
{
downPromise
.
value
=
null
loadingText
.
value
=
''
;
downloadLoading
.
value
=
false
;
...
...
src/views/data_anonymization/components/anonResultAnalysis.vue
View file @
16852fd
...
...
@@ -199,55 +199,61 @@
<
/div
>
<
/div
>
<
div
v
-
show
=
"isWordStyle"
class
=
"analysis-result-main report-main"
ref
=
"report"
>
<
div
style
=
"font-family: simsun;height: 40px;display: block;line-height: 32px;font-size: 18px;color: #212121;font-weight: 700;text-align: center;margin-top: 10px;margin-bottom: 10px;"
>
匿名化效果评估指标
<
/div
>
<
p
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;white-space: pre-wrap;color: #212121;"
>
{{
' 依据GB/T 42460-2023《信息安全技术个人信息去标识化效果评估指南》附录D,对去标识化以后的数据集基于K匿名模型进行去标识化效果的评估。'
}}
<
/p
>
<
p
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;white-space: pre-wrap;color: #212121;"
>
{{
` 总体方案为先计算数据集每行记录、整体数据集的重标识风险,进而计算环境重标识攻击概率,最后再结合环境重标识攻击概率计算整个数据集的重标识整体风险。去标识化效果评估结果为${analysisResultInfo.rating + '级'
}
。具体指标如下:`
}}
<
/p
>
<
div
style
=
"font-family: simsun;display: block;line-height: 21px;font-size: 14px;color: #212121;font-weight: 700;margin: 8px 0px;"
>
匿名化结果分析
<
/div
>
<
div
class
=
"kpi-content"
v
-
show
=
"Object.keys(analysisResultInfo).length > 0"
>
<
div
class
=
"border-content"
>
<
div
class
=
"text"
style
=
"color: #212121;"
>
去标识化效果评估结果
<
/div
>
<
span
class
=
"number score-color"
>
{{
analysisResultInfo
.
rating
+
'级'
}}
<
/span
>
<
/div
>
<
div
class
=
"border-content"
>
<
span
class
=
"text"
style
=
"color: #212121;"
>
重标识风险最大值
<
/span
>
<
span
class
=
"number"
>
{{
analysisResultInfo
.
reIdentifyRiskRb
!=
null
?
(
analysisResultInfo
.
reIdentifyRiskRb
||
0
)
:
'--'
}}
<
/span
>
<
/div
>
<
div
class
=
"border-content"
>
<
span
class
=
"text"
style
=
"color: #212121;"
>
重标识风险平均值
<
/span
>
<
span
class
=
"number"
>
{{
analysisResultInfo
.
reIdentifyRiskRc
!=
null
?
(
analysisResultInfo
.
reIdentifyRiskRc
||
0
)
:
'--'
}}
<
/span
>
<
/div
>
<
div
class
=
"border-content"
>
<
span
class
=
"text"
style
=
"color: #212121;"
>
环境重标识攻击概率
<
/span
>
<
span
class
=
"number"
>
{{
analysisResultInfo
.
envReAttackPr
!=
null
?
(
analysisResultInfo
.
envReAttackPr
||
0
)
:
'--'
}}
<
/span
>
<
/div
>
<
div
class
=
"border-content"
>
<
span
class
=
"text"
style
=
"color: #212121;"
>
等价类门限风险
<
/span
>
<
span
class
=
"number"
>
{{
analysisResultInfo
.
reIdentifyRiskRa
!=
null
?
(
analysisResultInfo
.
reIdentifyRiskRa
||
0
)
:
'--'
}}
<
/span
>
<
/div
>
<
div
class
=
"border-content"
>
<
span
class
=
"text"
style
=
"color: #212121;"
>
重标识风险总体风险
<
/span
>
<
span
class
=
"number"
>
{{
analysisResultInfo
.
reIdentifyOverallRisk
!=
null
?
(
analysisResultInfo
.
reIdentifyOverallRisk
||
0
)
:
'--'
}}
<
/span
>
<
/div
>
<
div
class
=
"border-content"
>
<
span
class
=
"text"
style
=
"color: #212121;"
>
重标识可接受风险阈值
<
/span
>
<
span
class
=
"number"
>
{{
oldAnonTaskValueInfo
.
anonPrivacyMode
?.
riskThreshold
==
null
?
0.05
:
(
oldAnonTaskValueInfo
.
anonPrivacyMode
?.
riskThreshold
||
0
)
}}
<
/span
>
<
/div
>
<
/div
>
<
div
style
=
"font-family: simsun;display: block;line-height: 21px;font-size: 14px;color: #212121;font-weight: 700;margin: 8px 0px 4px;"
>
重标识风险表
<
/div
>
<
div
style
=
"font-family: simsun;display: block;line-height: 21px;font-size: 14px;color: #212121;margin-bottom: 4px;white-space: pre-wrap;"
>
{{
' 门限阈值的取值:完全公开共享数据发布,取值 1/20;受控公开共享数据发布,取值 1/5;领地公开共享数据发布,取值 1/3。'
}}
<
/div
>
<!--
报告总览
-->
<
h1
style
=
"font-family: simsun;font-size: 18px;font-weight: 700;text-align: center;margin-top: 10px;margin-bottom: 10px;color: #212121;"
>
报告总览
<
/h1
>
<
p
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;white-space: pre-wrap;color: #212121;"
>
{{
` 一、评价对象:${analysisResultInfo.tenantName
}
2025年1月1日至2025年12月31日的${oldAnonTaskValueInfo.taskName
}
,该数据集包含1张表,字段总数量共计${changeNum(analysisResultInfo.fieldNum || 0)
}
个,记录总数量共计${changeNum(analysisResultInfo.fieldCnExps || 0)
}
条,数据元素总量为${changeNum(analysisResultInfo.dataTotal || 0)
}
个 。`
}}
<
/p
>
<
p
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;white-space: pre-wrap;color: #212121;"
>
{{
` 二、评价方法:基于匿名化评估国家标准GB/T 42460-2023《信息安全技术 个人信息去标识化效果评估指南》、GB/T 37964-2019《信息安全技术 个人信息去标识化指南》,以及《中华人民共和国个人信息保护法》、《中华人民共和国数据安全法》、《中华人民共和国网络安全法》、《面向数据流通的匿名化效果实施指南 草案》、《面向数据流通的匿名化效果评估指南 草案》和《数据安全技术 个人信息匿名化处理指南及评价方法 征求意见稿》相关法律法规,采用“定性分析”与“定量计算”相结合的综合评估方法。`
}}
<
/p
>
<
p
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;white-space: pre-wrap;color: #212121;"
>
{{
` 三、评估结论:综合定性与定量评估结果,根据GB/T 42460-2023的分级标准,该${oldAnonTaskValueInfo.taskName
}
的匿名化效果评定为${analysisResultInfo.rating
}
级${analysisResultInfo.rating <=2 ? '(重标识风险较高)' : ''
}
。${`
需要对准标识符
$
{
analysisResultInfo
.
qualifiedIdentifier
?.
map
(
f
=>
f
.
chName
)?.
join
(
'、'
)
}做有效的泛化和抑制,满足
k
-
匿名要求(设定
k
≥
10
)
,从而使得该数据集适用于受控环境下进行跨机构流通。
`
}
。`
}}
<
/p
>
<
div
style
=
"page-break-after: always;"
>
<
span
style
=
"display: none;"
>&
nbsp
;
<
/span
>
<
/div
>
<!--
1
.
评估基本信息
-->
<
h1
style
=
"font-family: simsun;font-size: 18px;font-weight: 700;text-align: center;margin-top: 10px;margin-bottom: 10px;color: #212121;"
>
一、评估基本信息
<
/h1
>
<
p
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;white-space: pre-wrap;color: #212121;"
>
{{
` 评估项目名称:${oldAnonTaskValueInfo.taskName
}
匿名化效果评估`
}}
<
/p
>
<
p
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;white-space: pre-wrap;color: #212121;"
>
{{
` 评估对象:${analysisResultInfo.tenantName
}
2025年1月1日至2025年12月31日的${oldAnonTaskValueInfo.taskName
}
(共计${changeNum(analysisResultInfo.fieldCnExps || 0)
}
条记录)`
}}
<
/p
>
<
p
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;white-space: pre-wrap;color: #212121;"
>
{{
` 评估依据:GB/T 42460-2023《信息安全技术 个人信息去标识化效果评估指南》、GB/T 37964-2019《信息安全技术 个人信息去标识化指南》、《中华人民共和国个人信息保护法》、《中华人民共和国数据安全法》、《中华人民共和国网络安全法》、《面向数据流通的匿名化效果实施指南 草案》、《面向数据流通的匿名化效果评估指南 草案》和《数据安全技术 个人信息匿名化处理指南及评价方法 征求意见稿》。`
}}
<
/p
>
<
p
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;white-space: pre-wrap;color: #212121;"
>
{{
` 评估日期:${analysisResultInfo.execTime
}
`
}}
<
/p
>
<!--
2
.
评估准备
-->
<
h1
style
=
"font-family: simsun;font-size: 18px;font-weight: 700;text-align: center;margin-top: 10px;margin-bottom: 10px;color: #212121;"
>
二、评估准备
<
/h1
>
<
p
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;white-space: pre-wrap;color: #212121;"
>
{{
` 数据集与环境确认:待评估数据集包含${analysisResultInfo?.column?.slice(0, 4)?.map(f => f.chName).join('、')
}
${analysisResultInfo?.column?.length > 4 ? '等字段' : ''
}
。数据将用于跨机构的科学研究,处于半开放网络环境。`
}}
<
/p
>
<
p
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;white-space: pre-wrap;color: #212121;"
>
{{
` 风险阈值设定:结合科研数据共享需求,设定可接受的重标识风险阈值为0.05(即5%)。`
}}
<
/p
>
<!--
3
.
定性评估
-->
<
h1
style
=
"font-family: simsun;font-size: 18px;font-weight: 700;text-align: center;margin-top: 10px;margin-bottom: 10px;color: #212121;"
>
三、定性评估
<
/h1
>
<
p
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;white-space: pre-wrap;color: #212121;"
>
{{
` 依据GB/T 37964标准,对数据集中的标识符进行了识别与分类处理:`
}}
<
/p
>
<
p
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;white-space: pre-wrap;color: #212121;font-weight: 700;"
>
{{
` 1.直接标识符处理`
}}
<
/p
>
<
p
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;white-space: pre-wrap;color: #212121;"
>
{{
` 识别字段:姓名、身份证号、手机号、住院号、家庭详细住址等。`
}}
<
/p
>
<
p
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;white-space: pre-wrap;color: #212121;"
>
{{
' 处理措施:采用完全删除技术。'
}}
<
/p
>
<
p
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;white-space: pre-wrap;color: #212121;"
>
{{
` 评估结果:数据集中已完全消除直接标识符,无法通过单一字段直接识别特定患者。`
}}
<
/p
>
<
p
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;white-space: pre-wrap;color: #212121;font-weight: 700;"
>
{{
` 2.准标识符处理`
}}
<
/p
>
<
p
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;white-space: pre-wrap;color: #212121;"
>
{{
` 识别字段:性别、年龄、职业、入院日期、出院日期、出生日期、婚姻、受教育水平等。`
}}
<
/p
>
<
p
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;white-space: pre-wrap;color: #212121;"
>
{{
' 处理措施:'
}}
<
/p
>
<
p
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;white-space: pre-wrap;color: #212121;"
>
{{
` 时间泛化:将精确的“入院日期”、“出院日期”泛化为“年份”或住院天数、“年龄”泛化为“年龄段”(如将年龄转换为[40-50]区间)。`
}}
<
/p
>
<
p
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;white-space: pre-wrap;color: #212121;"
>
{{
` 对准标识符的泛化确保同一属性组合(相同的准标识符)下的记录数满足 k-匿名要求(设定k≥10)。比如性别为男、年龄[40-50]、职业为其他、入院时间为2025年11月,出院时间为2025年11月的记录数满足10条以上。`
}}
<
/p
>
<
p
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;white-space: pre-wrap;color: #212121;"
>
{{
` 评估结果:数据集中未对准标识符进行有效地泛化和抑制处理。`
}}
<
/p
>
<!--
4
.
定量评估(重标识风险计算)
-->
<
h1
style
=
"font-family: simsun;font-size: 18px;font-weight: 700;text-align: center;margin-top: 10px;margin-bottom: 10px;color: #212121;"
>
四、定量评估(重标识风险计算)
<
/h1
>
<
p
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;white-space: pre-wrap;color: #212121;"
>
{{
` 依据GB/T 42460-2023《信息安全技术个人信息去标识化效果评估指南》附录D,对去标识化以后的数据集基于K匿名模型进行去标识化效果的评估。总体方案为先对所有的数据进行直接标识符识别,判断无直接标识符内容后,再计算数据集每行记录、整体数据集的重标识风险,进而计算环境重标识攻击概率,最后再结合环境重标识攻击概率计算整个数据集的重标识整体风险。`
}}
<
/p
>
<
p
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;white-space: pre-wrap;color: #212121;font-weight: 700;"
>
{{
` 直接标识符:`
}}
<
span
style
=
"font-weight: 500;"
>
{{
'经扫描数据集的内容,比如现病史、既往史等长文本字段进行扫描,未发现直接标识符内容。'
}}
<
/span></
p
>
<
p
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;white-space: pre-wrap;color: #212121;font-weight: 700;"
>
{{
` 重标识风险总体风险:`
}}
<
span
style
=
"font-weight: 500;"
>
{{
`准标识符${analysisResultInfo.rating > 2 ? '' : '并未'
}
进行有效泛化,计算的重标识符总体风险为${analysisResultInfo.reIdentifyOverallRisk != null ?
(analysisResultInfo.reIdentifyOverallRisk || 0) * 100 : '--'
}
${analysisResultInfo.reIdentifyOverallRisk ? '%' : ''
}
;`
}}
<
/span></
p
>
<
p
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;white-space: pre-wrap;color: #212121;font-weight: 700;"
>
{{
` 重标识风险最大值:`
}}
<
span
style
=
"font-weight: 500;"
>
{{
`计算数据集中重标识风险最高的记录所对应的风险值。经计算,该数据集最大重标识风险值为${analysisResultInfo.reIdentifyRiskRb != null ?
(analysisResultInfo.reIdentifyRiskRb || 0) : '--'
}
${analysisResultInfo.reIdentifyRiskRb ? `
(即
$
{
analysisResultInfo
.
reIdentifyRiskRb
*
100
})
` : ''
}
。`
}}
<
/span></
p
>
<
p
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;white-space: pre-wrap;color: #212121;font-weight: 700;"
>
{{
` 重标识风险平均值:`
}}
<
span
style
=
"font-weight: 500;"
>
{{
`模拟攻击者随机抽取一条记录并尝试重标识的平均风险。经计算,该数据集重标识风险的平均值为${analysisResultInfo.reIdentifyRiskRc != null ?
(analysisResultInfo.reIdentifyRiskRc || 0) : '--'
}
${analysisResultInfo.reIdentifyRiskRc ? `
(即
$
{
analysisResultInfo
.
reIdentifyRiskRc
*
100
})
` : ''
}
。`
}}
<
/span></
p
>
<
p
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;white-space: pre-wrap;color: #212121;font-weight: 700;"
>
{{
` 环境重标识攻击概率:`
}}
<
span
style
=
"font-weight: 500;"
>
{{
`${oldAnonTaskValueInfo.dataSharingTypeName
}
的数据集,环境重标识攻击概率为内部故意攻击概率、数据集包含熟人概率和数据泄露概率三者的最大值,经计算,该数据集的攻击概率为${analysisResultInfo.envReAttackPr != null ?
(analysisResultInfo.envReAttackPr || 0) : '--'
}
${analysisResultInfo.envReAttackPr ? `
(即
$
{
analysisResultInfo
.
envReAttackPr
*
100
})
` : ''
}
。`
}}
<
/span></
p
>
<
p
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;white-space: pre-wrap;color: #212121;"
>
{{
' 具体计算指标如下:'
}}
<
/p
>
<!--
1
.
重标识风险表
-->
<
div
style
=
"font-family: simsun;display: block;line-height: 21px;font-size: 14px;color: #212121;font-weight: 700;margin: 8px 0px 4px;"
>
{{
' 1. 重标识风险表'
}}
<
/div
>
<
div
style
=
"font-family: simsun;display: block;line-height: 21px;font-size: 14px;color: #212121;margin-bottom: 4px;white-space: pre-wrap;"
>
{{
` 门限阈值的取值:该数据集为${oldAnonTaskValueInfo.dataSharingTypeName
}
数据,门限阈值为${oldAnonTaskValueInfo.dataSharingTypeCode == '01' ? '1/20' : (oldAnonTaskValueInfo.dataSharingTypeCode == '02' ? '1/5' : '1/3')
}
。`
}}
<
/div
>
<
table
border
=
"0"
cellspacing
=
"0"
style
=
"width:100%;word-break: break-all;margin: 0 auto;text-align: center;border-collapse: collapse;color: #212121"
>
<
thead
>
...
...
@@ -268,11 +274,10 @@
<
/tr
>
<
/tbody
>
<
/table
>
<
div
v
-
show
=
"oldAnonTaskValueInfo.dataSharingTypeCode != '01'"
style
=
"font-family: simsun;display: block;line-height: 21px;font-size: 14px;color: #212121;font-weight: 700;margin: 8px 0px 4px;"
>
内部故意攻击概率
<
/div
>
<
div
v
-
show
=
"oldAnonTaskValueInfo.dataSharingTypeCode != '01'"
style
=
"font-family: simsun;display: block;line-height: 21px;font-size: 14px;color: #212121;margin-bottom: 4px;white-space: pre-wrap;"
>
{{
' 重标识数据的动机和能力为低,从重标识攻击可能性分析表可得出在内部攻击方面,重标识攻击概率的取值为0.05。'
}}
<
/div
>
<!--
2
.
内部故意攻击概率
-->
<
div
v
-
show
=
"oldAnonTaskValueInfo.dataSharingTypeCode != '01'"
style
=
"font-family: simsun;display: block;line-height: 21px;font-size: 14px;color: #212121;font-weight: 700;margin: 8px 0px 4px;"
>
{{
' 2. 内部故意攻击概率'
}}
<
/div
>
<
div
v
-
show
=
"oldAnonTaskValueInfo.dataSharingTypeCode != '01'"
style
=
"font-family: simsun;display: block;line-height: 21px;font-size: 14px;color: #212121;margin-bottom: 4px;white-space: pre-wrap;"
>
{{
' 重标识数据的动机和能力为低,从重标识攻击可能性分析表可得出在内部攻击方面,重标识攻击概率的取值为0.05。'
}}
<
/div
>
<
table
v
-
show
=
"oldAnonTaskValueInfo.dataSharingTypeCode != '01'"
border
=
"0"
cellspacing
=
"0"
style
=
"width:100%;word-break: break-all;margin: 0 auto;text-align: center;border-collapse: collapse;color: #212121;"
>
<
thead
>
...
...
@@ -295,37 +300,27 @@
<
/tr
>
<
/tbody
>
<
/table
>
<
div
v
-
show
=
"oldAnonTaskValueInfo.dataSharingTypeCode != '01'"
style
=
"font-family: simsun;display: block;line-height: 21px;font-size: 14px;color: #212121;font-weight: 700;margin: 8px 0px;"
>
数据集包含熟人概率
<
/div
>
<
div
v
-
show
=
"oldAnonTaskValueInfo.dataSharingTypeCode != '01'"
style
=
"font-family: simsun;text-align: center; display: block;line-height: 21px;font-size: 14px;color: #212121;font-weight: 700"
>
pr
=
1
-
(
1
-
p
)
^
m
<
/div
>
<
div
v
-
show
=
"oldAnonTaskValueInfo.dataSharingTypeCode != '01'"
style
=
"font-family: simsun;display: block;line-height: 21px;font-size: 14px;color: #212121;white-space: pre-wrap;"
>
<!--
3
.
数据集包含熟人概率
-->
<
div
v
-
show
=
"oldAnonTaskValueInfo.dataSharingTypeCode != '01'"
style
=
"font-family: simsun;display: block;line-height: 21px;font-size: 14px;color: #212121;font-weight: 700;margin: 8px 0px;"
>
{{
' 3. 数据集包含熟人概率'
}}
<
/div
>
<
div
v
-
show
=
"oldAnonTaskValueInfo.dataSharingTypeCode != '01'"
style
=
"font-family: simsun;text-align: center; display: block;line-height: 21px;font-size: 14px;color: #212121;font-weight: 700"
>
pr
=
1
-
(
1
-
p
)
^
m
<
/div
>
<
div
v
-
show
=
"oldAnonTaskValueInfo.dataSharingTypeCode != '01'"
style
=
"font-family: simsun;display: block;line-height: 21px;font-size: 14px;color: #212121;white-space: pre-wrap;"
>
{{
` 数据集包含熟人概率可通过以上公式计算,${new Date().getFullYear()
}
年我国最新的人口统计为${analysisResultInfo?.allPerson ||
0
}
亿人,其中该数据集的容量为${analysisResultInfo?.dataSetNum || 0
}
万,占总人口的比例为${analysisResultInfo.patientPopulationRate ||
0
}
%,m值取推荐值150,数据集包含熟人的概率为${analysisResultInfo.randomAcquaintancePr || 0
}
。`
}}
<
/div
>
<
div
v
-
show
=
"oldAnonTaskValueInfo.dataSharingTypeCode != '01'"
style
=
"font-family: simsun;display: block;line-height: 21px;font-size: 14px;color: #212121;font-weight: 700;margin: 8px 0px;"
>
数据泄露概率
0
}
%,m值取推荐值150,数据集包含熟人的概率为${analysisResultInfo.randomAcquaintancePr || 0
}
。`
}}
<
/div
>
<
div
v
-
show
=
"oldAnonTaskValueInfo.dataSharingTypeCode != '01'"
style
=
"font-family: simsun;display: block;line-height: 21px;font-size: 14px;color: #212121;white-space: pre-wrap;"
>
{{
' 对于安全和隐私控制能力评估为低的情况,推荐将数据泄露概率设定为0.55。'
}}
<
/div
>
<
div
v
-
show
=
"oldAnonTaskValueInfo.dataSharingTypeCode != '01'"
style
=
"font-family: simsun;display: block;line-height: 21px;font-size: 14px;color: #212121;white-space: pre-wrap;"
>
{{
' 对于安全和隐私控制能力评估为中的情况,推荐将数据泄露概率设定为0.27。'
}}
<
/div
>
<
div
v
-
show
=
"oldAnonTaskValueInfo.dataSharingTypeCode != '01'"
style
=
"font-family: simsun;display: block;line-height: 21px;font-size: 14px;color: #212121;white-space: pre-wrap;"
>
{{
' 对于安全和隐私控制能力评估为高的情况,推荐将数据泄露概率设定为 0.14。'
}}
<
/div>
<
div
v
-
show
=
"oldAnonTaskValueInfo.dataSharingTypeCode != '01'"
style
=
"font-family: simsun;display: block;line-height: 21px;font-size: 14px;color: #212121;white-space: pre-wrap;"
>
{{
` 数据接收方的安全和隐私控制能力为高,按照推荐值将数据泄露概率设定为${analysisResultInfo.dataBreachPr || 0
}
。`
}}
<
/div
>
<
div
style
=
"font-family: simsun;display: block;line-height: 21px;font-size: 14px;color: #212121;font-weight: 700;margin: 8px 0px;"
>
备注:
<
/div
>
<
p
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;color: #212121;margin-top: 8px;white-space: pre-wrap;"
>
{{
' 重标识风险最大值:所有等价类的重标识风险最大值;'
}}
<
/p
>
<
p
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;color: #212121;white-space: pre-wrap;"
>
{{
' 重标识风险平均值:所有等价类的重标识风险平均值;'
}}
<
/p
>
<
p
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;color: #212121;white-space: pre-wrap;"
>
{{
' 环境重标识攻击概率:完全公开共享数据发布,攻击者对数据集进行环境重标识攻击的概率为1。领地公开共享与受控公开共享数据发布,环境重标识攻击概率为内部故意攻击概率、数据集包含熟人概率和数据泄露概率三者的最大值;'
}}
<
/p
>
<
p
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;color: #212121;white-space: pre-wrap;"
>
{{
' 等价类门限风险:完全公开共享数据发布,门限阈值取值1/20;受控公开共享数据发布,门限阈值取值 1/5;领地公开共享数据发布,门限阈值取值 1/3;等价类门限风险为:等价类的重标识风险大于门限阈值为1,小于等于为0,求和后除以等价类个数;'
}}
<
/p
>
<
p
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;color: #212121;white-space: pre-wrap;"
>
{{
' 重标识风险总体风险:完全公开共享,当等价类门限风险=0时,重标识风险总体风险公式为等价类重标识风险最大值*环境重标识攻击概率;当等价类门限风险!=0时,重标识风险总体风险为1。'
}}
<
/p
>
<
p
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;color: #212121;white-space: pre-wrap;"
>
{{
' 受控公开共享和领地公开共享,当等价类门限风险=0时,重标识风险总体风险公式为等价类重标识风险平均值*环境重标识攻击概率;当等价类门限风险!=0时,重标识风险总体风险为1。'
}}
<
/p
>
<!--
4
.
数据泄露概率
-->
<
div
v
-
show
=
"oldAnonTaskValueInfo.dataSharingTypeCode != '01'"
style
=
"font-family: simsun;display: block;line-height: 21px;font-size: 14px;color: #212121;font-weight: 700;margin: 8px 0px;"
>
{{
' 4. 数据泄露概率'
}}
<
/div
>
<
div
v
-
show
=
"oldAnonTaskValueInfo.dataSharingTypeCode != '01'"
style
=
"font-family: simsun;display: block;line-height: 21px;font-size: 14px;color: #212121;white-space: pre-wrap;"
>
{{
' 对于安全和隐私控制能力评估为低的情况,推荐将数据泄露概率设定为0.55。'
}}
<
/div
>
<
div
v
-
show
=
"oldAnonTaskValueInfo.dataSharingTypeCode != '01'"
style
=
"font-family: simsun;display: block;line-height: 21px;font-size: 14px;color: #212121;white-space: pre-wrap;"
>
{{
' 对于安全和隐私控制能力评估为中的情况,推荐将数据泄露概率设定为0.27。'
}}
<
/div
>
<
div
v
-
show
=
"oldAnonTaskValueInfo.dataSharingTypeCode != '01'"
style
=
"font-family: simsun;display: block;line-height: 21px;font-size: 14px;color: #212121;white-space: pre-wrap;"
>
{{
' 对于安全和隐私控制能力评估为高的情况,推荐将数据泄露概率设定为0.14。'
}}
<
/div>
<
div
v
-
show
=
"oldAnonTaskValueInfo.dataSharingTypeCode != '01'"
style
=
"font-family: simsun;display: block;line-height: 21px;font-size: 14px;color: #212121;white-space: pre-wrap;"
>
{{
` 数据接收方的安全和隐私控制能力为高,按照推荐值将数据泄露概率设定为${analysisResultInfo.dataBreachPr || 0
}
。`
}}
<
/div
>
<!--
对抗性测试
(
评级
>=
3
时展示
)
-->
<
div
v
-
show
=
"analysisResultInfo.rating >= 3"
style
=
"font-family: simsun;display: block;line-height: 21px;font-size: 14px;color: #212121;font-weight: 700;margin: 8px 0px;"
>
{{
oldAnonTaskValueInfo
.
dataSharingTypeCode
!=
'01'
?
' 5. 对抗性测试'
:
' 2. 对抗性测试'
}}
<
/div
>
<
p
v
-
show
=
"analysisResultInfo.rating >= 3"
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;color: #212121;white-space: pre-wrap;"
>
{{
' 依据《数据安全技术个人信息匿名化处理指南及评价方法(征求意见稿)》4.2,去标识化的数据集达到3级可展开对数据级的对抗性测试和不可复原性核验。对抗性测试关键变量如下表:'
}}
<
/p
>
<
table
border
=
"0"
cellspacing
=
"0"
v
-
show
=
"analysisResultInfo.rating >= 3"
style
=
"width:100%;word-break: break-all;margin: 4px auto 0px auto;text-align: center;border-collapse: collapse;color: #212121;"
>
<
table
border
=
"0"
cellspacing
=
"0"
v
-
show
=
"analysisResultInfo.rating >= 3"
style
=
"width:100%;word-break: break-all;margin: 4px auto 0px auto;text-align: center;border-collapse: collapse;color: #212121;"
>
<
thead
>
<
tr
>
<
th
v
-
for
=
"(item, index) in adversarialTestFields"
:
key
=
"index"
style
=
"border: 0.5px solid #d9d9d9"
>
...
...
@@ -335,18 +330,35 @@
<
/thead
>
<
tbody
>
<
tr
v
-
for
=
"(recordItem, j) in analysisResultInfo?.adversarialTest || []"
:
key
=
"j"
>
<
td
v
-
for
=
"(columnItem, i) in adversarialTestFields"
:
key
=
"i"
:
style
=
"
{
border
:
'0.5px solid #d9d9d9'
,
'text-align'
:
<
any
>
(
columnItem
.
align
??
'left'
)
}
">
<
td
v
-
for
=
"(columnItem, i) in adversarialTestFields"
:
key
=
"i"
:
style
=
"
{
border
:
'0.5px solid #d9d9d9'
,
'text-align'
:
<
any
>
(
columnItem
.
align
??
'left'
)
}
">
<span :style="
{
'word-break'
:
'break-all'
}"
>
{{
columnItem
.
field
==
'index'
?
(
j
+
1
)
:
recordItem
[
columnItem
.
field
]
===
0
?
0
:
(
recordItem
[
columnItem
.
field
]
||
'--'
)
}}
{{
columnItem
.
field
==
'index'
?
(
j
+
1
)
:
recordItem
[
columnItem
.
field
]
===
0
?
0
:
(
recordItem
[
columnItem
.
field
]
||
'--'
)
}}
<
/span
>
<
/td
>
<
/tr
>
<
/tbody
>
<
/table
>
<
p
v
-
show
=
"analysisResultInfo.rating >= 3"
style
=
"font-family: simsun;margin: 4px 0px 0px;font-size: 14px;line-height: 21px;color: #212121;white-space: pre-wrap;"
>
{{
' 通过识别关键变量,选择标识度高于0.5的属性作为攻击测试的关键变量,在攻击测试中,涉及到的攻击场景,其重标识概率均远小于所接受的风险水平0.05。另外,未发现任何其它可能的安全性问题。'
}}
<
/p
>
<
/div
>
<!--
指标说明
-->
<
div
style
=
"font-family: simsun;display: block;line-height: 21px;font-size: 14px;color: #212121;font-weight: 700;margin: 8px 0px;"
>
{{
' 指标说明:'
}}
<
/div
>
<
p
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;color: #212121;margin-top: 8px;white-space: pre-wrap;"
>
{{
' 重标识风险最大值:所有等价类的重标识风险最大值;'
}}
<
/p
>
<
p
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;color: #212121;white-space: pre-wrap;"
>
{{
' 重标识风险平均值:所有等价类的重标识风险平均值;'
}}
<
/p
>
<
p
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;color: #212121;white-space: pre-wrap;"
>
{{
' 环境重标识攻击概率:完全公开共享数据发布,攻击者对数据集进行环境重标识攻击的概率为1。领地公开共享与受控公开共享数据发布,环境重标识攻击概率为内部故意攻击概率、数据集包含熟人概率和数据泄露概率三者的最大值;'
}}
<
/p
>
<
p
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;color: #212121;white-space: pre-wrap;"
>
{{
' 等价类门限风险:完全公开共享数据发布,门限阈值取值1/20;受控公开共享数据发布,门限阈值取值 1/5;领地公开共享数据发布,门限阈值取值 1/3;等价类门限风险为:等价类的重标识风险大于门限阈值为1,小于等于为0,求和后除以等价类个数;'
}}
<
/p
>
<
p
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;color: #212121;white-space: pre-wrap;"
>
{{
' 重标识风险总体风险:完全公开共享,当等价类门限风险=0时,重标识风险总体风险公式为等价类重标识风险最大值*环境重标识攻击概率;当等价类门限风险!=0时,重标识风险总体风险为1。'
}}
<
/p
>
<
p
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;color: #212121;white-space: pre-wrap;"
>
{{
' 受控公开共享和领地公开共享,当等价类门限风险=0时,重标识风险总体风险公式为等价类重标识风险平均值*环境重标识攻击概率;当等价类门限风险!=0时,重标识风险总体风险为1。'
}}
<
/p
>
<!--
5
.
评估结论与分级
-->
<
h1
style
=
"font-family: simsun;font-size: 18px;font-weight: 700;text-align: center;margin-top: 10px;margin-bottom: 10px;color: #212121;"
>
五、评估结论与分级
<
/h1
>
<
p
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;white-space: pre-wrap;color: #212121;font-weight: 700;"
>
{{
` 定性评估结论:${analysisResultInfo.rating == 2 ? '数据集已消除所有直接标识符,但未对准标识符进行了有效的泛化与抑制处理。' : (analysisResultInfo.rating == 4 ? '数据集无任何的直接标识符和准标识符。' : '数据集已消除所有直接标识符,并对准标识符进行了有效的泛化与抑制处理。')
}
`
}}
<
/p
>
<
p
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;white-space: pre-wrap;color: #212121;font-weight: 700;"
>
{{
` 定量评估结论:${analysisResultInfo.rating == 2 ? '数据集的重标识风险总体风险(1)大于预设的可接受风险阈值(0.05)。' : (analysisResultInfo.rating == 4 ? '数据集重标识风险总体风险为0。' : '数据集的重标识风险总体风险(1)小于等于预设的可接受风险阈值(0.05)。')
}
`
}}
<
/p
>
<
p
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;white-space: pre-wrap;color: #212121;font-weight: 700;"
>
{{
` 最终评级:综合定性与定量评估结果,根据GB/T 42460-2023的分级标准,该${oldAnonTaskValueInfo.taskName
}
的匿名化效果评定为${analysisResultInfo.rating
}
级${analysisResultInfo.rating <=2 ? '(重标识风险较高)' : ''
}
。`
}}
<
/p
>
<!--
6
.
建议与改进
-->
<
h1
v
-
show
=
"analysisResultInfo.rating <= 2"
style
=
"font-family: simsun;font-size: 18px;font-weight: 700;text-align: center;margin-top: 10px;margin-bottom: 10px;color: #212121;"
>
六、建议与改进
<
/h1
>
<
p
v
-
show
=
"analysisResultInfo.rating <= 2"
style
=
"font-family: simsun;margin: 0px;font-size: 14px;line-height: 21px;white-space: pre-wrap;color: #212121;"
>
{{
` 需要对准标识符${analysisResultInfo.qualifiedIdentifier?.map(f => f.chName)?.join('、')
}
做有效的泛化和抑制,满足 k-匿名要求(设定k≥10) ,从而使得该数据集适用于受控环境下进行跨机构流通。`
}}
<
/p
>
<
/div
>
<
/div
>
<
/template
>
<
script
lang
=
"ts"
setup
name
=
"anonResultAnalysis"
>
...
...
@@ -356,7 +368,7 @@ import Moment from 'moment';
import
{
downDicomPath
,
}
from
'@/api/modules/dataAnonymization'
;
import
{
download
}
from
'@/utils/common'
;
import
{
changeNum
,
download
}
from
'@/utils/common'
;
import
{
ElMessage
}
from
'element-plus'
;
const
props
=
defineProps
({
...
...
Write
Preview
Styling with
Markdown
is supported
Attach a file
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to post a comment