本文目录一览:
添加配置是什么意思?
VPN是什么?
VPN的英文全称是“Virtual Private Network”,翻译过来就是“虚拟专用网络”。顾名思义,虚拟专用网络我们可以把它理解成是虚拟出来的内部专线。通过一个公用网络(通常是因特网)建立一个临时的、安全的连接,是一条穿过混乱的公用网络的安全、稳定隧道,使用这条隧道可以对数据进行几倍加密达到安全使用互联网的目的。VPN技术原是路由器具有的重要技术之一,目前在交换机,防火墙设备或Windows 2000等软件里也都支持VPN功能,一句话,VPN的核心就是在利用公共网络建立虚拟私有网。VPN主要采用隧道技术、加密技术、密钥管理技术和使用者与设备身份认证技术。
如果说你看不懂上面那段话,没关系,因为这丝毫不会影响你对它的使用。你就知道VPN是一个虚拟的专用的网络,它无需铺实物理线路,只要你有一个VPN账号,就可以在世界各地任意自由连接,借助于Internet技术而实现远程互联。所以会更安全、更专业、更自由。
VPN有什么用?
一、访问外网
大家知道,为了社会的和谐,我们在国内是无法访问某些国外网站的,而很多人为了学习与交流,需要访问比如twitter、facebook、youtube等网站,那么你该怎么做呢? 有人会说,通过代理上网,网上有一些免费在线代理上网的服务,可以试试。我只能说这是个权益之计,因为用在线代理上网,有很大的局限性。比如说网站打开速度超慢、网页广告超多、关键网页打不开(登录页面及评论页面)等等,更重要的是安全性得不到保障。所以在线代理只能用于临时性的访问网站,想要经常性、长久性的访问,在线代理是远远满足不了要求的。
然而如果你拥有VPN的话,一切就不用那么复杂了,连接上VPN后,国外的网站任由你访问,速度快、无广告、无限制,你可以自由的打开FaceBook、Twitter、Youtube等网站。当然,有些场合中使用VPN还是出于安全的考虑(如企业分公司之间)。
温馨提示:使用VPN期间,请遵守国家相应的法律法规,勿传播反 动、色 情、暴 力的资讯,也不能利用VPN盗用他人账户侵犯他人隐私。
二、提升网速
1、加快访问国外网站的速度:由于我国的国际出口带宽较小的原因,与国外(泛指中国大陆之外的网络)相互访速度非常慢,使用VPN便可加快出国访问网站的速度。
2、由于国内的电信运行商之间特殊的原因,导致南北网络互访很慢(网通和电信之间,网通和教育网之间,网通和铁通、联通之间,电信和教育网之间...)。
实用案例:网游加速
举个例子,如果你是玩网络游戏的,一定知道某款游戏在不同的地域,都会有相应服务器,而我们在选择服务器的时候,往往会选择自己所在地域的服务器,原因是自己地域的服务器对自己来说,速度肯定是最快的。然而有时候,某款游戏没有在自己所在地域放置服务器,比如说韩服、美服、台服等外服网游和部分国服网游。这时候,如果只凭我们自己上网的网络,要不连不上,要不延迟高,而且有时会掉线,而如果我们拥有VPN,就可以轻松连上我们想去的服务器。
三、更换ip地址
如果你由于某些原因要更换或隐藏你的真实IP地址,这时如果拥有一个VPN账号,我们就可以随意切换IP。而且有时候,变换IP地址,来保护自己的真实网络信息,也是必要的。
四、数据加密
VPN通过建立一个隧道,利用加密技术对传输数据进行加密,防止你的数据在传输过程中被黑客或不法之徒截取,以保证数据的私有性和安全性。这个一般用于重要文件的传输,如企业内部的文件传输等。
如何拥有VPN?
一、自己搭建:需要一定的资本和技术,适合各大公司企业,对大多数人普通网民来说并不现实。
二、使用免费VPN或付费VPN:一般来讲免费的VPN会有时间或流量的限制,适合偶尔使用的用户,如果是需要经常用到VPN,那么建议购买VPN服务。
如何使用VPN?
要想设置使用VPN,前提是你得有VPN账号,否者就是空谈……
如何设计安全的用户登录功能
Web上的用户登录功能应该是最基本的功能了,可是在我看过一些站点的用户登录功能后,我觉得很有必要写一篇文章教大家怎么来做用户登录功能。下面的文章告诉大家这个功能可能并没有你所想像的那么简单,这是一个关系到用户安全的功能,希望大家能从下面的文章中能知道什么样的方法才是一个好的用户登录功能。
用户名和口令
首先,我们先来说说用户名和口令的事。这并不是本站第一次谈论这个事了。如何管理自己的口令让你知道怎么管理自己的口令,破解你的口令让你知道在现代这样速度的计算速度下,用穷举法破解你的口令可能会是一件很轻松的事。在这里我想告诉从开发者的角度上来做设计这个用户名和口令的事。下面一几件规则:
限制用户输入一些非常容易被破解的口令。如什么qwert,123456, password之类,就像twitter限制用户的口令一样做一个口令的黑名单。另外,你可以限制用户口令的长度,是否有大小写,是否有数字,你可以用你的程序做一下校验。当然,这可能会让用户感到很不爽,所以,现在很多网站都提供了UX让用户知道他的口令强度是什么样的(比如这个有趣的UX),这样可以让用户有一个选择,目的就是告诉用户——要想安全,先把口令设得好一点。
千万不要明文保存用户的口令。正如如何管理自己的口令所说的一样,很多时候,用户都会用相同的ID相同的口令来登录很多网站。所以,如果你的网站明文保存的话,那么,如果你的数据被你的不良员工流传出去那对用户是灾难性的。所以,用户的口令一定要加密保存,最好是用不可逆的加密,如MD5或是SHA1之类的有hash算法的不可逆的加密算法。CSDN曾明文保存过用户的口令。(另,对于国内公司的品行以及有关部门的管理方式,我不敢保证国内网站以加密的方式保存你的口令。我觉得,做为一个有良知的人,我们应该加密保存用户的口令)
是否让浏览器保存口令。我们有N多的方法可以不让浏览器保存用户名和口令。但是这可能对用户来说很不爽。因为在真实世界里谁也记得不住那么多的口令。很多用户可能会使用一些密码管理工具来保存密码,浏览器只是其中一种。是否让浏览器保存这个需要你做决定,重点是看一下你的系统的安全级别是否要求比较高,如果是的话,则不要让浏览器保存密码,并在网站明显的位置告诉用户——保存口令最安全的地方只有你的大脑。
口令在网上的传输。因为HTTP是明文协议,所以,用户名和口令在网上也是明文发送的,这个很不安全。你可以看看这篇文章你就明白了。要做到加密传输就必需使用HTTPS协议。但是,在中国还是有很多网站的Web登录方式还在使用ActiveX控件,这可能成为IE6还大量存在的原因。我通常理解为这些ActiveX控件是为了反键盘记录程序的。不过,我依然觉ActiveX控件不应该存在,因为在国外的众多安全很重要的站点上都看不到ActiveX的控件的身影。
用户登录状态
首先,我想告诉大家的是,因为HTTP是无状态的协议,也就是说,这个协议是无法记录用户访问状态的,其每次请求都是独立的无关联的,一笔是一笔。而我们的网站都是设计成多个页面的,所在页面跳转过程中我们需要知道用户的状态,尤其是用户登录的状态,这样我们在页面跳转后我们才知道是否可以让用户有权限来操作一些功能或是查看一些数据。
所以,我们每个页面都需要对用户的身份进行认证。当然,我们不可能让用户在每个页面上输入用户名和口令,这会让用户觉得我们的网站相当的SB。为了实现这一功能,用得最多的技术就是浏览器的cookie,我们会把用户登录的信息存放在客户端的cookie里,这样,我们每个页面都从这个cookie里获得用户是否登录的信息,从而达到记录状态,验证用户的目的。但是,你真的会用cookie吗?下面是使用cookie的一些原则。
千万不要在cookie中存放用户的密码。加密的密码都不行。因为这个密码可以被人获取并尝试离线穷举。所以,你一定不能把用户的密码保存在cookie中。我看到太多的站点这么干了。
正确设计“记住密码”。这个功能简直就是一个安全隐患,我觉得并不是所有的程序员都知道怎么设计这个事。一般的设计是——一时用户勾选了这个功能,系统会生成一个cookie,cookie包括用户名和一个固定的散列值,这个固定的散列值一直使用。这样,你就可以在所有的设备和客户上都可以登录,而且可以有多个用户同时登录。这个并不是很安全。下面是一些更为安全的方法供你参考:
(——更新 2011/08/26,原文中有些小错误,并且说的不清楚,重新调整了一下——)
1)在cookie中,保存三个东西——用户名,登录序列,登录token。
用户名:明文存放。
登录序列:一个被MD5散列过的随机数,仅当强制用户输入口令时更新(如:用户修改了口令)。
登录token:一个被MD5散列过的随机数,仅一个登录session内有效,新的登录session会更新它。
2)上述三个东西会存在服务器上,服务器的验证用户需要验证客户端cookie里的这三个事。
3)这样的设计会有什么样的效果,会有下面的效果,
a)登录token是单实例登录。意思就是一个用户只能有一个登录实例。
b)登录序列是用来做盗用行为检测的。如果用户的cookie被盗后,盗用者使用这个cookie访问网站时,我们的系统是以为是合法用户,然后更新“登录token”,而真正的用户回来访问时,系统发现只有“用户名”和“登录序列”相同,但是“登录token”不对,这样的话,系统就知道,这个用户可能出现了被盗用的情况,于是,系统可以清除并更改登录序列 和 登录token,这样就可以令所有的cookie失效,并要求用户输入口令。并给警告用户系统安全。
4)当然,上述这样的设计还是会有一些问题,比如:同一用户的不同设备登录,甚至在同一个设备上使用不同的浏览器保登录。一个设备会让另一个设备的登录token和登录序列失效,从而让其它设备和浏览器需要重新登录,并会造成cookie被盗用的假象。所以,你在服务器服还需要考虑- IP 地址,
a)如果以口令方式登录,我们无需更新服务器的“登录序列”和 “登录token”(但需要更新cookie)。因为我们认为口令只有真正的用户知道。
b)如果 IP相同 ,那么,我们无需更新服务器的“登录序列”和 “登录token”(但需要更新cookie)。因为我们认为是同一用户有同一IP(当然,同一个局域网里也有同一IP,但我们认为这个局域网是用户可以控制的。网吧内并不推荐使用这一功能)。
c)如果(IP不同 没有用口令登录),那么,“登录token”就会在多个IP间发生变化(登录token在两个或多个ip间被来来回回的变换),当在一定时间内达到一定次数后,系统才会真正觉得被盗用的可能性很高,此时系统在后台清除“登录序列”和“登录token“,让Cookie失效,强制用户输入口令(或是要求用户更改口令),以保证多台设备上的cookie一致。
不要让cookie有权限访问所有的操作。否则就是XSS攻击,这个功能请参看新浪微博的XSS攻击。下面的这些功能一定要用户输入口令:
1)修改口令。
2)修改电子邮件。(电子邮件通过用来找回用户密码)
3)用户的隐私信息。
4)用户消费功能。
权衡Cookie的过期时间。如果是永不过期,会有很不错的用户体验,但是这也会让用户很快就忘了登录密码。如果设置上过期期限,比如2周,一个月,那么可能会好一点,但是2周和一个月后,用户依然会忘了密码。尤其是用户在一些公共电脑上,如果保存了永久cookie的话,等于泄露了帐号。所以,对于cookie的过期时间我们还需要权衡。
找回口令的功能
找回口令的功能一定要提供。但是很多朋友并不知道怎么来设计这个功能。我们有很多找回口令的设计,下面我逐个点评一下。
千万不要使用安全问答。事实证明,这个环节很烦人,而且用户并不能很好的设置安全问答。什么,我的生日啊,我母亲的生日,等等。因为今天的互联网和以前不一样了,因为SNS,今天的互联比以前更真实了,我可以上facebook,开心,人人网,LinkedIn查到你的很多的真实的信息。通过这些信息我可以使用安全问答来重设你的口令。这里需要说一下 Facebook,Facebook的安全问答很强大,还要你通过照片认人,呵呵。
不要重置用户的密码。因为这有可能让用户的密码遭到恶意攻击。当然,你要发个邮件给用户让其确认,用户点击邮件中的一个链接,你再重置。我并不推荐这样的方法,因为用户一般都会用笔记下来这个很难记的口令,然后登录系统,因为登录系统时使用了“记住密码”的功能,所以导致用户不会去修改密码,从而要么导到被写下来的密码被人盗取,要么又忘记了密码。
好一点的做法——通过邮件自行重置。当用户申请找回口令功能的时候,系统生成一个MD5唯一的随机字串(可通过UID+IP+timestamp+随机数),放在数据库中,然后设置上时限(比如1小时内),给用户发一个邮件,这个连接中包含那个MD5的字串的链接,用户通过点击那个链接来自己重新设置新的口令。
更好一点的做法——多重认证。比如:通过手机+邮件的方式让用户输入验证码。手机+邮件可能还不把握,因为手机要能会丢了,而我的手机可以访问我的邮箱。所以,使用U盾,SecureID(一个会变化的6位数token),或是通过人工的方式核实用户身份。当然,这主要看你的系统的安全级别了。
口令探测防守
使用验证码。验证码是后台随机产生的一个短暂的验证码,这个验证码一般是一个计算机很难识别的图片。这样就可以防止以程序的方式来尝试用户的口令。事实证明,这是最简单也最有效的方式。当然,总是让用户输入那些肉眼都看不清的验证码的用户体验不好,所以shadowsock免费节点每天,可以折中一下。比如Google,当他发现一个IP地址发出大量的搜索后,其会要求你输入验证码。当他发现同一个IP注册了3个以上的gmail邮箱后,他需要给你发短信方式或是电话方式的验证码。
用户口令失败次数。调置口令失败的上限,如果失败过多,则把帐号锁了,需要用户以找回口令的方式来重新激活帐号。但是,这个功能可能会被恶意人使用。最好的方法是,增加其尝试的时间成本(以前的这篇文章说过一个增加时间成本的解密算法)。如,两次口令尝试的间隔是5秒钟。三次以上错误,帐号被临时锁上30秒,5次以上帐号被锁1分钟,10次以上错误帐号被锁4小时……
系统全局防守。上述的防守只针对某一个别用户。恶意者们深知这一点,所以,他们一般会动用“僵尸网络”轮着尝试一堆用户的口令,所以上述的那种方法可能还不够好。我们需要在系统全局域上监控所有的口令失败的次数。当然,这个需要我们平时没有受到攻击时的数据做为支持。比如你的系统,平均每天有5000次的口令错误的事件,那么你可以认为,当口令错误大幅超过这个数后,而且时间相对集中,就说明有黑客攻击。这个时候你怎么办?一般最常见使用的方法是让所有的用户输错口令后再次尝试的时间成本增加。
最后,再说一下,关于用户登录,使用第三方的 OAuth 和 OpenID 也不失为一个很不错的选择。
为什么区块链将重新定义世界
比特币背后的技术建立起了一个可依赖的账薄,从而改变很多人的生活,其意义远远超过加密货币的范畴。
1,当洪都拉斯警方在2009年某天冲进Mariana Catalina Izaguirre家里并要驱逐她离开的时候,她已经在这个破旧的房屋住了三十多年。与她的邻居不同,Mariana Catalina Izaguirre甚至都有政府的房屋证明,但很不幸,来自当地政府房屋委员会的资料显示,该房屋署与另外一个人,而这个「房主」向法院申请驱逐令,最终 Lzaguirre女士被迫离开。
由于登记不详或记录丢失,这类扯皮的事情在全球都很普遍。房屋所有权保障的缺失也是不公正的源头。也从让利用房屋或土地作为抵押物进行融资等等变得困难。
比特币可以让这类问题消失,比特币是一种基于加密算法的「聪明」货币,我们更应该关注的是比特币背后的技术:区块链。它的意义要远远超越货币或现金。它创造的一种解决彼此之间不信任的记账方式。
这正是政客们咨询Factom公司来清理洪都拉斯财产机构的原因,Factom是一家美国的创业公司,为基于区域链的土地登记提供一种原型。希腊也对此产生了兴趣,它没有合适的土地登记政策,只有7%的土地在绘出的地图上是正确的。
2,区块链与相似的「分布式账簿」的其他应用可以扩展到阻止钻石偷窃与超市流水线。NASDAQ交易所很快就会用区块链系统来记录私有企业的交易。英国银行以不喜欢科技文明,但看起来也被刺激了:它在去年的研究报告中写到,分布式账簿是个了不起的创新,会对金融业有着深远的影响。
政客则想得更远:当合作伙伴与左翼聚集在今年的巴黎的OuiShare Fest来讨论草根企业是如何撼动了大型数据公司如Facebook的时候,区域链出现在了每一场演说中。在世界的自由梦想里,更多的政府规范被个人间的私人合同所取代——加密算法会自行加强。
区块链由Satoshi Nakamoto所设想,了不起且至今唯一被确认身份的比特币创始人——「完全对等的电子货币」,他在2008年发表的文章里写道。为了让它像货币一样,比特币必须要从争取的账户里转移,可以被同一个人消费两次。为了实现Nakamoto这样去中央化的系统的梦想,比特币必须避免任何对第三方的依赖,例如隐藏在普通支付系统背后的银行。
而区块链可以替代第三方。它可以容纳每个比特币的交易历史,提供任何时间任何人物的证据。分配系统可以在几千台电脑中复制——比特币的「节点」——在全世界的每个地方,并可以公开。但即使有如此的公开性,它依然是可信的,安全的。数学算法的复杂性与建在它的「共识机制」——节点同意根据比特币流通来升级区块链的处理过程——内的计算暴力破解保证了这一点。
举个例子,Alice希望给Bob支付租赁服务。他们都有着比特币钱包——一种直接通往区块链,而不是像浏览器通往网页但没有识别系统内的用户的软件。Alice的钱包开始提出申请的时候交易开始了,区块链开始改变,以显示Alice的钱包少了一些,而Bob的多了一些。
网络在此过程中需要通过数个阶段来完成改变。当申请通过网络内多个节点检查,检查账本,确认Alice是否有她想要花费的比特币。如果一切看起来没问题,特定节点会指令miners捆绑Alice的请求连通其他相似的有信誉的交易,在区块链中创造一个新的模块。
这其中牵涉到需要通过给加密一个散列函数来将模块分解为一系列指定长度的数据(见图表)。像许多加密一样,这种散列是一条单行路。数据分散可以,但反过来由分散聚合为数据是不可能的。但是尽管散列并不容纳数据,它依然是独特的。通过任何一种方法来改变进入模块——通过简单的一个数码来改变交易——散列就会不同。
3,随着其他的数据一起,散列会被放置在制定模块的首位(header)。首位继而变成切实数学谜题的基本,又一次涉及到散列函数。谜题只能被测试与错误解开。通过网络,miners要实验上亿种可能来寻找答案。当一个miner终于找出答案时,其他节点会迅速检查(又一次通过单行路:解决很难,但检查容易),每个节点会确认解决方法随之升级到区块链。首位的散列会成为新模块的确认线,这个模块现在是账簿的一部分了。Alice支付给Bob,模块里容纳的其他所有交易都被确认。
解密阶段引进了三种大大加强比特币安全性的东西。一个是偶然性。你无法预测哪个矿工会解决谜题,因此无法预测谁会在指定时间升级区块链,除了它必定是最用功的一个矿工,而不是其他随机的怠工者。这让作弊很困难。
第二点是历史。每一个新的首位容纳了之前模块首位的散列函数,其容纳了后者之前的散列函数,如此循环往复直至起点。这种关联让模块成了一个循环链。从账簿里的所有数据开始,重新产生最新模块的首位是一件小事。尽管在任何地方制造一个改变——甚至返回到最早的几个模块之一——改变了的模块首位会变得不同。这意味着下一个模块也是如此,以及所有以后的模块。账簿将不会通过最新的模块识别器,并被拒绝。
有没有解决的办法呢?想象一下Alice改变了支付Bob的主意,试着重写历史,这样的比特币就会还在她的钱包里。如果她是一个有能力的矿工,她可以解决亟待处理的谜题,并制作出一个区块链新版本。但是在她这样做的时间内,网络中的其余人会已经延长了原始的区块链。节点会一直在区块链最长的版本中工作。这个规定阻止了两个矿工同时找到了解决办法的情况并导致了链中出现比临时叉更糟的后果。它还会阻止作弊。为了让系统接受她的新版本,Alice需要比其他人更快地延长它。无法控制一半以上的电脑——专业术语叫做「51%的攻击」——那应该是不可能做到的。
4,且不说颠覆上述网络的可能性,另一个深层次的问题是:为什么要成为这个网络的一员呢?这个答案就是第三个「解密」步骤,而且还是有奖励的,每个新区块有新的比特币,解开谜题的人会得到25个比特币奖励,约合7500美元。
所有上述精巧的设计并非比特币真正吸引人的原因。其价值在于不稳定性和不可预测性,如下图所示,但比特币的总量却是一定的。区块链的机制也运行良好。根据一家名叫blockchain.info的网站数据,平均每天有超过12万的交易记录被添加到区块链中,这意味着大约有7500万美元的交易。目前有38万区块,这个帐本的大小将近45GB。
大多数位于区块链里的数据都是比特币,但这也不是必须的。Mr Nakamoto 也创造一种分布式系统,并且撰写了相关阐释。科技极客们称之为:开放式平台。这个平台仿照的就是就是互联网,也包括诸如Android或Windows这样的操作系统。开发者可以开发基于区块链上基本功能的应用程序,并不用得到任何人的许可。投资多家比特币创业公司的Andreessen Horowitz公司Chris Dixon表示:这种网络最后会变成一个公开的数据库。据了解,Andreessen Horowitz公司已经投资了比特币钱包公司Coinbase以及面向大众的比特币硬件设备公司21。
目前基于区块链的应用有三大领域。第一种就是将所有建议都通过区块链的方式完成。创业公司Colu押注在这个模式,他们开发了一种算法去「润色」一些小额的比特币交易,从而使得这些交易可以代表诸如证券、贵金属交易。
保护土地或房屋签名有效性成为第二类的典型应用。比特币交易都会将签名一起加入到区块链的账本上。一家名叫everledger的创业公司用这种方式保护奢侈品,比如他们在区块链数据中记录一块宝石的质地属性,假如宝石丢失可以提供最直观的证明。Onename使用类似方式存储个人信息;注意,由于这种应用并非纯粹的比特币交易,因此你需要首先赋予更多信任,比如你需要将自己的一些准确信息告诉应用开发者。
第三种应用则有着更大的雄心,「智能合同」能够自动检测是否具备生效的各种环境。这是因为,比特币可以被编程,这样就能保证在特殊情境下的可用或不可用。
由一位知名比特币工程师Mike Hearn开创的Lighthouse就是一个去中心化众包的项目。如果足够多的资金进入这个项目,那么一切就启动,如果目标没有达到,就停止。Heran认为,他的项目能够比那些以比特币协议的友商们更便宜也更独立。
5,在纽约风险资本公司Albert Wenger of USV看来,分布式账本的出现开启了一个几乎是全新象限的可能性,这家公司已经投资了多家去中心化的公司,比如提供P2P交易的OpenBazaar。在对区块链一片欢呼声之外,也有人质疑其的安全性和扩展性。区块链在比特币上很适用,但在一些小众的应用程序上,还无法承载数百万用户的使用。
尽管 Nakamoto的对区块链的设计到目前为止证明是攻坚不摧的,学术研究也认为,假如没有控制整个区块链的51%,想在区块链上做坏事几乎也是不可能的。过去比特币的玩家都局限在很小的圈子里,如今的比特币挖矿被各种大比特币池把持,在这里「池」里,小的挖矿者分享他们的努力并获得奖励。
另一个对担心则是对环境。为了获得更多比特币,挖矿者对于计算能力的要求很高,也这意味着要不断增加计算机的功耗。根据blockchain.info的数据显示,挖矿者每秒要进行45万次的计算尝试,这些都会带来巨大的能量消耗。
由于矿工们对于硬件的情况守口如瓶,外界很难知道这些计算机的具体功耗。一份粗略的计算显示,如果每个人都采用最具效率的硬件,每比特的电力消耗为2兆瓦,一年的电力消耗约为加州15000居民的用电量。
但这些围绕比特币的挥霍都是有极限的。Nakamoto当时对于比特币的设计是这样的:每兆数据中约有1400次交易,这意味着每秒的交易数为7次。相比于目前美国的确每秒1736次的Visa卡交易,比特币区块还能更大,不过更大的区块要通过花费更长时间去生成,也会增加一定的风险。
以前的一些经验或许可以参考。当上世纪90年代网络浏览器发明后,数百万的人开启了在线生活,很多预言家都预测互联网会停滞发展。但事实上互联网一直在发展中,同样道理,比特币的发展也不会停滞。更多可用于挖矿的计算设备会更节能,开发者们也会更热衷于基于比特币的平台上开发应用,并使用比特币交易,更快的网络连接也会加速比特币区块的扩大速度。
关于比特币的很多问题并非是缺乏解决方案,比特币机制的任何变化都需要得到比特币社区的许可,而要达成意见并不容易。一方主张尽快扩大比特币区块的规模从而能够成为传统支付的颠覆者,但另一方却认为如果不进行调整,现有的系统可能会在明年崩溃。
6,Hearn先生与Gavin Andresen是两位比特币大亨,是比特币大交易的领头人。他们呼吁挖矿企业来安装比特币的新版本,支持更大的交易规格。一些矿工们的确遭受到了网络攻击,并且在广泛证明其需求与危险下,这次升级与系统正在被浩如烟海的微小交易逼到极限。
这一切都为比特币区块链建立一个替代品的提出奠下基础,可以优化存储分布式账簿而不是加密运行。复试链(multichain),Coin Science所提供的一个定制区块链的平台证明了可能的方向。它还提供了建立一个像比特币一样的区块链的所需资源,并可以用来建立私有链,仅对特定用户开放。如果所有用户开始相信矿工的需求,工作证据被减少或消除,那么现有对账簿的连接就变成了多余的选择。
第一个采用这样的区块链的后代的企业也许正是那些最开始失败并启发了Nakamoto的公司之一:金融。在最近的几个月,私有区块链以防止破坏的银行融资热情开始涨高。比讽刺还要讽刺的是,其中一个原因是反政府自由人士的技术诞生可以让银行在知晓它们的客户与反洗钱规则后更好地符合政府需求。但是这里还有一个更深层的吸引存在。
工业历史家们指出新能源早在最高效的处理方法产生前就存在。当电动机第一次研发时,它们就像之前出现过的巨大的蒸汽引擎机器一样。生产商花费了数十年才看到了分散的电动机可以重组他们做事的任何方面。英国银行在它的数字货币报告中写到,它也在金融行业中看到了相似的东西正在前进中。这要感谢便宜的计算金融公司已经将它们内部的工作数字化,但是它们还没有将自己的组织改变到足以与之相匹配。支付系统目前仍然是中心化的:货币的转移要通过中央银行。当金融公司彼此生意往来时,同步内部的账簿是个耗时几天的繁重任务,桎梏住了资本并带来了风险。
分布式账簿在几分钟甚至几秒钟就完成交易,对解决这些问题和实现数字化银行的承诺可能大有帮助。账簿还可以帮助银行节省很多钱:Santander银行,到2022年这些账簿可以降低行业每年高达200亿美元的账簿。供应商仍然需要证明,他们可以处理过高的比特币交易价格;但大银行已经开始推动比特币这种新兴技术标准化。其中瑞银联合银行,已提议建立一个标准的「结算货币」。R3 CEV的第一要务是块环链的启动,瑞士投资银行与高盛、摩根大通和其它22家银行联合投资,为私人帐开发标准化的架构。
7,银行的问题也并不是唯一的。很多公司和公共机构都难以维护,同时还有经常不兼容的数据库和相互交流的高成本问题。这就是Ethereum想解决的问题,可以说是最雄心勃勃的分布帐项目。21岁的加拿大编程天才Vitalik Buterin的创作品,Ethereum的分布式分类帐可以比「比特币」处理更多的数据。它有一个编程语言,允许用户编写更复杂的智能合约,当货物到达自动支付并打印发票,或如果利润达到一定水平,自动发送给业主股息。Buterin先生希望,如此聪明的「去中心化的自治组织」的形成——基本上,虚拟企业只是给「Ethereum blockchain」设置一些运行的规则。
这样的想法可能有激进影响的领域之一就是在「物联网」——数十亿之前静音日常用品,如冰箱、门闩和草坪洒水装置。从IBM最近的一份题为「设备民主」的报告,认为不可能集中跟踪和管理这些数以十亿美元计的设备,这样的尝试也不明智;这种尝试会让他们容易受到黑客攻击以及政府的监督。分布式寄存器似乎是一个不错的选择。
Ethereum提供的可编程性,不仅仅是让人们的财产被跟踪和注册。它有一些新的用途。在各种各样的方法规则下,车钥匙中嵌入Ethereum blockchain,就可以被出售或出租,产生出租或共享汽车的新P2P。更远,一些人谈论应用该项技术,使自动驾驶的汽车成为社会公共资源。根据预先设置的程序规则,这样的车辆可以自己存储一些数字的钱来支付他们从出租燃料,维修和停车位。
8,不出所料,一些人认为这些计划过于激进。Ethereum1(「创世纪」),8月才被开发,目前只是一个小的启动生态系统集群。虽然Buterin先生在最近的博客中承认这有点缺钱,但区块链最终繁荣的特定细节,远远少于广泛分布式帐的激情,而真实这些激情带领着初创企业和现有的大型企业,检查他们各自的潜力。尽管社会对会计师的能力总是嘲笑,但帐目确实重要。
当今世界深深依赖着复式记账法。其记录着借方和贷方的标准化系统,是理解一个公司核心财务状况的必然选择。在20世纪早期,德国社会学家的维尔纳?桑巴特声称,现代资本主义为了发展,是否绝对需要这样的簿记,值得更深入地去讨论。虽然复式记账系统始于文艺复兴时期的意大利商人,也刚好是一个时间巧合;那时候,复式记账在世界各地的传播比资本主义的传播更缓慢,直到在19世纪末才开始广泛使用。但毫无疑问,技术的根本重要性,不仅仅在于记录一个公司做什么,而是能够定义公司的未来。
帐目,不再需要由公司或政府维护,可以及时刺激新公司和政府关于工作方式的变化、对未来的期望以及当下能做的工作。没有集中记录的系统,可以一样值得信赖,因为他们也能带来彻底的改变。
这些想法虽然仍是一个只适用在几个领域的新奇事物,和他们传播能力以及被扩大的可能性。他们还面临一些未知的阻力。一些比特币的批评人士一直将其视为最新「加州意识形态」的尝试。(加州意识形态意指那种以技术拯救世人的使命感)。这只是一个编码的信任机制,而并非民主政治、合法性和问责制,很难吸引人或者授权。
与此同时,整个世界都会被数字化地记录,这也将有很多好处。如果区块链有一个基本的矛盾,也就是:即使提供了相同的过去和现在,区块链的未来会很不一样。
本文选自《经济学人》,机器之心编译出品,参与成员:黄志臻、Chen、赵赛坡
瑞泰币、莱特币、狗狗币等数字加密货币也都是利用了区块链技术。
Redis百亿级Key存储设计方案
该应用场景为DMP缓存存储需求,DMP需要管理非常多的第三方id数据,其中包括各媒体cookie与自身cookie(以下统称supperid)的mapping关系,还包括了supperid的人口标签、移动端id(主要是idfa和imei)的人口标签,以及一些黑名单id、ip等数据。
在hdfs的帮助下离线存储千亿记录并不困难,然而DMP还需要提供毫秒级的实时查询。由于cookie这种id本身具有不稳定性,所以很多的真实用户的浏览行为会导致大量的新cookie生成,只有及时同步mapping的数据才能命中DMP的人口标签,无法通过预热来获取较高的命中,这就跟缓存存储带来了极大的挑战。
经过实际测试,对于上述数据,常规存储超过五十亿的kv记录就需要1T多的内存,如果需要做高可用多副本那带来的消耗是巨大的,另外kv的长短不齐也会带来很多内存碎片,这就需要超大规模的存储方案来解决上述问题。
人⼝标签主要是cookie、imei、idfa以及其对应的gender(性别)、age(年龄段)、geo(地域)等;mapping关系主要是媒体cookie对supperid的映射。以下是数据存储⽰示例:
媒体编号-媒体cookie=supperid
supperid = { age=年龄段编码,gender=性别编码,geo=地理位置编码 }
imei or idfa = { age=年龄段编码,gender=性别编码,geo=地理位置编码 }
显然PC数据需要存储两种key=value还有key=hashmap,⽽而Device数据需要存储⼀一种
key=hashmap即可。
存储吃紧的一个重要原因在于每天会有很多新数据入库,所以及时清理数据尤为重要。主要方法就是发现和保留热数据淘汰冷数据。
网民的量级远远达不到几十亿的规模,id有一定的生命周期,会不断的变化。所以很大程度上我们存储的id实际上是无效的。而查询其实前端的逻辑就是广告曝光,跟人的行为有关,所以一个id在某个时间窗口的(可能是一个campaign,半个月、几个月)访问行为上会有一定的重复性。
数据初始化之前,我们先利用hbase将日志的id聚合去重,划定TTL的范围,一般是35天,这样可以砍掉近35天未出现的id。另外在Redis中设置过期时间是35天,当有访问并命中时小火箭android版,对key进行续命,延长过期时间,未在35天出现的自然淘汰。这样可以针对稳定cookie或id有效,实际证明,续命的方法对idfa和imei比较实用,长期积累可达到非常理想的命中。
Hash表空间大小和Key的个数决定了冲突率(或者用负载因子衡量),再合理的范围内,key越多自然hash表空间越大,消耗的内存自然也会很大。再加上大量指针本身是长整型,所以内存存储的膨胀十分可观。先来谈谈如何把key的个数减少。
大家先来了解一种存储结构。我们期望将key1=value1存储在redis中,那么可以按照如下过程去存储。先用固定长度的随机散列md5(key)值作为redis的key,我们称之为BucketId,而将key1=value1存储在hashmap结构中,这样在查询的时候就可以让client按照上面的过程计算出散列,从而查询到value1。
过程变化简单描述为:get(key1) - hget(md5(key1), key1) 从而得到value1。
如果我们通过预先计算,让很多key可以在BucketId空间里碰撞,那么可以认为一个BucketId下面挂了多个key。比如平均每个BucketId下面挂10个key,那么理论上我们将会减少超过90%的redis key的个数。
具体实现起来有一些麻烦,而且用这个方法之前你要想好容量规模。我们通常使用的md5是32位的hexString(16进制字符),它的空间是128bit,这个量级太大了,我们需要存储的是百亿级,大约是33bit,所以我们需要有一种机制计算出合适位数的散列,而且为了节约内存,我们需要利用全部字符类型(ASCII码在0~127之间)来填充,而不用HexString,这样Key的长度可以缩短到一半。
下面是具体的实现方式
参数bit决定了最终BucketId空间的大小,空间大小集合是2的整数幂次的离散值。这里解释一下为何一个字节中只有7位可用,是因为redis存储key时需要是ASCII(0~127),而不是byte array。如果规划百亿级存储,计划每个桶分担10个kv,那么我们只需2^30=1073741824的桶个数即可,也就是最终key的个数。
碎片主要原因在于内存无法对齐、过期删除后,内存无法重新分配。通过上文描述的方式,我们可以将人口标签和mapping数据按照上面的方式去存储,这样的好处就是redis key是等长的。另外对于hashmap中的key我们也做了相关优化,截取cookie或者deviceid的后六位作为key,这样也可以保证内存对齐,理论上会有冲突的可能性,但在同一个桶内后缀相同的概率极低(试想id几乎是随机的字符串,随意10个由较长字符组成的id后缀相同的概率*桶样本数=发生冲突的期望值0.05,也就是说出现一个冲突样本则是极小概率事件,而且这个概率可以通过调整后缀保留长度控制期望值)。而value只存储age、gender、geo的编码,用三个字节去存储。
另外提一下,减少碎片还有个很low但是有效的方法,将slave重启,然后强制的failover切换主从,这样相当于给master整理的内存的碎片。
推荐Google-tcmalloc, facebook-jemalloc内存分配,可以在value不大时减少内存碎片和内存消耗。有人测过大value情况下反而libc更节约。
1)kv存储的量级必须事先规划好,浮动的范围大概在桶个数的十到十五倍,比如我就想存储百亿左右的kv,那么最好选择30bit 31bit作为桶的个数。也就是说业务增长在一个合理的范围(10 15倍的增长)是没问题的,如果业务太多倍数的增长,会导致hashset增长过快导致查询时间增加,甚至触发zip-list阈值,导致内存急剧上升。
2)适合短小value,如果value太大或字段太多并不适合,因为这种方式必须要求把value一次性取出,比如人口标签是非常小的编码,甚至只需要3、4个bit(位)就能装下。
3)典型的时间换空间的做法,由于我们的业务场景并不是要求在极高的qps之下,一般每天亿到十亿级别的量,所以合理利用CPU租值,也是十分经济的。
4)由于使用了信息摘要降低了key的大小以及约定长度,所以无法从redis里面random出key。如果需要导出,必须在冷数据中导出。
5)expire需要自己实现,目前的算法很简单,由于只有在写操作时才会增加消耗,所以在写操作时按照一定的比例抽样,用HLEN命中判断是否超过15个entry,超过才将过期的key删除,TTL的时间戳存储在value的前32bit中。
6)桶的消耗统计是需要做的。需要定期清理过期的key,保证redis的查询不会变慢。
人口标签和mapping的数据100亿条记录。
优化前用2.3T,碎片率在2左右;优化后500g,而单个桶的平均消耗在4左右。碎片率在1.02左右。查询时这对于cpu的耗损微乎其微。
另外需要提一下的是,每个桶的消耗实际上并不是均匀的,而是符合多项式分布的。
上面的公式可以计算桶消耗的概率分布。公式是唬人用的,只是为了提醒大家不要想当然的认为桶消耗是完全均匀的,有可能有的桶会有上百个key。但事实并不没有那么夸张。试想一下投硬币,结果只有两种正反面。相当于只有两个桶,如果你投上无限多次,每一次相当于一次伯努利实验,那么两个桶必然会十分的均匀。概率分布就像上帝施的魔咒一样,当你面对大量的桶进行很多的广义的伯努利实验。桶的消耗分布就会趋于一种稳定的值。接下来我们就了解一下桶消耗分布具体什么情况:
通过采样统计
31bit(20多亿)的桶,平均4.18消耗
100亿节约了1.8T内存。相当于节约了原先的78%内存,而且桶消耗指标远没有达到预计的底线值15。
对于未出现的桶也是存在一定量的,如果过多会导致规划不准确,其实数量是符合二项分布的,对于2 30桶存储2 32kv,不存在的桶大概有(百万级别,影响不大):
Math.pow((1 - 1.0 / Math.pow(2, 30)), Math.pow(2, 32)) * Math.pow(2, 30);
对于桶消耗不均衡的问题不必太担心,随着时间的推移,写入时会对HLEN超过15的桶进行削减,根据多项式分布的原理,当实验次数多到一定程度时,桶的分布就会趋于均匀(硬币投掷无数次,那么正反面出现次数应该是一致的),只不过我们通过expire策略削减了桶消耗,实际上对于每个桶已经经历了很多的实验发生。
总结:信息摘要在这种场景下不仅能节约key存储,对齐了内存,还能让Key按照多项式分布均匀的散列在更少量的key下面从而减少膨胀,另外无需在给key设置expire,也很大程度上节约了空间。
这也印证了时间换空间的基本理论,合理利用CPU租值也是需要考虑的。
关注分布式存储技术以及分布式计算方法






还没有评论,来说两句吧...