电脑价格真是降得飞快啊!贴几张很久以前买电脑配件时留的收据,就知道那个时候的电脑价格了……
今天公司组织体检,时间比上班还早,8:30am之前就要求到了。检了B超、验血、尿检、内科、外科、眼科、五官、口腔,还加了个颈椎照片。
我的胆结石还是被检了出来,呵呵。不过好像比去年检的时候小了点,去年检的时候是1×1.5cm,今天检出来的是1×1.3cm。比了比觉得还是大呢~唉!除了胆结石以外,居然还检出了个脂肪肝!郁闷了。我又不喝酒,居然还有脂肪肝。
看来下大决心减肥是非常必要了……
昨天才把Blog发了,机器就又死机了。重启后硬盘都找不到,郁闷啊!只有拆下来送修了。仔细数了一下,整块主板,居然爆了24个电容!夸张啊!等于就是整块主板的大电容都爆光了…… 汗…
今天拿去送修,顺便问了一下收二手的。看看如果把CPU和主板处理给二手的大概需要多少钱。结果收二手的说这块主板电容会爆,只收50元,CPU倒是收150元。晕啊!看来这块硕泰克的KT400是有质量问题。我才想起来,我一个朋友的一模一样的那块主板也是因为电容全爆而挂了的。唉……本来还很相信硕泰克的……
拿到朋友那里,朋友一看,说那么多电容, 要明天才可以搞定。结果就是:晚上没电脑用了。唉,算了吧。不就一天么,忍忍就过了。:D
PS: 今天小弹簧换发型了!Mark一下!越来越Pretty,造型换得越来越像“小弹簧”了!嘿嘿。想要看看小弹簧新发型的可以密我,hoho
-DOPOD 575
MD5是在Web应用程序中最常用的密码加密算法。由于MD5是不可逆的,因而经过MD5计算得到后的密文,不能通过逆向算法得到原文。
回顾在Web应用程序中使用MD5加密文本密码的初衷,就是为了防止数据库中保存的密码不幸泄露后被直接获得。但攻击者不但拥有数据量巨大的密码字典,而且建立了很多MD5原文/密文对照数据库,能快速地找到常用密码的MD5密文,是破译MD5密文的高效途径。然而,MD5密文数据库所使用的是最常规的MD5加密算法:原文–>MD5–>密文。因此,我们可以使用变换的MD5算法,使现成的MD5密文数据库无所作为。
下面演示一些变换算法的例子
当然,在其它的Web开发语言中,也大同小异,完全能得到相同的结果。
变换一:循环MD5
最容易理解的变换就是对一个密码进行多次的MD5运算。自定义一个函数,它接受$data和$times两个形参,第一个是要加密的密码,第二个是重复加密的次数。实现这种变换有两种算法——
以下是引用片段:
<?php //递归算法 |
变换二:密文分割MD5
尽管用户的密码是不确定的字符串,但是只要经过一次MD5运算后,就会得到一个由32个字符组成的字符串,这时可以再针对这个定长字符串变换。有点BT的算法是,把这段密文分割成若干段,对每段都进行一次MD5运算,然后把这堆密文连成一个超长的字符串,最后再进行一次MD5运算,得到仍然是长度为32位的密文。
以下是引用片段: <?php //把密文分割成32段,每段1个字符 |
当然,这种密文分割的具体算法是数之不尽的,比如可以把原密文分割成16段每段两字符、8段每段4字符,或者每一段的字符数不相等……
变换三:附加字符串干涉
在加密过程的一个步骤中,附加一个内容确定的字符串(比如说用户名),干涉被加密的数据。不可以用随机字串,因为这样会使原算法无法重现。这种算法在某些情况下是很具有优势的,比如说用于大量的用户密码加密,可以把用户名作为附加干涉字串,这样攻击者就算知道你的算法,也很难从他们手中的字典中一下子生成海量的对照表,然后大量地破译用户密码,只能有针对性的穷举为数不多的用户。
以下是引用片段:
<?php //附加字符串在原数据的头部 //附加字符串在原数据的头尾 |
变换四:大小写变换干涉
由于PHP所提供的md5()函数返回的密文中的英文字母全部都是小写的,因此我们可以把它们全部转为大写,然后再进行一次MD5运算。
以下是引用片段:
<?php |
变换五:字符串次序干涉
把MD5运算后的密文字符串的顺序调转后,再进行一次MD5运算。
以下是引用片段:
<?php |
变换六、变换七、变换八……
MD5变换算法是数之不尽的,甚至无须自己再去创造,就用上面的五个互相组合就可以搞出很BT的算法。比如说先循环加密后再分割,并在每一段上附加一个字符串再分别加密,然后变换大小写并颠倒字符串顺序后连成一个长字符串再进行MD5运算……
如果真的很不幸,由于某些漏洞,比如说SQL Injection或者文件系统中的数据库被下载而异致用户密码数据暴露,那么MD5变换算法就能大大地增加破译出密码原文的难度,首先就是使网上很多的MD5原文/密文对照数据库(要知道,这是破译MD5最高效的方法)没有用了,然后就是使攻击者用常规算法去穷举一串由变换算法得到的密文而搞得焦头烂额。当然,MD5变换算法特别适合用于非开源的Web程序使用,虽说用在开源的程序中优势会被削弱(大家都知道算法),但是也能抑制MD5原文/密文对照数据库的作用。要进行这些复杂的变换运算,当然就要花费的更多的系统开销了,然而对于安全性要求很严格的系统来说,多付出一些来换取高一点的安全性,是完全值得的。
问题一:如保加载JDBC驱动程序
正常我们加载驱动程序有三个途径:
1)Class.forName(String)这想当于classLoader一个String指定的类,在装载时把该驱动程序的静态内容都初始化,其实这时驱动程序类调用了DriverManager.registerDriver(driver);方法
2)使用系统属性:System.getProperty().load(new FileInputStream("属性文件"));
在属性文件中指定jdbc.driver=drivername 这样的好处是可以同时加载多个JDBC,换数据库时不用访问JAVA源代码,只是修改属性文件
3)直接registerDriver(driver)这种方法最可靠,可以在任何环境下使用。
1)方法简单,但MS的JVM不能正确初始化。比如使用IE时在APPLET中就不能使用,应该用3)的方法。但3)方法在灵活性方面不如2),可以根据环境综合考虑。
问题二:大对象存储
一般来说,大对象存储是把文件存到数据库中,当然也可以内存中的超大字符串。对于象图片这样的文件当然是用二进制存储,这里有很多误区,网络上的教程99%都是行不通的,连SUN自己的文档都一直错误,虽然错误很小。按说二进制文件应该存为BLOB类型,但JBDC2并不能直接对BLOB存入二进制文件,如果你这样做,会得到一个IO而不是SQL异常,为此花了我近两个小时才弄清楚。
如果要把一个二制文件存入ORACLE,用标准的JDBC你就要用LONG ROW类型:
create table tb_file(name varchar(20),detail long row);
然后
File file = new File("aaa.gif");
int fileLength =(int) file.length();
InputStream fin = new FileInputStream(file);
PreparedStatement pstmt = con.prepareStatement("insert into tb_file values(´aaa.gif´,?)");
pstmt.setBinaryStream (1, fin, fileLength);
pstmt.executeUpdate();
如果你一定要用BLOB存储,你就必须用ORACLE自己的方法:
create table tb_file(name varchar(20),detail BLOB);
con.setAutoCommit(false);
stmt.executeUpdate("insert into tb_file values(´aaa.gif´,empty_blob())");
下面必须SELECT得到BLOB的对象再向里写:
rs = stmt.executeQuery("select detail from tb_file where name=´aaa.gif´ for upfdate" );
if(rs.next())
{
Blob blob = rs.getBlob(1);
BinaryOutputStream out = ((oracle.sql.BLOB)blob).getBinaryOutputStream();
byte[] b = new byte[((oracle.sql.BLOB)blob).getBufferSize];
InputStream fin = new FileInputStream(file);
int len = 0;
while( (len = fin.read(b)) != -1)
out.write(b,0,len);
fin.close();
out.close();
con.commit();
}
同样读取数据你并不能象LONG ROW那样
InputStream in = rs.getBinaryInputStream("detail");
而要
Blob blob = rs.getBlob("detail");
in = blob.getBinaryStream();
问题三:可滚动结果集
ORACLE 明确说明不支持结果集滚动,那么我们用JDBC2得到一个可滚动的结果集就是同JDBC自己支持的,就是说结果集要在内在中高度缓存,很多很多的开发者都错误地认为是数据库支持的。只是他们没有真正查询大量行,如果真的查询大量行的话肯定是死定了!对于超大量行的数据,情愿返回到它的笨方法也不要使用可滚动结果集.
今天是亲爱的小弹簧的生日,呵呵。大家都来恭祝她生日快乐!
时间过得真是快啊,不知不觉就又过了一年。小弹簧终于完成了她的学业。不容易啊!整整19个春夏秋冬啊!终于修成正果了!开始跨入社会了!
跨入社会的第一步是最艰难的,希望小弹簧你能克服一切困难!实现你自己的梦想!
我亲爱的小PP,祝你生日快乐!
工作了可不要因为忙就不写Blog啊!呵呵
今天在Taobao上看中了一个Sigma的18-200的镜头。都已经拍下了,正在付款的时候被店主叫住了。说Canon口的Sigma 18-200的口没货了,而且他看了好几个地方都没货。也是牛!不过还好,还没付款。就把这笔交易取消了。
我还是比较看好这个镜头的,350D原配的套头是18-55的,变焦距离太短了。算下来的话,大概就只有3x左右的变焦。所以到野外拍景的话,很难把远处的景物拉近。所以买个10x左右的变焦镜头还是有点必要的。要不到了美丽的景色面前而拍不下来的话才是悔恨。
规 格:
焦 距:18-200mm
最 小 光 圈:F22
镜 头 结 构:15片 13组
视 角:69.3-7.1度
光圈 叶 片数:7片
最近对焦距离:45cm
放 大 倍 绿:1 : 4.4
滤 镜 尺 寸:62mm
遮 光 罩:花瓣型
体 积:直径70mm x 长度 78.1mm
重 量:405克