区块链认识笔记

本文尚未完成

  • 区块链是啥?区块链它是一种无中心、分布式记录数据的技术。
  • 顾名思义,区块链由一个个区块组成链,在每个区块(除初始区块)中有自身的数据和上一个区块(父区块)的hash(和链表有相似之处)。因为父区块的hash是写在子区块中的,所以一旦子区块确定下来,父区块将不能被伪造或修改(目前sha1已经有办法碰撞了,不过sha256还是极难被碰撞到)。以比特币为例,一个区块包含区块头和区块体,区块头中有上个节点的hash、时间戳、Nonce、Merkle根等信息。
  • 由于区块链技术是无中心的,也不保证每个节点都是无恶意的,也就是说每个节点都需要达成一定的共识,通过这个共识来实现数据的记录。以比特币为例,每个节点都有全部的历史区块。假设大多数节点都是“理性”的,节点可以投入算力来新增区块来获得奖励,当一个新区块被发现并广播出去后,其余每个节点都会在新增的区块校验合法后加入到自己历史区块尾部并继续广播,如果有分叉,短的(算力弱的)分叉会被淘汰掉(6个节点之后),即恶意节点将无利可图。这样就有了能实现数据记录的共识,在无人掌控全网一半以上算力的情况下数据记录是可靠的。
    • “维护区块链的方式”(换言之就是写入区块链的资格)有POW(Proof of Work)、POS(Proof of Stake)等方式。比特币就是POW方式,谁的算大谁说了算,算力小的分支会被抛弃掉,它通过消耗算力获得话语权。PPCoin是POS方式,谁手里的币多,持有的时间长,谁就说了算。“币龄(coin days)”就多,它通过消耗币龄获得话语权(不用浪费电了:D)。
    • POW方式如何新增区块?以比特币为例,新增区块需要新区块头的hash符合条件即可。这个条件是hash值小于目标值,目标值由最大目标值(常量)除以难度系数得到的。通过改变区块头部的Nonce值(Nonce只有4字节,如果穷举Nonce后发现没有合适的值可以改变Merkle根的值,还不行就改变时间戳的值)来改变hash值,首先得到目标hash值的节点将得到一定数量(每4年减半,初始50个,现在是12.5个)的比特币(即节点自己写在Merkle树里的交易信息)。还有因为比特币设定每10分钟出现一个区块,所以难度系数会随着全网算力(即上个区块出现所花费的时间)调节。

参考资料

https://zh.wikipedia.org/wiki/%E5%8C%BA%E5%9D%97%E9%93%BE
http://www.ruanyifeng.com/blog/2017/12/blockchain-tutorial.html
http://zhibimo.com/read/wang-miao/mastering-bitcoin/index.html
http://www.8btc.com/what-is-blockchain

阿里三轮面试失败的记录

一面

一面是电话面试,首先是自我介绍,介绍自己大概情况,我简单介绍了一下,自己大四要毕业了,考研没考上。
然后介绍下简历中写到的项目,问的比较细,比方说多用户是怎么实现?答曰用json封装好数据,里面包含用户信息;
为什么用socket而不是用做一个web界面,答曰因为自己用做一个也没啥意义;
又问如果项目做大的话还有哪些方面要注意,如何解决高并发?我想了想说增加服务器配置,部署在多个服务器上实现分布式,改进代码等,也不知道靠不靠谱。
下面闲聊了几句,期望工作地点是哪,喜欢用什么语言,哪个更熟悉等。工作地点嘛只要是大城市就好,语言我也不挑(因为都学的不精啊)。
下面又是介绍另一个项目,为什么要做,做得比别人哪儿更好,实时视频传输用的什么开源项目,是否给该开源项目做了贡献。贡献还真有,当时那文档写错了我给改过来了,提交了个PR,被合并了。
接下来又是闲聊,介绍自己的优点,有什么爱好,最近关注什么。我说最近比较关注电动汽车,然后又聊了几句。
下面是问我个人在技术方面有什么优势,我回答说学东西比较快,并举了个例子,当年Python一个小时上手,没想到这里给自己挖了个坑,接下来问我Python相比C++和Java有啥理念比较突出的,我就答不上来了。
C++用的多吗,用过哪些类库?我回答栈队列、map、set,其使用的也不多,
在项目中遇到过什么困难,又是怎么解决的?我当时做项目还真踩了几个坑,mjpg-stream的文档有一处错的地方,当时没办法了看源码才找到问题,clone了一遍给他改对,又提交了个PR,被合并了,还被点了个star。
还有什么困难吗,还有,当时树莓派PWM波输出的bug我也遇上过,当时外接了个模块才解决的。
还有什么困难吗,真还有,在调试socket通信的时候被缓冲区坑过,通过搜索引擎搜索解决的。
Linux用的多吗,vim会用吗,用过,但是不熟。正则表达式会吗?用过,但是不熟。
未来几年工作怎么打算,对自己有什么期望?提高技术水平,争取在大城市立足。
对语言有要求吗?没要求。愿意来北京工作吗?愿意。愿意来现场面试吗,当然愿意。
第一面面的比较愉快,因为问的是与项目相关的,并且都不难。

二面

第二面就没这么轻松了,也是由于自己准备不充分导致的,感觉这次挂掉的大部分原因都在这里。
在西溪园区现场面的,面试官人很nice。中间有点记不清了,只对自己答不上来的和答得不好的印象比较深。
首先还是自我介绍,谈一谈对自己未来发展的计划,然后讲一下做过的项目,在讲的过程中问面向对象三大特征,我答不出来。
什么是多态,我举了C++中子类重写父类的虚函数的例子,当时表达不是很好,再加上面试官估计平时搞C++不如java多,说我这是继承不是多态。
Linux里怎么看发行版?当时忘了,毕竟不常用,在回去的路上想起来了,是uname -a。
Linux里怎么看磁盘分区情况?当时也忘了,猜了个fdisk,结果猜错了,正确答案是df。
怎么做ssh免登陆?我没理解这个是实现证书登陆的意思,回答了不知道。平时只用用户名密码登陆吗?也用证书。证书怎么配置?生成公钥和私钥,私钥自己留着,公钥放服务器里,再改ssh的配置文件就好了。
怎么看IP地址?我又把Windows的ipconfig和Linux的ifconfig搞混了,熟练度不够的锅。
http和https哪个好?那当然是https好,为什么?因为有加密,https在http上封装了一层,不能被截获和篡改。不能截获吗?其实能,不过得到的是加密过的,不容易得到里面的东西。什么情况下会得到?服务器私钥泄露了。
给你一个项目,要怎么样去做,怎么样算做好,感觉这里答得也不算好,团队协作刚开始没想起来,经过提示才加了上去。
你有什么要问我的?blablabla。
就这样,结束了二面。

三面

三面是电话面试,比较开门见山,简单介绍之后就问那个编程语言比较熟,我选了C。
C语言里的堆和栈怎么理解?堆是new出东西放的地方,栈是程序互相调用传参的地方,还举了个例子,递归太多会爆栈。
printf函数如果得到的参数只有”%s”,后面没有给字符串,会怎么样。会输出一块未知的内存区域。
为什么会这样,因为没给字符串的地址。
会有什么结果,这里把字符串地址当成0地址了,以为程序会崩溃,其实是随机地址,不一定会崩溃,答得不好。
再说点相关的,函数调用约定有没有印象?什么cdcall,fastcall?我不知道。
压参顺序知道吗?答曰从后往前,然后面试官给我讲了讲上个printf问题的原理。
long、int、short是占几位,我把long忘了,答平时要么用32位的int,要么64位的longlong。
如果print一个int,但是传入的是long long,会怎么样?会把longlong的一半当int输出。
print %d和%s,但是传入的是一个longlong和一个字符串首地址,会怎么样?我回答说后面的字符串输出不受影响,其实是longlong的后面32位被当做了字符串的首地址。然后面试官给我讲了讲这个问题的答案和原理。
acm比赛的内容是什么类型?给题意和数据,输出结果,blabla。
能写个strcpy吗,能啊,strcpy的参数是哪些,源地址、目标地址,长度(其实没有长度,经过提示才改过来)。具体怎么实现?开个内存区域拷就好了。
能让程序快一点吗,用memcpy,不用memcpy呢?呃呃每次考8个字节。
为什么你理解每次考8个字节要快?为什么一次非要8个字节?当时脑子不好使,大约把8个字符当longlong拷就刚好8个字节。
面试官又给我讲了讲这个问题的答案和原理,每次读总线宽度个bit,并且读的时候内存对其以提高cache的命中率,中间问了问编译器优化是在什么时候优化的?不知道。
如何获取当前设备每秒的吞吐量?呃能具体点么。了解现在内存的双通道吗,现在计算机处理能力的瓶颈是什么?CPU的处理速度主频,CPU和内存的通信速度,也就是外频。怎么测外频?我不知道。
知道机器的性能,如何使得程序的CPU占用率稳定在10%?在一个时间周期内执行一定数量的命令,数量到了就在这个时间周期内不再执行,具体实现的话,读内核时间,呃说不上来了。
面试官又给我讲了讲这个问题的答案和原理,大概意思和我想的差不多感觉。
在学计算机期间最有成就感的事情?中间我提到了一道算法题,结果给自己挖了个坑,说到后面卡壳了。
你有什么要问我的?blablabla。
嗯那好,保持通信畅通啊。
就这样,过了几天网站上显示已回绝。

总结

现阶段的主要问题是:

  1. 项目经验不足,只做过类似于玩具的项目;
  2. 没有一种比较深入的语言,接触到的东西都浅尝辄止。

尽快找到工作是解决这两个问题的办法。

简谈几种网站漏洞及其应对方式

用户密码存储

现在的网站几乎不再使用明文密码存储的方式了,而是改用只在数据库中存储明文密码的 hash。常见的 hash 算法有 MD5 和 SHA,可以从任何一段字符串计算出一段固定长度的哈希 值。这样当用户输入密码时,直接将该密码代入算法得出 hash 值,再与存储的 hash 值对比,相同则允许登录。用户注册时也是直接存储密码的 hash 值,而不是明文密码。这样就防止数据库泄露的时候导致用户明文密码泄露。 但是随着计算能力大幅提高,MD5 和 SHA1 算法已经不再推荐使用了,这些算法被碰撞 的几率已经越来越大了。而应该采用加盐的方式,比如说 SHA256 加 salt 后 使用 PBKDF2 算法处理,该算法计算消耗的 CPU 时间非常多,能大大减慢暴力破解速度。

XSS

XSS 漏洞跨站脚本攻击是常见的漏洞。其原理是攻击者向有 XSS 漏洞的网站中传入恶意的 HTML 和 JavaScript 代码,当其它用户浏览该网站时,JS 代码会自动执行,从而达到攻击的目的。比如盗取用户 Cookie 等。 常见的应对方式有过滤危险的 JavaScript 和 HTML 属性、对HTML输出进行转义等。

SQL 注入

SQL 注入攻击,也是 Web 开发中最常见的一种安全漏洞。可以用它来从数据库获取密码等信息,甚至有可能获取数据库等系统的 root 权限。造成 SQL 注入的原因是因为程序没有 有效过滤用户的输入,使攻击者成功的向服务器提交恶意的 SQL 查询代码,程序在接收后将攻击者的输入作为查询语句的一部分执行,导致原始的查询逻辑被改变,额外的执行了攻击者的代码。应对方式有输入过滤等。

CSRF

CSRF可以伪造受信任用户的请求来利用受信任的网站。攻击者可以在第三方网站hacker.com 设置代码,用户在浏览这些网页的时候向 victim.com 跨域发送数据,浏览器根据同源策略,带上了 victim.com 的 cookies,导致请求被伪造,可能造成很大的危害,比如添加管理员、修改密码等。通常的应对方法有对特定请求增加token验证,token是在Cookies 中读取的,而根据同源策略,hacker.com 是无法读取 victim.com 的 Cookies 的,这样就无法伪造 token。后端服务器只要对比 Cookies 中的 token 和请求头中的 token 是否一致就可以了。

简谈快充技术

以前移动设备的耗电量很小,电池容量也普遍不大。可如今电池一大再大,又不能让充电时间太长,于是便出现了增加电池充电速度的方法。
刚开始只是在USB接口提供电流的标准改改,从500mA一路增加到1500mA甚至2000mA。慢慢的2000mA也不够用了,如果电流再增加可能使Micro USB接口和数据线无法承受,于是厂家们就想了各种办法。
高通想了个提高电压的办法,将充电电压提高而电流不变从而增大功率,命名为Quick Charge 2.0(5V 2A就是QC1.0)。QC2.0方案可协商电压到5V、9V、12V、20V,而QC3.0则可在3.6V到20V之间以200mV增量为一档协商电压(A类方案不支持20V,通过D+和D-上的电压来协商)。
联发科也想了个差不多的办法,叫PUMP EXPRESS(PE,电压通过VBUS上的信号来协商)。

QC 3.0 和 PEP 2.0 是对上一代高压快充标准的升级,双方没有再对最高功率做大的升级,而是不约而同的将重点放在了提升效率上。
而配合 Type C 的标准,QC 3.0 和 PEP 2.0 分别对电压做了调低,并提出了精确电压管理的概念:电压都会控制在 9V 以下,利用 3A 数据线提高电流,提升降压路线的效率;其次不会是握手检测后,直接 5V 跳 9V 跳 12V,然后固定该电压一路冲到死,而是结合电池温度、实时转换效率、电池电量等因素,以 0.2V(QC)/0.5V(PE) 做精确动态调整,提升整体效率。
在精确管理的同时,还有个「恒功率」的概念——如从 8V=3A 调节到 6V=4A,功率不变电压降低,这些都是 QC 3.0 和 PEP 2.0 带来的新特性。当然高通和 MTK 的分歧还是有的,比如高通认为 0.2V 充电更精细,MTK 觉得 0.5V 步进就够了,手机电池就那么大,太精细有什么卵用?

其他一些移动设备厂家大都按照芯片商的方案实现快充,有的还给快充换个自己的名字。

USB Type C 协议修订了数据线规范,手机数据线从 2A 提到了 3A / 5A 两个级别,USB官方制定了USB PD充电协议,全称 USB Power DeliverySpecification,虽然现在没被普及,不过我个人认为他会成为主流技术。

对某种射频卡的简单安全探究

本文仅是对特定射频卡(RFID卡)在技术上的简单探究,请勿以此用作非法用途。

本次研究的RFID卡是Mifare1 S50卡(1K容量),符合ISO / IEC 14443型标准,其在国内比较常见,是由恩智浦公司(NXP)开发生产,亦有国产的兼容卡。

简介

这种卡片的就像一个强制加密的硬盘,密码和数据都存在硬盘里面,厂家出厂会把密码设置默认密码,FFFFFFFFFFFF。
其中一共有16个扇区,就像硬盘被分成了16个区,每个区都有独立的两个密码来管理,分别是A密码和B密码。两个密码的权限由控制位决定,一般情况只用A密码便能读写数据。另外有些控制位更改了后就不可逆转。
每个扇区又有四个块,就像一个分区面有四个文件一样,如下图。

扇区0的块0为制造商使用,并不可以更改,其中前4字节为卡片的UID,无需密码可读。(有一种国产M1卡可改UID,在国内叫UID卡,在国外叫 Chinese Magic Card 中国魔术卡)

漏洞

1.PRNG漏洞 :通过PRNG漏洞攻击,可获得0扇区密匙。

国外的安全研究人员发现,MIFARE Classic采用的是Crypto-1私有加密算法,其算法的特点就是对称式的密码算法或者说是私钥密码系统。其主要组成部分是伪随机数发生器(PRNG)、48位的线性反馈移位寄存器(LFSR)以及非线性函数。由于算法当中的Filter Function的设计出现缺陷,导致改变线性反馈移位寄存器的后8位数值就有可能得到所对应的Keystream。这个缺陷类似于802.11b WEP算法,不同的明文有极高的可能性被相同的Keystream,使得整个加密算法出现了漏洞。

2.嵌套认证漏洞 :使用任何一个扇区的已知密匙,获取所有扇区的密匙。

已知一个扇区的密钥,可以根据漏洞得到其它密钥的32位,然后对其它16位进行穷举攻击,该穷举耗时很短。

3.通信嗅探 :通过监听卡片和读卡设备的通讯获得密钥。

M1卡在读卡机和卡片交互数据和密码时,使用了crapto1算法。即便同一张卡,同样的密码,嗅探得到交互数据也是随机的,但是只要获得前面提到的四组随机数组,以及UID,就可以反解出密匙。

由于水平有限,漏洞的详细原理不叙述,感兴趣请自行搜索相关论文。:D

1235