2021第二届全国⼤学⽣⽹络安全精英赛赛事介绍
2021第二届全国⼤学⽣⽹络安全精英赛,指导单位为中国信息安全测评中⼼,主办⽅为国家⽹络空间安全⼈才培养基地。⼤赛以普及知识、挖掘⼈才为⼰任,⾯向全国⼤学⽣普及信息安全意识、传播信息安全知识、挖掘信息安全⼈才。
本次比赛分为3个阶段,参赛学员均已个人赛形式参加比赛。第一阶段为全国线上初赛,主要考察学生的信息安全知识水平;第二阶段为全国线上复赛,主要考察学生网络安全基础知识和基本技能;第三阶段为全国线下总决赛;具体如下:
1.1.全国初赛
初赛主要考察学生信息安全知识水平,资格赛为线上答题形式。
☑ 比赛时间:7月1日-9月10日报名,9月13日-17日全国初赛
☑ 参赛资格:全国各类高、中等院校在校学生
☑ 比赛形式:初赛由各个参赛院校组织学生至大赛官网自主报名,由当地承办机构组织安排初赛时间。
☑ 比赛题型:初赛为50道单选题。
☑ 比赛内容:内容包含:信息安全概述、信息安全法律法规、信息安全基础技术、网络安全防护技术、操作系统安全防护技术、应用安全、移动智能终端安全防护、信息安全管理。
☑ 通过条件:满分100分,竞赛成绩达到70分及以上。
1.2.全国复赛
全国复赛主要考察参赛选手网络安全基础知识和基本技能。
☑ 比赛时间:9月24日全国复赛
☑ 比赛形式:复赛为线上答题形式进行,参赛条件为初赛成绩达70分以上。
☑ 比赛题型:复赛为100道单选题,
☑ 比赛内容:信息安全支撑技术、物理与网络通信安全、计算机环境安全、软件安全开发。
☑ 通过条件:全国前100名通过参加线下总决赛
1.3.全国总决赛
全国总决赛为线下知识竞赛形式。
☑ 比赛时间:10月11日全国线下总决赛
☑ 比赛形式:决赛为线下知识答题赛,参赛条件为复赛全国成绩前100名。
☑ 比赛题型:总决赛为100道单选题,
☑ 比赛内容:信息安全支撑技术、物理与网络通信安全、计算机环境安全、软件安全开发等。
☑ 获奖条件:根据总决赛最终成绩排名,产生大学生网络安全竞赛金奖:10人;银奖:10人;铜奖:20人。
1.4.奖项设置
2021年第二届大学生网络安全竞赛共设奖金20万元。
金奖:10人,奖金10000元/人
银奖:10人,奖金5000元/人
铜奖:20人,奖金2500元/人
获得⼤赛⾦银铜牌的选⼿,可获得⼤赛协办单位腾讯安全、卓朗科技、 深信服等信息安全知名企业签约⼯作机会。
4. 大赛同期其他活动
本次大赛同期将进行一系列与相关的活动,主要活动如下:
1.1大学生网络安全知识精英赛校园大使招募
第二届全国大学生网络安全精英赛即将于2021年7月1日启动报名,9月网络安全周期间开赛。现在面向全国在校大学生招募校园大使。招募规则如下:
1.1.1.招募标准
具备⼀定的信息安全基础知识,擅长通过talkshow⼩段子、音乐创作、创意剪辑等各种才艺、方法传播信息安全知识、宣传网络安全精英赛的在校大学生。
1.1.2.招募平台
抖音APP
1.1.3.报名方式
1、开通抖音账号,并关注抖音官方号“网安精英赛”。
2、活动时间:2021年7月1日-2021年9月30日,10月11日公布获奖名单
3、拍摄与网络安全相关的短视频添加话题#网络安全精英赛#在抖音发布,并@网安精英赛 官方账号。
4、发动同学为自己的短视频点赞。
1.1.4.评选
大赛组委会邀请评委会评选作品,筛选出符合招募要求的作品,并按照点赞数排序,最终前十名入选的创作者将成为本届大学生网络安全精英赛校园大使。
1.1.5.公布
最终入选名单将在精英赛官网(https://www.nisp.org.cn/ds)公布。
1.1.6.表彰
成功当选校园大使的创作者,精英赛组委会将颁发聘书,并奖励华为 Mate 40E 手机一台(京东官方价4199元)。
1.2大学生网络安全知识精英赛答题接龙活动
校园大使招募活动同时,大赛组委会举办“网络安全精英赛·答题接龙”活动。
活动时间:2021年7月1日-2021年9月30日,10月11日公布获奖名单
参与在校大学生可登陆精英赛官网(https://www.nisp.org.cn/ds)学习网络安全辅导课程,并练习模拟题。
在抖音APP上传短视频,内容为回答一道网络安全模拟题,指定同学接龙。并以“大学生网络安全精英赛,你也来答题吧~”结尾。@网安精英赛 官方账号,参与抽奖。
奖品为华为WATCH GT 2 Pro 智能手表,共十个获奖名额(京东官网价2388元)。
先说一句:密码是无法解密的。大家也不要再问松哥微人事项目中的密码怎么解密了!
密码无法解密,还是为了确保系统安全。今天松哥就来和大家聊一聊,密码要如何处理,才能在最大程度上确保我们的系统安全。
1.为什么要加密
2011 年 12 月 21 日,有人在网络上公开了一个包含 600 万个 CSDN 用户资料的数据库,数据全部为明文储存,包含用户名、密码以及注册邮箱。事件发生后 CSDN 在微博、官方网站等渠道发出了声明,解释说此数据库系 2009 年备份所用,因不明原因泄露,已经向警方报案,后又在官网发出了公开道歉信。在接下来的十多天里,金山、网易、京东、当当、新浪等多家公司被卷入到这次事件中。整个事件中最触目惊心的莫过于 CSDN 把用户密码明文存储,由于很多用户是多个网站共用一个密码,因此一个网站密码泄露就会造成很大的安全隐患。由于有了这么多前车之鉴,我们现在做系统时,密码都要加密处理。
这次泄密,也留下了一些有趣的事情,特别是对于广大程序员设置密码这一项。人们从 CSDN 泄密的文件中,发现了一些好玩的密码,例如如下这些:
等等不一而足,你会发现很多程序员的人文素养还是非常高的,让人啧啧称奇。
2.加密方案
密码加密我们一般会用到散列函数,又称散列算法、哈希函数,这是一种从任何数据中创建数字“指纹”的方法。
散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来,然后将数据打乱混合,重新创建一个散列值。散列值通常用一个短的随机字母和数字组成的字符串来代表。好的散列函数在输入域中很少出现散列冲突。在散列表和数据处理中,不抑制冲突来区别数据,会使得数据库记录更难找到。
我们常用的散列函数有 MD5 消息摘要算法、安全散列算法(Secure Hash Algorithm)。
但是仅仅使用散列函数还不够,单纯的只使用散列函数,如果两个用户密码明文相同,生成的密文也会相同,这样就增加的密码泄漏的风险。
为了增加密码的安全性,一般在密码加密过程中还需要加盐,所谓的盐可以是一个随机数也可以是用户名,加盐之后,即使密码明文相同的用户生成的密码密文也不相同,这可以极大的提高密码的安全性。
传统的加盐方式需要在数据库中有专门的字段来记录盐值,这个字段可能是用户名字段(因为用户名唯一),也可能是一个专门记录盐值的字段,这样的配置比较繁琐。
Spring Security 提供了多种密码加密方案,官方推荐使用 BCryptPasswordEncoder,BCryptPasswordEncoder 使用 BCrypt 强哈希函数,开发者在使用时可以选择提供 strength 和 SecureRandom 实例。strength 越大,密钥的迭代次数越多,密钥迭代次数为 2^strength。strength 取值在 4~31 之间,默认为 10。
不同于 Shiro 中需要自己处理密码加盐,在 Spring Security 中,BCryptPasswordEncoder 就自带了盐,处理起来非常方便。
3.实践
3.1 codec 加密
commons-codec 是一个 Apache 上的开源项目,用它可以方便的实现密码加密。松哥在 V 部落 项目中就是采用的这种方案(https://github.com/lenve/VBlog)。在 Spring Security 还未推出 BCryptPasswordEncoder 的时候,commons-codec 还是一个比较常见的解决方案。
所以,这里我先来给大家介绍下 commons-codec 的用法。
首先我们需要引入 commons-codec 的依赖:
1.2. commons-codec 3.commons-codec 4.1.11 5.
然后自定义一个 PasswordEncoder:
1.@Component 2.public class MyPasswordEncoder implements PasswordEncoder { 3.@Override 4.public String encode(CharSequence rawPassword) { 5.return DigestUtils.md5DigestAsHex(rawPassword.toString(). 6.getBytes()); } 7.@Override 8.public boolean matches(CharSequence rawPassword, String encodedPassword) { 9.return encodedPassword.equals(DigestUtils.md5DigestAsHex(rawPassword.toString(). 10.getBytes())); 11. } 12.}
在 Spring Security 中,PasswordEncoder 专门用来处理密码的加密与比对工作,我们自定义 MyPasswordEncoder 并实现 PasswordEncoder 接口,还需要实现该接口中的两个方法:
最后记得将 MyPasswordEncoder 通过 @Component 注解标记为 Spring 容器中的一个组件。
这样用户在登录时,就会自动调用 matches 方法进行密码比对。
当然,使用了 MyPasswordEncoder 之后,在用户注册时,就需要将密码加密之后存入数据库中,方式如下:
1.public int reg(User user) { 2.... 3.//插入用户,插入之前先对密码进行加密 4.user.setPassword(passwordEncoder.encode(user.getPassword())); 5.result = userMapper.reg(user); 6.... 7.}
其实很简单,就是调用 encode 方法对密码进行加密。完整代码大家可以参考 V 部落(https://github.com/lenve/VBlog),我这里就不赘述了。
3.2 BCryptPasswordEncoder 加密
但是自己定义 PasswordEncoder 还是有些麻烦,特别是处理密码加盐问题的时候。
所以在 Spring Security 中提供了 BCryptPasswordEncoder,使得密码加密加盐变得非常容易。只需要提供 BCryptPasswordEncoder 这个 Bean 的实例即可,微人事就是采用了这种方案(https://github.com/lenve/vhr),如下:
1.@Bean 2.PasswordEncoder passwordEncoder() { 3.return new BCryptPasswordEncoder(10); 4.}
创建 BCryptPasswordEncoder 时传入的参数 10 就是 strength,即密钥的迭代次数(也可以不配置,默认为 10)。同时,配置的内存用户的密码也不再是 123 了,如下:
1.auth.inMemoryAuthentication() 2..withUser("admin") 3..password("$2a$10$RMuFXGQ5AtH4wOvkUqyvuecpqUSeoxZYqilXzbz50dceRsga.WYiq") 4..roles("ADMIN", "USER") 5..and() 6. .withUser("sang") 7..password("$2a$10$eUHbAOMq4bpxTvOVz33LIehLe3fu6NwqC9tdOcxJXEhyZ4simqXTC") 8..roles("USER");
这里的密码就是使用 BCryptPasswordEncoder 加密后的密码,虽然 admin 和 sang 加密后的密码不一样,但是明文都是 123。配置完成后,使用 admin/123 或者 sang/123 就可以实现登录。
本案例使用了配置在内存中的用户,一般情况下,用户信息是存储在数据库中的,因此需要在用户注册时对密码进行加密处理,如下:
1.@Service 2.public class RegService { 3.public int reg(String username, String password) { 4.BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(10); 5.Str 6.ing encodePasswod = encoder.encode(password); 7.return saveToDb(username, encodePasswod); } 8.}
用户将密码从前端传来之后,通过调用 BCryptPasswordEncoder 实例中的 encode 方法对密码进行加密处理,加密完成后将密文存入数据库。
4.源码浅析
最后我们再来稍微看一下 PasswordEncoder。
1.public interface PasswordEncoder { 2.String encode(CharSequence rawPassword); 3.boolean matches(CharSequence rawPassword, String encodedPassword); 4.default boolean upgradeEncoding(String encodedPassword) { 5.return false; 6.} 7.}
Spring Security 为 PasswordEncoder 提供了很多实现:
但是老实说,自从有了 BCryptPasswordEncoder,我们很少关注其他实现类了。
PasswordEncoder 中的 encode 方法,是我们在用户注册的时候手动调用。
matches 方法,则是由系统调用,默认是在 DaoAuthenticationProvider#additionalAuthenticationChecks 方法中调用的。
1.protected void additionalAuthenticationChecks(UserDetails userDetails, 2.UsernamePasswordAuthenticationToken authentication) 3.throws AuthenticationException { 4.if (authentication.getCredentials() == null) { 5.logger.debug("Authentication failed: no credentials provided"); 6.throw new BadCredentialsException(messages.getMessage( 7."AbstractUserDetailsAuthenticationProvider.badCredentials", 8."Bad credentials")); 9.} 10.String presentedPassword = authentication.getCredentials().toString(); 11.if (!passwordEncoder.matches(presentedPassword, userDetails.getPassword())) { 12.logger.debug("Authentication failed: password does not match stored value"); 13.throw new BadCredentialsException(messages.getMessage( 14."AbstractUserDetailsAuthenticationProvider.badCredentials", 15."Bad credentials")); 16.} 17.}
可以看到,密码比对就是通过 passwordEncoder.matches 方法来进行的。
加入NISP、CISP课程学习网络安全行业
报考联系人nisp证书管理中心丹丹老师
微信号:nisptest/13520967307
先说一句:密码是无法解密的。大家也不要再问松哥微人事项目中的密码怎么解密了!
密码无法解密,还是为了确保系统安全。今天松哥就来和大家聊一聊,密码要如何处理,才能在最大程度上确保我们的系统安全。
1.为什么要加密
2011 年 12 月 21 日,有人在网络上公开了一个包含 600 万个 CSDN 用户资料的数据库,数据全部为明文储存,包含用户名、密码以及注册邮箱。事件发生后 CSDN 在微博、官方网站等渠道发出了声明,解释说此数据库系 2009 年备份所用,因不明原因泄露,已经向警方报案,后又在官网发出了公开道歉信。在接下来的十多天里,金山、网易、京东、当当、新浪等多家公司被卷入到这次事件中。整个事件中最触目惊心的莫过于 CSDN 把用户密码明文存储,由于很多用户是多个网站共用一个密码,因此一个网站密码泄露就会造成很大的安全隐患。由于有了这么多前车之鉴,我们现在做系统时,密码都要加密处理。
这次泄密,也留下了一些有趣的事情,特别是对于广大程序员设置密码这一项。人们从 CSDN 泄密的文件中,发现了一些好玩的密码,例如如下这些:
等等不一而足,你会发现很多程序员的人文素养还是非常高的,让人啧啧称奇。
2.加密方案
密码加密我们一般会用到散列函数,又称散列算法、哈希函数,这是一种从任何数据中创建数字“指纹”的方法。
散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来,然后将数据打乱混合,重新创建一个散列值。散列值通常用一个短的随机字母和数字组成的字符串来代表。好的散列函数在输入域中很少出现散列冲突。在散列表和数据处理中,不抑制冲突来区别数据,会使得数据库记录更难找到。
我们常用的散列函数有 MD5 消息摘要算法、安全散列算法(Secure Hash Algorithm)。
但是仅仅使用散列函数还不够,单纯的只使用散列函数,如果两个用户密码明文相同,生成的密文也会相同,这样就增加的密码泄漏的风险。
为了增加密码的安全性,一般在密码加密过程中还需要加盐,所谓的盐可以是一个随机数也可以是用户名,加盐之后,即使密码明文相同的用户生成的密码密文也不相同,这可以极大的提高密码的安全性。
传统的加盐方式需要在数据库中有专门的字段来记录盐值,这个字段可能是用户名字段(因为用户名唯一),也可能是一个专门记录盐值的字段,这样的配置比较繁琐。
Spring Security 提供了多种密码加密方案,官方推荐使用 BCryptPasswordEncoder,BCryptPasswordEncoder 使用 BCrypt 强哈希函数,开发者在使用时可以选择提供 strength 和 SecureRandom 实例。strength 越大,密钥的迭代次数越多,密钥迭代次数为 2^strength。strength 取值在 4~31 之间,默认为 10。
不同于 Shiro 中需要自己处理密码加盐,在 Spring Security 中,BCryptPasswordEncoder 就自带了盐,处理起来非常方便。
3.实践
3.1 codec 加密
commons-codec 是一个 Apache 上的开源项目,用它可以方便的实现密码加密。松哥在 V 部落 项目中就是采用的这种方案(https://github.com/lenve/VBlog)。在 Spring Security 还未推出 BCryptPasswordEncoder 的时候,commons-codec 还是一个比较常见的解决方案。
所以,这里我先来给大家介绍下 commons-codec 的用法。
首先我们需要引入 commons-codec 的依赖:
1.2. commons-codec 3.commons-codec 4.1.11 5.
然后自定义一个 PasswordEncoder:
1.@Component 2.public class MyPasswordEncoder implements PasswordEncoder { 3.@Override 4.public String encode(CharSequence rawPassword) { 5.return DigestUtils.md5DigestAsHex(rawPassword.toString(). 6.getBytes()); } 7.@Override 8.public boolean matches(CharSequence rawPassword, String encodedPassword) { 9.return encodedPassword.equals(DigestUtils.md5DigestAsHex(rawPassword.toString(). 10.getBytes())); 11. } 12.}
在 Spring Security 中,PasswordEncoder 专门用来处理密码的加密与比对工作,我们自定义 MyPasswordEncoder 并实现 PasswordEncoder 接口,还需要实现该接口中的两个方法:
最后记得将 MyPasswordEncoder 通过 @Component 注解标记为 Spring 容器中的一个组件。
这样用户在登录时,就会自动调用 matches 方法进行密码比对。
当然,使用了 MyPasswordEncoder 之后,在用户注册时,就需要将密码加密之后存入数据库中,方式如下:
1.public int reg(User user) { 2.... 3.//插入用户,插入之前先对密码进行加密 4.user.setPassword(passwordEncoder.encode(user.getPassword())); 5.result = userMapper.reg(user); 6.... 7.}
其实很简单,就是调用 encode 方法对密码进行加密。完整代码大家可以参考 V 部落(https://github.com/lenve/VBlog),我这里就不赘述了。
3.2 BCryptPasswordEncoder 加密
但是自己定义 PasswordEncoder 还是有些麻烦,特别是处理密码加盐问题的时候。
所以在 Spring Security 中提供了 BCryptPasswordEncoder,使得密码加密加盐变得非常容易。只需要提供 BCryptPasswordEncoder 这个 Bean 的实例即可,微人事就是采用了这种方案(https://github.com/lenve/vhr),如下:
1.@Bean 2.PasswordEncoder passwordEncoder() { 3.return new BCryptPasswordEncoder(10); 4.}
创建 BCryptPasswordEncoder 时传入的参数 10 就是 strength,即密钥的迭代次数(也可以不配置,默认为 10)。同时,配置的内存用户的密码也不再是 123 了,如下:
1.auth.inMemoryAuthentication() 2..withUser("admin") 3..password("$2a$10$RMuFXGQ5AtH4wOvkUqyvuecpqUSeoxZYqilXzbz50dceRsga.WYiq") 4..roles("ADMIN", "USER") 5..and() 6. .withUser("sang") 7..password("$2a$10$eUHbAOMq4bpxTvOVz33LIehLe3fu6NwqC9tdOcxJXEhyZ4simqXTC") 8..roles("USER");
这里的密码就是使用 BCryptPasswordEncoder 加密后的密码,虽然 admin 和 sang 加密后的密码不一样,但是明文都是 123。配置完成后,使用 admin/123 或者 sang/123 就可以实现登录。
本案例使用了配置在内存中的用户,一般情况下,用户信息是存储在数据库中的,因此需要在用户注册时对密码进行加密处理,如下:
1.@Service 2.public class RegService { 3.public int reg(String username, String password) { 4.BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(10); 5.Str 6.ing encodePasswod = encoder.encode(password); 7.return saveToDb(username, encodePasswod); } 8.}
用户将密码从前端传来之后,通过调用 BCryptPasswordEncoder 实例中的 encode 方法对密码进行加密处理,加密完成后将密文存入数据库。
4.源码浅析
最后我们再来稍微看一下 PasswordEncoder。
1.public interface PasswordEncoder { 2.String encode(CharSequence rawPassword); 3.boolean matches(CharSequence rawPassword, String encodedPassword); 4.default boolean upgradeEncoding(String encodedPassword) { 5.return false; 6.} 7.}
Spring Security 为 PasswordEncoder 提供了很多实现:
但是老实说,自从有了 BCryptPasswordEncoder,我们很少关注其他实现类了。
PasswordEncoder 中的 encode 方法,是我们在用户注册的时候手动调用。
matches 方法,则是由系统调用,默认是在 DaoAuthenticationProvider#additionalAuthenticationChecks 方法中调用的。
1.protected void additionalAuthenticationChecks(UserDetails userDetails, 2.UsernamePasswordAuthenticationToken authentication) 3.throws AuthenticationException { 4.if (authentication.getCredentials() == null) { 5.logger.debug("Authentication failed: no credentials provided"); 6.throw new BadCredentialsException(messages.getMessage( 7."AbstractUserDetailsAuthenticationProvider.badCredentials", 8."Bad credentials")); 9.} 10.String presentedPassword = authentication.getCredentials().toString(); 11.if (!passwordEncoder.matches(presentedPassword, userDetails.getPassword())) { 12.logger.debug("Authentication failed: password does not match stored value"); 13.throw new BadCredentialsException(messages.getMessage( 14."AbstractUserDetailsAuthenticationProvider.badCredentials", 15."Bad credentials")); 16.} 17.}
可以看到,密码比对就是通过 passwordEncoder.matches 方法来进行的。
加入NISP、CISP课程学习网络安全行业
报考联系人nisp证书管理中心丹丹老师
微信号:nisptest/13520967307