一 实验目的
实现一种用于车载网络的高精度实时入侵检测方法,该方法可以通过较少的工作量部署在当前的车载网关节点上。为达到此目的,所提出的入侵检测方法可以部署到车辆网关平台中的软件插件或者作为要加载到现有CAN总线上的硬件节点。设计实现一种基于固定数量的消息作为滑动窗口的信息熵监测算法,以及基于模拟退火算法对滑动窗口进行优化。
二 实验内容
1.给定固定大小的滑动窗口在CAN总线消息中实现基于信息熵检测的DoS攻击检测算法。
2.使用模拟退火算法改进实验一中算法的滑动窗口战略,优化决策条件,使得检测精度提高、假阳性率降低、响应时间缩短。
三 实验原理
1、CAN和DoS攻击
(1)CAN总线
CAN总线消息中,消息的优先级由其ID字段标识。正常情况下,在一定时间(或一定窗口)内取样得到的CAN总线消息,各ID段消息占据的比例应该不会出现大的波动,取样窗口的信息熵应处于一定的范围之内。
(2)DoS攻击
DoS攻击: 攻击者可以在总线上的短周期注入高优先级消息,影响CAN总线对于正常消息的处理,影响汽车电子系统的正常响应。
假设采样窗口的长度为w。由于DoS攻击的特性,在一个采样窗口内高优先级消息的比例会在短时间内增大,相应的低优先级的消息比例降低。这会导致采样窗口内信息熵的异常变化。
信息熵:熵是信息学上代表随机变量的不确定度的度量。一个离散随机变量X的熵H(X)定义为

DoS攻击判断:实验计算正常情况下CAN总线中信息熵的平均值a,标准差α,预测DoS攻击时设置决策条件区间(a-kα,a+kα),将信息熵超出决策条件的采样窗口预测为发生异常情况(即为DoS攻击)。其中k控制决策区间敏感度的常数。
2、性能评价指标
将一个采样(滑动)窗口看作一个块,那么定义:
- 预测准确:Ra=正确检测为攻击块的数目Da/攻击块总数Ta。
- 假阳性率:Rn=正常信息块被检测为攻击块的数目Dn/正常信息块的数目Tn。
- 响应时间:Rt=攻击开始时间At-攻击检测时间Dt。
3、模拟退火
模拟退火算法来源于固体退火原理,将固体加温至充分高,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个温度都达到平衡态,最后在常温时达到基态,内能减为最小。需要注意的是一定要徐徐冷却,也就是物体和外界温度相差越低,退火时间越长退火的效果就越好。这也就是这算法名字的由来。
该实验中的模拟退火步骤如下:
- 初始化 起始温度
t、下降率t_dis、停止温度t_min、温度下的寻找次数step - 生成初始解:窗口大小
w和 系数k,利用评价指标得到初始解分数eva - 生成新解,使用评价函数评价新解
eva_new- 如果新解Tn+1更优秀则接受新解。
- 否则以一定概率p接受Tn+1
- 重复上一步骤,直到解足够优秀或温度降得足够低
四 实验条件
1、数据集:
- DoS_attack_dataset_no_zero.csv是未加入DoS攻击的正常CAN总线数据集;Add_DoS_attack_dataset1.csv是加了DoS攻击块的CAN总线数据集,DoS攻击块由ID=0标识。
2、建议使用python语言,可能需要的python包:pandas,math,matplotlib,numpy。
五 实验过程
1、计算正常信息熵
-
读取文件
-
滑动窗口
设置滑动窗口大小 w=100,比例系数 k = 2.5
-
计算信息熵
-
信息熵
以 w 的步长移动滑动窗口,得到各窗口内不同ID消息出现的频率,并计算窗口内的信息熵,信息熵公式如下,p(x)代表 ID=x 的信息块出现的频率

-
均值和方差
记录各窗口内的信息熵,最后得到无攻击下的信息熵
均值mean和方差var
-
-
绘图
绘制滑动窗口中的信息熵变化,并画出无攻击下的信息熵变化范围
-
代码
-
无DOS攻击的信息熵
no_dos.py# DoS_attack_dataset_no_zero import pandas as pd import numpy as np import matplotlib.pyplot as plt # 1.读取csv文件 df = pd.read_csv('data/DoS_attack_dataset_no_zero.csv', sep='\t') # 2.滑动窗口 w=500 k=2.5 shang=[] # 记录不同窗口的信息熵 err_time=[] # 记录时间戳 for st in range(0,len(df),w): # 以w的步长移动窗口 data = df.iloc[st:st+w] # 得到本窗口内第1条消息的时间戳的值 end_time = data.iloc[0]['TimeStamp'] err_time.append(end_time) # 得到窗口内不同ID消息出现的频率 p_data = data['ID'].value_counts() / data['ID'].count() # 计算该窗口内的信息熵 shang.append(-sum(p_data*np.log(p_data))) if st % 1000==0: print(st) # 计算无攻击下的信息熵均值和方差 arr_mean = np.mean(shang) arr_std = np.std(shang, ddof=1) print(arr_mean,arr_std) # 区间 a=arr_mean-k*arr_std b=arr_mean+k*arr_std # 绘图 plt.plot(err_time,shang,c='b') plt.axhline(y=a,ls='--',c='blue') plt.axhline(y=b,ls='--',c='blue') -
有DOS攻击的信息熵
dos.py# Add_DoS_attack_dataset1 import pandas as pd import numpy as np import matplotlib.pyplot as plt # 读取csv文件 df = pd.read_csv('data/Add_DoS_attack_dataset1.csv', sep
-

本文介绍了一种针对车载网络的入侵检测方法,通过固定滑动窗口的信息熵监测算法和模拟退火优化策略,旨在减少工作量并提升检测精度。实验部分详细阐述了信息熵检测DoS攻击的实现,以及如何通过模拟退火改进窗口策略。
最低0.47元/天 解锁文章
2030





