王玉斌者,蓝杰1020组成员也。征战ACM亚洲赛,获金奖,享誉中南信息院。余听其讲PPT两次,由浅入深,通俗易懂,颇有感触,遂总结一下,发到博客中来,与诸君共勉。
最近的一次PPT讲解是对MD5暴力碰撞的分析,因为需要处理大量的数据,蓝杰组建Hadoop集群对简单的密码进行蛮力破解试验。他的讲解是基于这样的一个背景下而来的。
首先玉斌对我们经常遇到的一个现象,在QQ中传送文件时这一现象进行了互动,为什么我们在传一个大的文件,瞬间就传上去了。讨论的大概结果是在腾讯的服务器中存了这么一个文件,在传输的过程中服务器会进行检测,服务器中是否有这么一个文件存在,而且在互动中,我中枪了。当玉斌问到是否与文件名有关时,就回答了一个有关,于是他改了个文件名,然后也是很快就传过去了(这里附一个:传输的文件是JDK,这东东腾讯服务器中肯定存在了)。于是问题抛出,腾讯是如何做的呢?
而后,使用了现实中的两个Boy争抢一个Girl的例子,对网络传输中的安全性问题又抛出了疑问?那这两个问题我们可以采用什么样的方式解决呢?于是有了数字摘要这一概念的出炉,这张PPT中将数字摘要类比为一个函数的功能。MD5就是这样一套算法,你给我一个文件,我给你映射成为一个128位的东东,这样你就可以直接使用这个东西来进行校验,刚刚抛出的两个问题也可以使用这样的方法解决(不过腾讯是不是这样做的我们不知道~~)
随后怎么去构建这个MD5映射,于是玉斌敲了几行代码进去,简单的测试了一下,下面的代码是后来我写的,跟他当时写的出入不大,代码如下:
package MD5Test;
import java.security.NoSuchAlgorithmException;
/**
* Message Digest Algorithm MD5(消息摘要算法第五版) 测试类
* @author 赵广超
*/
public class MD5Test {
public static void main(String[] args) {
java.security.MessageDigest md5;
try {
md5 = java.security.MessageDigest.getInstance("MD5");
String msg = "123456";
byte digest[] = md5.digest(msg.getBytes());
//这里要将byte转化为16进制数
for(int t : digest) {
String hex = Integer.toHexString(t&0xff);
if(hex.length() ==1 ){
System.out.print("0"+hex);
}else{
System.out.print(hex);
}
}
System.out.println();//换个行
//再来一种将byte转化为16进制显示的方法
for(int t:digest){
//或者用下面的方法
//这里t是整型,用0xff与后变成只剩后两位的byte了
System.out.print(String.format("%02x", t & 0xff));
}
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
}
控制台输出的结果是(代码中写了两种输出的方式,所以下面有两行):
e10adc3949ba59abbe56e057f20f883e
e10adc3949ba59abbe56e057f20f883e
网络上的MD5加密/解密网站给出的结果:
然后大家可能会有疑惑,网络上那么多的数据,怎能保证每一个不同的文件都有不同的MD5值呢?然后玉斌用了淘宝图片的例子,结合数学中比较大小时常用的放大缩小的方法进行了解释,PPT如下:
如此下来,说明了MD5值不是不会遇到重复的情况,只是这个概率小的很多很多,远远小于我们买彩票中奖的概率,这样我们用它起来也就没有那么多的担心了。然后玉斌又提出了一个不可逆和不可解的问题出来,因为这直接关系到我们要解决的暴力破解的问题。
如PPT中所述,枚举部分MD5值对应的密码,我们所需要处理的数据需要50个G并且需要超强的计算能力,所以为“蓝云”小组的成立和Hadoop集群的搭建做好了铺垫。
经过他这么一讲,我很快就明白了MD5是个啥东东,云计算平台可以做些什么东东,听完其讲解,三万六千个毛孔,通体透着明白后的“爽”。这次讲解之中,我们可以很容易的看出他准备的很充分,讲的很投入,也讲的很透彻。现在就做一个小小的总结,希望自己也能达到他讲PPT时的那种境界。
如果要我来分析make PPT时的设计思路,首先得明白讲的是什么?为什么要讲这个(基于什么的大环境)?怎样组织思路去讲?那么我得看到要讲的这个东西解决了现实中的什么问题,人是活在现实中的,往往与自身密切相关的东西会更加引起注意,以身边发生的案例来进行说明可以有效的吸引听众,比如现实中我们使用QQ聊天过程中经常需要传数据,逛淘宝时看过的无数图片和现阶段听众(学生)最关注的男女朋友话题。从现实中提升起来,那么这个MD5的本质是什么?消息摘要。是如何实现的?这就要讲求知识屏蔽了,如果要把MD5算法是怎么实现的讲出来,那估计需要花大力气去研究,而且还不一定能够讲清楚。而这里我们也不需要做这一步,在这里我们只需要知道怎么用就好了(就好像我用PS修改图片,并不需要知道PS软件是如何实现的),于是java中如何实现的代码到了PPT上。在深入思考后发现这个东西有个问题,即不同文件的MD5值是否是不同的呢?于是带着验证的思路,搜了一些资料,利用淘宝图片的例子和中彩票很难的例子,说明发生的几率很小,过多的担心是没有必要的。最后结合大环境,我们要进行对MD5简单密码的暴力破解,需要大量的计算能力,于是需要将机器互联。
以下是我对讲解PPT的思考与总结:
1. PPT的设计思路要条理,连贯性要强。
在什么样的情况下会提出所讲内容的问题;
所讲内容的实质是什么;
怎样去解决问题;
这样的解决方案是否会有不合理性,如何验证;
还可以解决其他的什么问题。
2. 对某一难以理解的问题,不妨用现实中的例子来进行阐释。
3. 需要注意知识屏蔽。
4. PPT的画面感要好,深蓝渐变色(乔布斯使用过的),黑体、微软雅黑很不错,最好一张PPT的色调不超三种(简约美)。
5. 讲解前的准备工作很重要。
6. 讲解的语气、神态等等很重要。
就分析到这里吧,再有思考了写!想到了一个词“象征性结束”,技术这东西,对一个知识点的理解,完全透彻的搞明白不太容易。“结束”这个词用在技术学习上不太适用。
感谢王玉斌同学的讲解和允许我在博客中直接引用他的名字。
——2013年1月26日凌晨记于刘洋寝室
相关推荐
python自学教程-04-自定义JavaScript.ev4.rar
严蔚敏数据结构全套C语言实现
Java_Android的可扩展媒体播放器
源代码-DBAdmin 在线Access数据库管理程序 v2.3.zip
Apache Dubbo的java实现RPC和微服务框架
ubuntu20.04下编译mysql驱动项目源码,编译项目驱动后拷贝到对应位置 scp libqsqlmysql.so /home/pc/Qt5.14.2/Tools/QtCreator/lib/Qt/plugins/sqldrivers scp libqsqlmysql.so /home/pc/Qt5.14.2/5.14.2/gcc_64/plugins/sqldrivers sudo scp libqsqlmysql.so /usr/lib/x86_64-linux-gnu
数据分析是一个复杂而系统的过程
我么采用几个黄磊经重新生成萨沙时常
startup_stm32f10系列的startup_stm32f10x_cl.s startup_stm32f10x_hd.s startup_stm32f10x_hd_vl.s startup_stm32f10x_ld.s startup_stm32f10x_ld_vl.s startup_stm32f10x_md.s startup_stm32f10x_md_vl.s startup_stm32f10x_xl.s
本项目是课程设计课程实验的demo,内含源码和说明书,可以自己修改
本项目是课程设计课程实验的demo,内含源码和说明书,可以自己修改
Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
麦肯锡图表绘制培训.pptx
内容概要:资料包括6门线上视频课程,有TypeScript 类型体操通关秘籍与TypeScript全面进阶指南、Vue3+React18+TS4入门到实战系统学习、前端实战训练营、前端架构师、以及两门知名教育机构线下就业班视频。 适用人群:想从事前端开发的大学学生、转行it的从业者、提高自己前端开发技能的从业者以及进阶架构师的程序员。 使用场景及目标:线上视频教程,目标是学习前端知识以及掌握最新前端技术。 其他:由于视频文件内存过大,文件为网盘链接,下载后复制到网盘获取即可,如有疑问可联系客服,谢谢。
javaee/javaweb常用jar包,亲测可用,导入到java工程中即可使用
Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。