09年06月11日   15 条评论

我Dang大概也就会做这种事了,从GFW到绿坝,巴不得让每个人装个摄象头,每天让我Dang了解我们这些“刁民”做了些什么。

绿坝是个什么东西,http://www.zzjinhui.com/ ,他们的官网有一句话:“金惠堵截黄图像及不良信息专家系统是目前国内唯一的智能识别黄色图像内容的互联网信息过滤产品,彻底解决了网络反黄的技术难题,填补了国内空白,技术独创性和领先性得到了国家四个部委的一致肯定和支持:”

真是大言不惭,“唯一”,“填补空白”竟然敢用这些词,我没去下载试用,有人已经做过很详细的分析了,请在下面的页面查看:

https://docs.google.com/View?id=afk7vnz54wt_12f8jzj9gw

从中我们可以发现绿坝的一些特点:典型流氓特征、盗用开源软件、侵犯知识产权,弱智密码保护,就这样一个软件,竟然可以那样宣传自己,也能获得“国家四个部委的一致肯定和支持”,我们也大概能知道这四部委都是些什么货色了。

我们放低点要放,就算你们弄出来这么个垃圾软件,你自己忽悠SB去,你也不能让纳税人掏出40000000钱去强制我们当SB吧?让所有计算机出厂前预置这么个垃圾,工信部的人真XX的有才。

这件事大概应该是这个样子,这个垃圾软件的厂商花钱找关系在工信部推销他们的垃圾,结果工信部的一群SB脑子一热,还以为能做点政绩给我Dang看,于是就做了这些让全国人民恶心的事。结果呢,在人民的唾沫中这群SB消失了。

有些兴趣的朋友可以看下关于绿坝的关键词过滤:https://docs.google.com/Doc?docid=dczkbptk_0ffc2hvc9绿坝–花季护航,到底是在做什么,真的是“花季护航”吗?

“有试验的小白鼠说,装了绿坝.花季护航以后在word中输入“老师教学生玩摸球游戏”,word会被强制关闭,我一看,“玩摸”果然是关键字,”

推荐阅读:
我们需要家长,但不需要大家长!【回应外交部的“你有孩子吧”】

标签 :
分类 : 互联网
Top
09年06月02日   16 条评论

我要做一个支持多资源、多线程、断点续传的小工具,基于。Windows下有迅雷、FlashGet、QQ旋风(相当地泛滥),Linux下也有D4X,Axel ,aria2,那为什么还要写这样一个工具呢?

(1) 上面都不是写的。
(2) Linux下的下载工具都不能主动获取资源,而现在迅雷和FlashGet之所以快就是因为他们有资源。
(3) Linux下几个工具多线程、断点续传做的不太好。aria2似乎不错,不过我没编译过去,支持那么多协议,觉得有点臃肿。

其实从原理上讲,迅雷不过就是一个HTTP/FTP的多线程断点下载工具,现在做大了就来抢BT、电驴的用户,把这两个协议也加了进去。

前段时间看过axel,它的实现太简单了,只是固定的产生N个线程,然后把文件分成N块交给这些线程去下载。从迅雷的配置文件和下载的日志中可以看出来迅雷对下载文件的分块和线程的使用是有自己独有的方式(它线程下载的数据块有时很大4M,有时很小32K,即使在同一个线程中也是这样),我没办法知道迅雷是怎么做这个工作。所以我只能通过猜测和自己的一些想法来做这个工作。尽可能的保证合理的分块和线程使用。

创建一个下载管理器,包括配置信息,任务列表,一个具有速度值与使用次数的URL列表。

首先得到下载文件的大小(filesize),然后根据配置以及获得的URL数(N)对文件进行分块。
设置一个最小的分块值 MinPiece = 1024*128 (最小分块大于filesize的5%)
设置一个最大的分块值 MaxPiece = 1024*1024*200

if filesize < = MinPiece:
不进行分块。选第一个地址进行下载,如果该地址下载超时则使用其它地址下载。(是否可以考虑使用N个地址同时下载?)

elif:
把文件分为N块,每块大小为Piece。
if Piece < MinPiece
把文件分为N-1块,Until Piece > MinPiece

if Piece > MaxPiece
把文件分为N+1块,Until Piece < MaxPiece

生成任务列表,一个任务包括:URL,filename,range[start,pos,end]
任务列表中对任务进行标记,DONE,RUNNING,PAUSE,STOP(需要这么多吗?)

根据获得的资源数产生N线程的线程池。

逐步向线程池中增加线程:前提是所有线程成功运行,则增加一个线程。
每个URL对应一个线程的上限数(5),总使用线程数固定(35)

线程运行时检查是否有空闲线程,如果有,则把自己的任务分割(分割的办法使用折半方式,同时要保证分块大于MinPiece),放在任务列表中,同时修改自己的任务的分段信息。
加入任务列表时从URL列表中选一个速度较快的URL,且该URL线程数未达到上限。(如何判断是否达到服务器支持连接数上限?如果针对某个URL创建新连接失败则标记该URL为不可再连接)

线程运行时检查缓冲区的大小,当大于write_buffer_size时则写文件(大于文件的10%时也写?),并且写记录文件,更新URL列表中的速度值,做这些操作时要使用锁机制。这个write_buffer_size根据不同的文件对应不同的大小(2M—>16M迅雷使用8-256)。写文件时可以直接seek到需要写入的位置,如果操作系统不支持这种方式,则先用0填充文件。

线程对失效的URL进行标记,对不支持断点续传的URL进行标记。考虑GBK,UTF-8编码。
线程完成时与停止时做写文件操作与上面操作相同。

记录文件中保存任务列表:
URL,filename,range[start,pos,end]
这样续传的时候程序就根据记录文件载入所有的任务,然后开启线程,进行下载。
记录文件使用MD5校验(最后一行存放前面信息的MD5值)。

一个线程如果速度过慢,则释放当前的任务,把它扔回任务列表中,标记该URL很慢,由空闲的线程再次开启这个任务,这时候有可能又由这个线程接管,但是使用的URL不同,因为扔回任务列表的时候会先一个较快的URL。

HTTP请求需要设置一个超时时间。

———————————————————————-
只是把我的一些想法在这里先记录下来,所以比较乱,做的时候可能还会有些变化。至少我目前觉得这种设计方式还是比较智能和高效的,欢迎大家拍砖,如果有好的建议我会记录下来。

标签 :
分类 : Python
Top
09年05月31日   11 条评论

早起的习惯在五月完全被破坏掉了,五一放假三天没按时起,然后四天回到正常状态,紧接着是连着十多天下雨,就再没按时起床了。 6/31

再说晚睡的情况吧,还是以前遇到的问题,放假的时候就规律不了了,玩太迟了。 25/31

写字基本上是“完成任务”了,大部分没去认真的写,本来是早上起来写字的,没按时起床导致把写字放在了晚上,进而影响了写字时的状态,哎!还有就是觉得一直没什么进步,写出来还那样,所以不认真了。 29/31

这个月读了《乌合之众》,《少有人走的路》,《SSL与TLS》,《精通PKI网络安全认证技术与编程实现》。

从五月总结中可以发现,人性中的惰性是很容易被激发出来的,一点外在的因素(下雨),就导致了一个人回到原点。这个月状态很不好,又遇到间隙性的迷茫了!

该写的程序没写,该看的书没看,正在我还想写该XX的XX没XX的时候,突然脑袋里冒出来一句话“其实你也做了不少事”,工作上的事完成的挺顺利,相关的东西也学了不少,也帮同学折腾了程序,还顺道更新了PyFetion,也看了几本书,也出去好好玩了几次…………

不知道为什么我老看不到自己的优点,老是这么不自信,难道我潜意识里是个完美主义者,希望自己可以做到潜意识里所期望的一切?

心智的成长是痛苦的,缓慢的,曲折的,希望儿童节能带去迷茫 。

BTW:->我觉得心理学挺有意思的,喜欢上了。
->我觉得写篇文章真的好不容易,半天才能凑出来百十字,真佩服人家动辄上万字的写东西。得多喝点墨水啊!

标签 :
分类 : Life
Top
09年05月26日   16 条评论

大多数的人要经历一件件的事,才能慢慢走向成熟,这个过程是很痛苦的,大多数时候你不知道为什么事情会这样,你绞尽脑汁也想不明白,别人再三解释也没有用,究竟是为什么那?我们都在用惯有的思维去思考,我们不习惯于接受改变,就好象生物的进化一样,总是很艰难的。但是,一但过了这个坎儿,再回头就会发现进化之前(改变之前)的我们是多么的可笑。就如我们嘲笑猩猩一样。

我在想如果猿在进化之前要是有个人做“标本”的话,那么应该不用花上百万年的时间才进化成这个样子吧。所以当我们在向成熟进化的时候,如果知道成熟的含义,那么应该会少很多痛苦,少浪费很多时间吧。

《少有人走的路》(英文名:The road less traveled)是一本难得的能给人心灵上产生巨大冲激的书。人一生不停的在认识自我,完善自我,但很多时候都是没有方向的摸索,而这本书从人性的根本点出发,解释了人生的许多问题,比如爱、意识、自律等等。人在成熟的这个过程会有不少的困惑,这本书会帮你解开你不少的困惑,如果你想认识自己,完善自己,那么这本书是很好的路标,拿起它你会觉得它已进入了你心灵的深处。

没有人能够拒绝成熟,那么也不应该有人拒绝《少有人走的路》。

正如它的书名一样,走在这条路上的人很少,读懂自己而完善自己的人很少,你愿意走这条路吗?

标签 :
分类 : reading
Top
09年05月22日   4 条评论

SSL_library_init();
SSL的初始化过程,只是添加一些算法,使用EVP_add_cipher函数。

ssl_method = SSLv3_client_method();
设置使用的SSL版本,SSLv3_client_method 函数的定义是通过IMPLEMENT_ssl3_meth_func(ssl/s3_clnt.c)这个宏来实现,而这个宏在ssl/ssl_locl.h 文件中实现,使用了粘贴宏的技巧来根据传入不同的函数名生成不同的函数定义。
SSLv3_client_method 定义了一组关于SSL V3的操作函数:

C:
  1. static SSL_METHOD func_name##_data= {
  2.         SSL3_VERSION,
  3.         ssl3_new,
  4.         ssl3_clear,
  5.         ssl3_free,
  6.         s_accept,
  7.         s_connect,
  8.         ssl3_read,
  9.         ssl3_peek,
  10.         ssl3_write,
  11.         ssl3_shutdown,
  12.         ssl3_renegotiate,
  13.         ssl3_renegotiate_check,
  14.         ssl3_get_message,
  15.         ssl3_read_bytes,
  16.         ssl3_write_bytes,
  17.         ssl3_dispatch_alert,
  18.         ssl3_ctrl,
  19.         ssl3_ctx_ctrl,
  20.         ssl3_get_cipher_by_char,
  21.         ssl3_put_cipher_by_char,
  22.         ssl3_pending,
  23.         ssl3_num_ciphers,
  24.         ssl3_get_cipher,
  25.         s_get_meth,
  26.         ssl3_default_timeout,
  27.         &SSLv3_enc_data,
  28.         ssl_undefined_void_function,
  29.         ssl3_callback_ctrl,
  30.         ssl3_ctx_callback_ctrl,
  31.     };

SSL_CTX = SSL_CTX_new(ssl_method);
创建SSL_CTX这个结构体,进行初始化赋值操作,设置一些参数,使用默认的engine。的engine是对基础的加密算法进行了封装,这样可以方便的对底层的加密算法进行替换,例如你可能使用硬件加密来替换掉的软实现加密算法,而你所做的只是按照engine的接口实现相关的算法,然后设置engine的名字。例如U-KEY的RSA签名必须在硬件中完成,这时你就可以通过engine调用CSP来实现签名算法。

SSL_CTX_use_certificate_file(SSL_CTX,"client.cer",SSL_FILETYPE_PEM)
设置客户端使用的证书,从文件中读取BASE64(SSL_FILETYPE_PEM这个参数指定)编码的证书,然后转换为 的X509结构,提取公钥,设置SSL_CTX相关的结构。

SSL_CTX_use_PrivateKey_file(SSL_CTX, "client.key", SSL_FILETYPE_PEM)
设置客户端使用的私钥,这种方式也是直接从文件中读取,更安全的方式是使用SSL_CTX_use_RSAPrivateKey(SSL_CTX, RSA),RSA是一个包含了RSA算法相关数据的结构体,这里定义了RSA算法相关的操作,在这里可以把私钥相关的算法操作使用自己的CSP来完成,而不是直接使用私钥完成。

SSL = SSL_new(SSL_CTX);
创建SSL 这个复杂的结构体。太多了,就不细说了。

SSL_set_fd(SSL, sock_fd);
设置连接使用的socket的fd,我们要做的socket操作只是得到这个fd,read,write操作将由来完成。

SSL_connect(SSL);
这个函数将根据前面设置的SSL版本来进行相应的连接操作。

server_cert = SSL_get_peer_certificate(SSL);
得到服务器端的证书,下来可能要做一些服务器证书的验证,这里就省略了。

X509_free(server_cert);
SSL_write();
SSL_read();
接下来的操作就很好理解了.

http://code.google.com/p/cocobear/source/browse/trunk/openssl/openssl_test.cpp

上面写了一代简单的进行通信的代码,在Win和Linux下都可以运行,只是在socket操作有一点点的差异。

标签 :
分类 : 安全相关
Top
09年05月21日   2 条评论

智能卡又称CPU卡。CPU卡内嵌芯片相当于一个特殊类型的单片机,内部除了带有控制器,存储器,时序控制逻辑等外,还带有算法单元和操作系统,由于CPU卡有存储容量大,处理能力强,信息存储安全等特性。因此,广泛用于信息安全性要求特别高的场合。

http://baike.eccn.com/eewiki/index.php/智能卡(CPU卡)

CPU卡在国内的最广泛应用应该是手机的SIM卡了,CPU卡要做应用一般都需要有一个上层的COS来支持,例如SIM卡就有基于GSM11.14和GSM11.11规范实现的COS。

COS是一个完整的系统,在结构上COS分为四大块:文件管理、安全机制、传输协议、命令解释。COS不是一个标准的操作系统,它是针对不同的应用来设计的,不过在一些底层的结构上还是基本相同的,比如文件管理、安全机制、传输协议,不同的应用在COS里体现在命令解释这一块。一般都有针对行业相关的命令标准,例如SIM卡相关的GSM11.11标准,金融相关的PBOC。关于CPU卡和COS最重要的规范就是ISO7816这一系列的标准,例如ISO7816-3规定了COS中的传输协议这一块,ISO7816-4规定了命令解释这一块,当然这里只是规定了最基本的一些命令,不同的应用可以有自己的扩展。 CPU卡在芯片级就做了很好的安全保护工作,比如对存放在CPU卡里数据的保密,以及CPU卡的物理攻击防范,举个简单的例子,你可能花很大的精力把一个CPU卡分解开(芯片的分层封装可以防卡轻松把一个CPU卡分解为ROM,CPU,EPROM等),得到的数据仍然是经过加密的。因此在很大程度上防止了卡的复制,而目前银行的磁条卡是很容易被复制的,只要知道卡号,密码和这个卡对应的一个随机数(据说可以直接读出来……而某些使用算法产生的也不安全,因为相关的算法很弱)就可以很轻松的复制出来一张银行卡。

国外很多银行已经开始采用基于CPU卡的银行卡,中国也有相应的标准出台:PBOC,不过涉及到数十亿磁条卡的更换,标准制定多年来一直没有得以推广,对于这种投资大(更换ATM机、POST终端、后台系统、人员培训),而不会有很明显回报的事,国内的银行还是表现的很"理智的"。

标签 :
分类 : 安全相关
Top
09年05月18日   6 条评论

《梦的解析》
《人性的弱点全集》
《乌合之众:大众心理研究》
《厚黑学全集》
--------------------------------------------------------------------
《精通PKI网络安全认证技术与编程实现》
《SSL 与 TLS》

《SSL 与 TLS》基本读完了,内容还可以,翻译的错误有不少,有些地方写的不太容易理解,总的来说还算可以吧。
《乌合之众:大众心理研究》是本不错的书,很短小,不到200页,花了不多的时间看了一遍,确实是大众心理研究值得一读的书。
《厚黑学全集》这本书是在一篇网文中看到的介绍,在书店看了下序,觉得不错,还没看呢。
《人性的弱点全集》电子书看过一部分,放在枕边偶尔翻翻也挺有意思。
《梦的解析》弗洛伊德的经典之作,最近对心理学感兴趣了,买来瞧瞧,英文的,估计得慢慢看了。
《精通PKI网络安全认证技术与编程实现》工作中要用到,介绍还挺多的,虽然有不少篇幅是代码(有点为了增加页数的感觉),最近还是要好好看看的。

标签 :
分类 : Life
Top
09年05月15日   5 条评论

加密算法:

加密算法一般分为对称加密和和非对称加密,对称加密是指加密与解密使用的是同一密钥,而非对称加密加密解密使用不同的密钥,一般把两个密钥分别称为公钥和私钥。

对称加密算法又分为序列密码算法分组密码算法,从名字可以看出,序列密码算法在加密的时候每次只加密一个字节,而分组加密是把要加密的内容分为一块一块,例如16个字节,每次对这样一块数据进行加密。

典型的序列密码算法是RC4(由Ron Rivest发明,就是那个RSA的R),RC4是RSA公司的一种专有密码算法,在1994年的时候有人匿名发出了一份RC4的加密算法的代码,并被证明与RSA公司的RC4是兼容的。RC4是一种密钥长度可变的算法,其密钥长度可以在8~2048位之间。不管密钥有多长,都被扩展为一张固定尺寸的内部状态表,因此不论使用多长的密钥,该算法的运算速度都是一样快。

序列密码算法得到的密文是与明文一一对应的,因此为了防止被修改一般配合一种摘要算法来使用。

分组密码算法每次只能地固定的长度数据进行加密,例如16个字节,如果想要加密更大的数据,得使用ECB(Electronic Codebook)或者CBC(Cipher Block Chaining)模式。ECB只是简单的把消息分割成固定的16个字节,并使用加密算法对各块进行加密,这种方式有着明显的不足,例如两段很相似的明文,另密后也会产生很类似的密码,这会暴露给攻击者很多信息。CBC解决了这个问题,对每个明文分组的加密依赖于前一密文分组的密文。这是通过在加密前会使用前一个密文分组与明文进行异或来实现。这个时候第一个文明分组会与一个叫做IV(初始化向量)的随机分组进行异或。

DES是应用最为广泛的对称式加密算法,它是一种具有56位密钥的64位分组,意思就是以8字节大小的分组进行加密,密钥空间为56位,DES密钥的实际是64位长,但是每个字节的低位用来做奇偶校验。由于计算机速度的提高,DES已经被认为是不安全的了,毕竟密钥太短。在这种情况下3DES算法就出现了,3DES算法一般使用加密-解密-加密(EDE)的模式。

RC2同样是R发明的分组密码,它采用一种经过变形的变长密码,它还具有一种可变的有效密钥长度。

AES至少有128位的分组大小,可以用128、192、256位的密钥长度。

非对称加密:

最出名的算法应该是RSA了,RSA的理论基础很简单,而算法的安全性基于一个数学难题:“对一个大素数进行因数分解”。

Diffie-Hellman(DH)是首个公开发表的公钥加密算法(RSA一开始是有专利的),一般用于密钥磋商,而RSA用于密钥交换。

摘要算法:

摘要算法比较简单,从设计的角度来看,所有的摘要算法都非常的相似,唯一的区别就是输出尺寸的不同。两种最流行的算法为MD5、SHA-1。由于MD5的输出长度只有128位,而且存在了相关的破解方法,所以一般在PKI中推荐使用SHA-1。

分类 : Life
Top
09年05月15日   5 条评论

先给大家看一个关于网银与USB-KEY的科普教程:

http://apex.ncksoft.com/archives/tag/usb-key

写得还不错,看完后你对目前网银的安全模式应该有个大概的了解。

目前公认最安全的网银模式就是使用2代U-KEY,就是在普通的USB-KEY的基础上增加一个确认按钮和LCD显示屏,这样可以极大的确保每一笔交易是经过你的确认。目前工行已经推出了二代U-KEY。

这里解释下二代KEY出现的背景,由于我们平时使用的电脑是“不可信环境”(在病毒、木马泛滥的年代,大部分人的电脑都可以被被木马随意操作),所以我们不能相信自己的鼠标,比如我们点了下鼠标,做了一笔转帐交易,木马很可能帮你再点一次,这个时候就得在U-KEY上加一个确认按钮,防止木马偷偷做交易;我们也不能相信自己的眼睛,例如本来打算用1000块钱买个手机,结果木马把这个数字在发往U-KEY时改成了1W,而在屏幕上显示的仍然是1000,我们很无辜。这个时候你得在U-KEY上确认下我刚才是不是花了1000块去买那个手机。

U-KEY其实已经是一台完整的计算机了,根据冯·诺依曼原理,输入设备(LCD显示,按钮)、存储设备(16-32K)、运算器、控制器(智能卡CPU),而且U-KEY还有自己的操作系统COS(Card Operating System)。由于平台的特殊性我们可以假定不会有木马进入这个U-KEY,因为所有针对U-KEY的操作都要通过COS对外提供的接口来完成,而且不同厂家的COS一般是不同的。这个时候U-KEY是一个“可信环境”,所以我们可以确保在按下“确认”按钮的时候U-KEY一定是对LCD上显示的交易进行了签名,签名算法可以确保该签名后的数据无法被修改。

最近公司在做U-KEY,不过不是传统意义上的USB-KEY,所以得和SSL,,CSP,PKI,X509等这些安全、加密、证书相关的东西打交道。

分类 : 互联网
Top
09年05月08日   5 条评论

SSL是用于网络安全传输的协议,在TCP之上,HTTP之下。以前对标题里面这几个有点分不清楚,今天花了点时间整理下概念。

SSL为(Secure Sockets Layer)的缩写,是网景公司为网络安全传输制定的一套标准,SSL1.0没有公开发布过,所以SSL1.0可以无视之。SSL2.0在1995年发布,不过因为有很多的安全漏洞,所以SSL3.0很快在1996年就出现了。不过主流的浏览器在很长的一段时间内都在支持SSL2.0,IE6默认是支持SSL2.0的(IE7中SSL2.0被禁用了),Firefox2以后禁用了SSl2.0,Opera在8.5以后也禁用了SSL2.0。

IETF在1999年的时候以SSL3.0为基础,制定了TLS(Transport Layer ) 1.0,RFC2246对TLS进行了详细的描述。TLS 1.0在框架上完全使用SSL3.0,只是在一些细节上有差异,比如采用的算法集,随机函数的产生,这里有一篇文章对TLS与SSL3.0区别进行了详细的描述。
由于TLS基本上是对SSL3.0的补充,因此在很多地方SSL3.0 TLS这两个名词被混合使用。

TLS也在更新,不过变化不大,RFC4346对TLS 1.1进行了详细描述。
TLS最新版本为1.2,相关的RFC为RFC5246

目前国内网站使用的其本上都是基于SSL3.0的。

以下是wireshark抓包一个SSL3.0的通信过程:

client ------------->server [Client Hello]
server ------------>client [Server Hello]
server ------------>client [Certificate]
client ------------->server [Client Key Exchange , Change Cipher Spec, Encrypted Handshake Message
server ------------->client [Change Cipher Spec, Encrypted Handshake Message
client -------------->server [Application Data]

标签 :
分类 : 互联网
Top