新浪sae体验

    首先,我想提下云计算的概念。长期以来大街小巷都提到“云计算”,但我一直没弄懂,因为我不知道我能从中获得什么便利,直到开发上接触并用到了PaaS,才有所认识。我对云计算的理解是:云是一台可以无限伸缩的计算机,有无限的带宽,CPU,内存,存储,操作系统,软件服务等资源,用户所有的信息化处理业务都可以接入云,并按需计费,就像我们家中的水电煤气一样,我们需要用多少就支付多少费用,丰俭由君,这是面向大众用户的一种解释。至于云底层的实现,是通过虚拟化的技术将现实中的无数物理服务器,带宽,操作系统等各种资源整合在一起,形成一个具有无限伸缩能力的虚拟计算机。

    另外,从服务层次理解,云计算分为IaaS,PaaS,SaaS三种。IaaS表示基础设施即服务,正如前面讲到的,将所有资源整合成一台虚拟计算机,完成这个步骤的厂商往往是IT巨头企业,如google,amazon,IBM等,这些厂商能将自己遍布全球的数据中心所有资源进行整合,然后面向上层PaaS服务商推出基础设施服务;在此基础上,PaaS(平台即服务)厂商对云的功能进一步丰富,提供各种开发语言的支持及程序的运行环境(web应用服务器,数据库),再加上对应的资源配置功能,即可面向上层用户(SaaS服务提供商)提供服务,PaaS这一层的提供商提供的产品有Google的GAE,Microsoft的Azure,国内的有新浪的SAE,百度的BAE等;最上面这层SaaS,表示软件即服务,这一层服务的提供商利用PaaS提供的程序运行环境,搭建自己开发的程序或现成的软件,面向普通大众消费者提供资讯网站,手机APP访问等网络服务。

    一般而言,PaaS服务的消费者主要是中小企业和个人软件开发者,尤其是IT行业创业的个人或企业,往往基于PaaS平台可以极大地降低创业成本,提供更好的SaaS服务给客户。

    好了,回归正题,有了上面的模型,作为开发人员,我能很好地找准自己在云计算平台中的定位,我所能直接利用的就是PaaS服务,把自己的软件放上去,然后就可以通过浏览器访问了,这里介绍的就是新浪sae(sina app engine)。

    选择sae是因为它可以免费试用,注册后有赠送的云豆用于服务计费。sae目前支持java,php,python语言,用户可以上传web应用和移动应用,提供mysql,kvdb,memcache等传统关系数据库,key-value分布式数据库和用于分布式内存缓存的数据库,另外还为开发者提供了Storage用于分布式的文件存储服务,基于这些高大上的服务,当然少不了后台管理功能。

    首先,我要布署一个java web应用,需要用到后台mysql数据库。我在控制台创建一个新应用,输入对应的二级域名和应用名称,配置好运行所需资源。

第二步,进入该新建应用的管理界面,进入代码管理,上传代码。

第三步,很简单进入服务管理-MySQL,初始化数据库,可以得到一个与应用名称对应的数据库。

第四步,访问应用。

    综上,这是一个sae最简单的应用部署流程,其中需要注意的是,布署的应用是基于本地环境开发的,可能放到sae时会运行出错,此时就要具体问题,具体分析了。比如我发布这个java web demo时,就遇到了jdk的问题,本地用jdk1.7编译,而sae上的jre环境是用的Open JDK 1.6,导致java.lang.UnsupportedClassVersionError: t : Unsupported major.minor version,此时需要本地版本降级编译一下再部署。另外,数据库的用户名和密码是该应用对应的AccessKey和SecretKey,直接在应用代码中修改一下数据库配置即可,或者在应用代码中调用sae的API动态获取,我个人倾向前者,因为不想与运行环境API粘在一起。

数字证书

         前段时间接手了一个兄弟公司移交过来的项目,其中涉及资金交易安全的模块,采用了数字证书进行加密通讯,学习过程中走了不少弯路。目前工作终于告一段落,总算可以好好整理一下数字证书加密通讯相关的知识了。

         数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件。最简单的证书包含一个公开密钥、名称以及证书授权中心的数字签名(来源:百度百科)。换句话说,数字证书就是公钥、签名者及被签名者身份信息的载体,也就是说,签名者证明被签名者的真实有效的身份。比如支付宝首页打开就可看到url地址栏中的绿色标识,点击可看到该证书是第三方证书机构VeriSign公司证明了支付宝的真实身份(如果VeriSign系统被攻破,黑客用它来给危险的网站签名身份,那就危险了。。。当然这种可能性应该微乎其微,毕竟VeriSign可是第三方证书机构的佼佼者)。

        提到证书,就离不开加密,加密算法主要分两种:对称加密非对称加密。两者很好区分,加密解密使用的是同一个密钥,则属对称加密;而非对称加密解密使用的是两个不同的密钥——公钥和私钥,其中公钥加密,私钥解密。对称加密包括DES(Data Encryption Standard),3DES(DES的增强),RC2,RC4,RC5,Blowfish以及IDEA(International Data Encryption Algorithm,也是对DES的增强)等;非对称加密有RSA(使用最广泛)Elgamal、背包算法、Rabin、D-H(Diffie-Hellman)ECC(椭圆曲线加密算法)。算法真多,具体内容可百度谷歌。

        公司的项目中主要用的是RSA非对称加密算法,所以它是本文的重点。非对称加密,简单讲,就是数据发送方用公钥加密,数据接收方用私钥对密文解密(公钥和私钥成对出现,两者中任意一个都可作为公钥,而另一个作为私钥)。使用非对称加密通讯的基本原理是:

1.两个系统A和B之间要加密通讯,首先A和B都要分别生成自己的公钥和私钥。

2.A和B的公钥交换:A的私钥自己保密,把公钥告诉B;B的私钥自己保密,把公钥告诉A

3.A给B发送信息时,A用B的公钥加密信息,然后发送给B。

4.B收到A发过来的消息后,B用自己的私钥解密该消息。

5.同样的,B可以用A的公钥将响应信息加密后发送给A,然后A用自己的私钥解密。

在整个通讯过程中,即便有人截获了A与B之间的通信报文,但由于用来解密的私钥在A与B自己手里,所以截获者最终拿到的是无意义的密文,从而保证了通讯的安全。

用最简单的事实说话:什么是Cookie,Cookie数据泄漏的危害

一、什么是Cookie

        简单来说,Cookie是网站在用户浏览器中保存下来的一份个人信息,有了Cookie,用户下次访问该网站时就可以免输入用户名甚至密码了(比如登陆淘宝网,用户名一栏就自动填充了,而为了安全,密码是必须的),因网站而异。另外,用户使用账号登陆网站后,要靠Cookie来维持会话Session,以保持在线状态,一旦清空当前网站对应的所有Cookie数据,用户将立即下线。真啰嗦,看图:

这是在OSChina登陆状态下的Cookie。接下来把它清除,然后刷新,结果如下:

可以看出,没有了Cookie,用户马上变成了游客身份,也就是用户维持登陆状态的信息已经不存在了。所以说,如果没有Cookie,许多网站都登陆不上去了。再比如,当用户访问京东等购物网站时,在不登陆的状态下,可以直接将选中的商品加入购物车,其原理也是基于Cookie来记录用户的购物车数据,只要不清除它,下次再打开该网站时,购物车依然能够显示添加的商品。

二、Cookie数据泄漏的危害

        又以上面OSChina为例,如果我打开第二个浏览器(猎豹),以游客身份访问oschina.net,然后把之前浏览器(Chrome)Cookie中的oscid值取出来,注入第二个浏览器中,结果会怎么样呢。

通过脚本注入这个oscid值,然后刷新,即可看到,游客身份变成了在线用户。也就是说,有的网站就是通过一个或多个cookie值来映射到一个会员ID,只要任何一台电脑的任何一个浏览器中包含这些Cookie值,就可以实现会员自动登陆。当然,这个cookie值会有一个过期时间(由网站系统响应头决定),以保证一定的安全性,另外补充一点,oschina对cookie的oscid值禁用了js读取或者httponly,以防网站未知的XSS跨站脚本漏洞导致用户账户被盗,所以为了演示的需要,我是从浏览器的设置功能中取出来的。

    cookie的作用不小,给用户和网站经营者带来很大的便利,但同时不可避免带来一些安全隐忧,只要我们保持安全意识,不在公共电脑上登陆敏感账户,我们就能趋利避害,享受cookie。

最简单的SSH代理客户端实现

    我的SSH帐号是通过香港的虚拟主机附赠的,目前主要是用浏览器插件(比如SwitchySharp)+ MyEnTunnel/Bitvise + 远程主机SSH代理服务的模式实现的。

    一直以来相安无事,但前几天主机商把SSH服务的监听端口由默认的22改为了2289,在家里将相应的端口也改过来即可恢复正常,但在公司就没那么幸运了。公司内部网络对外网的端口访问作了限制,只能访问标准的如80,8080,21,22等端口,很不幸,2289端口不在此范围内。几天下来出不了墙,很是焦虑,后来在公司的几台测试用linux服务器上通过telnet myhost.com 2289测试可用,太幸运了,至少找到了一个可供代理出口的机器,但是在linux机器上我用什么软件来替代MyEnTunnel/Bitvise呢,后来基于这个思路去寻找相关替代品,终于在走了这段弯路之后,发现了SSH命令本身就具备动态转发的功能。十分简单:

usage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]
           [-D [bind_address:]port] [-e escape_char] [-F configfile]
           [-I pkcs11] [-i identity_file]
           [-L [bind_address:]port:host:hostport]
           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
           [-R [bind_address:]port:host:hostport] [-S ctl_path]
           [-W host:port] [-w local_tun[:remote_tun]]
           [user@]hostname [command]

只需挑出几个必需的参数即可:

root@testserver [~]# ssh -D 0.0.0.0:7077 -p 2289 myname@myhost 

然后根据提示输入相应的用户密码即可,这样就完成了在公司内网代理服务器的实现(相对于我的办公电脑它是服务器,相对远程虚拟主机它是客户端)。当然也可以写自动化shell脚本,但因为是公用测试机器,就没这个必要了,而且可避免其他人看到我的账密信息。

参数说明:
-D 表示启用基于socks的动态端口转发,监听本地7077端口,0.0.0.0:7077表示将所有IP发送到本地7077端口的请求转发到远程myhost主机2289端口

-p 远程接收请求的SSH服务端口

当当网,我伤不起

    当当网,这个响当当的购物网站,虽然这些年用得不多,但偶尔也会买些书籍。这不,这几年在这家公司,每年会收到公司发给员工的生日礼品卡,这些礼品卡就是来自当当网,所以上当当网成为了一种必需。本来以为这种方式会相安无事地继续下去,但最近的一次当当网帐号被盗事件,让我最终选择离开。

    今年6月,我把礼品卡充入当当网帐户,当时帐户余额约100余元。到了11月份,打算买本书,未曾想我的当当网帐户进不去了,反复登陆我可能用到的用户名和密码,就是进不去,通过找回密码功能,居然提示我的帐户不存在。难道被盗了?上网搜索发现,去年(2012)当当网发生了一场巨大的帐号被盗事件,无数用户遭受不同程度的损失。尽管当当网声明将全额赔偿用户,并且也有不少网友撰文通过各种努力(包括在微博留言李国庆)获得了赔偿,但也有许多就这样无声无息了。没想到去年的风波竟然在归于平静一年多后又波及我等小辈,实在无聊。

    最后经与当当多次电话和邮件得知我的帐户已被注销,礼品卡余额在10月份已被盗用,已为我恢复了帐号。但最要命的是,当当最终回复我的是:已报警,等有结果了自然会通知您。这是玩哪般啊,我犯错了吗,为什么不赔偿我,我承认我的密码没有及时修改,但当当网应该负首要责任:

1.去年(2012)当当网出现过用户余额被盗用事件,声明会加强系统安全,也就是所谓系统安全加强一年多后我的帐户却被盗。

2.当当网的执行力有问题。有用户反映自己的余额被盗用后商品正在寄往陌生人的地址,请求当当网拦截物流,但许多都失败了。

3.最严重的,普通的当当网用户根本无法将自己的帐户注销。这意味着什么,有人用高于普通用户的权限或漏洞进入了当当网帐户系统篡改用户数据,修改用户的验证手机号,使得盗买商品时户主无法及时接收到短信提醒,并将该用户帐户注销。或者说,当当网内部有人监守自盗,直接篡改数据。即便CSDN帐户信息泄露,也绝非可能做到销户。

    最后,我想说的是,目前的当当网帐户系统肯定是百分之百不安全。我的猜想是,有人已经非法获取了当当网大量帐户信息,并在有需要时会光顾您。什么叫有需要时?如果你的帐户没有多少余额,可能你的帐户是“安全的”,因为偷窃者不会打草惊蛇,待你余额可观,或者值得“拿过来”时,那你就会遭遇跟我一样了。不信?你充几百块钱到当当网帐户并存放几个月试试(豆瓣网有网友反映帐户被盗并恢复帐户之后一个星期再次被盗)。总之,基于这种情况,即使你修改密码加手机验证也没用,因为偷窃者是通过当当网系统安全漏洞或内部员工管理漏洞以高级权限篡改数据的。怎么办?远离当当是唯一选择。

补充:今天网上有人传言当当网缺钱(被盗如此严重,要承诺如去年般的全额赔偿,能不缺钱?难怪不赔偿我),李国庆正考虑为当当网寻找买家。

http://www.techweb.com.cn/internet/2013-12-13/1369556.shtml

windows系统中通过被占用的端口找到进程

    通常在linux平台下会用一些基本的命令来找到对应的进程并杀死,但今天在本地windows电脑上使用某个软件时,有个端口被占用了,不想注销也不想重启,于是找到了这几个命令,轻松搞定。

一、用netstat命令找到占用指定端口的进程ID

C:\Documents and Settings\Administrator>netstat -ano|findstr 7077
  Proto  Local Address          Foreign Address        State           PID
  TCP    0.0.0.0:7077           0.0.0.0:0              LISTENING       2352

这里的端口是7077,通过此命令找到了进程ID2352。

二、用tasklist命令找到进程ID2352对应的程序名称

C:\Documents and Settings\Administrator>tasklist|findstr 2352
图像名                       PID 会话名           会话#       内存使用
========================= ====== ================ ======== ============
plink.exe                   2352 Console                 0      5,820 K

原来是名叫plink.exe的程序占用了此端口,那就在任务管理器中找到并直接干掉它吧。

三、不想用任务管理器,那就用命令taskkill吧

C:\Documents and Settings\Administrator>taskkill /PID 2352
成功: 已终止 PID 为 2352 的进程。

直接通过命令taskkill杀死指定进程2352。其实挺简单,在操作上整体跟linux平台思想相通,只是命令及其参数不同耳。

局域网共享SSH代理小技巧

      基于目前国内的某些因素,访问国外的网站会有诸多限制,从而使上网代理行业(翻qiang)在国内十分火热。我所知道并使用过的代理方式有http、VPN和SSH,整体来讲,好用的代理不免费,免费的代理不好用。其中我比较喜欢的是SSH代理,不但轻便灵活,而且穿墙速度也不错,更重要的是价格也便宜。由于我使用的是国外的主机,所以代理商基于此主机免费赠送了我一个基于此主机帐号的SSH代理帐号,这让我有点喜不自胜。

      好了,不多说了,由于同事也有穿墙的需要,但又不愿花那几十大洋,那就把我的私家珍藏共享出来吧。

      我所使用的工具是:Chrome+SwitchSharp+MyEntunnel,当然还有SSH帐号。

      默认情况下,MyEntunnel是只允许本地电脑使用SSH代理的,但通过网上查找发现,此工具是基于plink实现,可以通过MyEntunnel程序文件夹下的myentunnel.ini进行配置,从而实现本地SSH代理端口在局域网共享。具体方法如下:

SOCKSPort=7077
改为
SOCKSPort=0.0.0.0:7077

保存后重启MyEntunnel,再在SwitchSharp中修改:

SOCKS 代理由原来的127.0.0.1改为本地局域网IP,比如我的内网IP为10.16.0.20

然后代理访问某国外网站试试,如果成功,就可以在其他局域网电脑上对SwitchSharp作同样的配置,这样,所有的电脑都可以通过我的电脑来穿墙了,从而实现了资源的充分利用,是不是很爽。

      后记:
      之所以要通过myentunnel.ini文件来修改,是因为MyEntunnel这个图形界面中“本地端口”只能输入纯数字,所以在此走了个后门。如果你觉得麻烦,可以试试
Tunnelier,他跟MyEntunnel是同类工具,但可以支持界面中直接配置所有IP(0.0.0.0表示允许局域网所有网络设备访问本地SSH代理端口),具体可参考此文:http://www.eygle.com/digest/2010/09/tunnelierssh.html

修改windows操作系统的默认浏览器

    电脑用久了,会发现自己的默认浏览器被篡改,而且在Chrome浏览器的设置项中已无法将其修改为默认浏览器,今天我也遇到了,于是在网上找了些修复方法,自己试了两种,经验证有效。

系统环境:windows XP SP3

已安装浏览器:IE8、Chrome、Firefox、百度浏览器

方法一:通过控制面板修改

控制面板→添加或删除程序→设定程序访问默认值→自定义,然后选择自己喜欢的Chrome

QQ截图20130426092515

方法二:通过修改注册表实现

1.HKEY_CLASSES_ROOT\http\shell\open\command,双击”默认”,输入默认浏览器的可执行文件的完整路径。例如:输入“C:\Program Files\Google\Chrome\Application\chrome.exe”  “%1”。注意后面有空格+”%1″ 

2.HKEY_CLASSES_ROOT\http\shell\open\ddeexec\Application,双击”默认”,设置浏览器名,如果是Firefox则输入Firefox,如果是IE则输入IExplore。(此步骤为可选)

tomcat运行phpMyAdmin配置

前提条件:已拥有了tomcat及java环境
一、下载
1.最新版本php环境
官网:http://www.php.net/downloads.php
本测试是在windows xp环境进行,所以我下载了windows版本的二进制包
php-5.4.13-nts-Win32-VC9-x86.zip

2.最新版本的phpMyAdmin
官网:http://www.phpmyadmin.net/home_page/downloads.php
我下载的是phpMyAdmin-3.5.7-all-languages.zip

二、配置
1.tomcat配置
我用的是apache-tomcat-7.0.21。tomcat默认只支持jsp,要想使其运行php,当然得适当配置。
首先配置${TOMCAT_HOME}/conf/web.xml,将关于cgi的内容取消注释,如下:

<servlet>
    <servlet-name>cgi</servlet-name>
    <servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class>
    <init-param>
       <param-name>debug</param-name>
       <param-value>0</param-value>
    </init-param>
    <init-param>
       <param-name>passShellEnvironment</param-name>    
       <param-value>true</param-value>    
    </init-param>
    <init-param>
       <param-name>executable</param-name>   
       <param-value>php-cgi</param-value>    
    </init-param>
    <init-param>
       <param-name>cgiPathPrefix</param-name>
       <param-value>WEB-INF/cgi</param-value>
    </init-param>
    <load-on-startup>5</load-on-startup>
</servlet>

当然还有它的映射servlet-mapping,如下:

<servlet-mapping>
    <servlet-name>cgi</servlet-name>
    <url-pattern>/cgi-bin/*</url-pattern>
</servlet-mapping>

关于上面CGIServlet的参数<param-name>executable</param-name>,有两种配置方式,如果在安装php环境时已将php安装目录配置到了系统变量path中,则只需写相应的命令名,如上。另一种是直接指定php解释程序的绝对路径,如<param-value>D:\php\php-cgi.exe</param-value>。
注意:

a.php安装目录下有三个exe可执行文件,除上面的php-cgi.exe之外,还有php.exe及php-win.exe,经本人简单测试,要想让php文件能被tomcat正常解析,应该使用php-cgi.exe。
b.参数passShellEnvironment必须显示设为true,否则在phpMyAdmin首页输入帐密无法登入。

然后配置${TOMCAT_HOME}/conf/context.xml。很简单,在<Context>元素中加入属性,如<Context privileged=”true”>,配置这个属性的目的就是让tomcat能够启用CGIServlet,否则php文件无法执行。

2.php配置
我将php压缩文件解压到D盘,并将目录名简化为php,即D:\php。
首先将\php目录下的php.ini-development复制并重命名为php.ini,然后修改此文件,如下:

cgi.force_redirect 去掉前面的;分号,并改为0(默认为1,页面上会有安全提示信息,必须设为0)
extension_dir = "ext"  去掉前面的;分号。
extension=php_mbstring.dll  去掉前面的;分号。
extension=php_mysqli.dll  去掉前面的;分号。

这里配置的目的是为了使用php正常工作及连接mysql所需的扩展组件。

 3.phpMyAdmin配置
将phpMyAdmin-3.5.7程序解压,并重命名为phpMyAdmin,然后拷贝到${TOMCAT_HOME}\webapps\ROOT\WEB-INF\cgi目录下,自建cgi目录。

三、结束
启动tomcat,通过浏览器访问:http://localhost:8080/cgi-bin/phpMyAdmin/index.php
登陆页面成功显示。

子网掩码导致的问题

因为要对公司客户的系统进行维护。竟然在VPN到客户的内网之后,怎么也无法通过SSH和FTP的方式进入服务器。然后在座位旁的另一位同事电脑上尝试却能够成功。于是我想到了IP地址,可能公司网络有所限制。
我的IP如下: IP地址:10.16.0.20 子网掩码:255.0.0.0 默认网关:10.16.0.1 同事的IP如下: IP地址:10.16.0.26 子网掩码:255.255.255.224 默认网关:10.16.0.1 也就是说,我们的IP地址看上去是属于同一网段,但由于子网掩码不同,实际上并不属于同一网段了。最后按同事电脑的子网掩码配置,问题解决。
疑问1:为什么VPN就能够正常连接?
疑问2:IP地址与子网掩码的组合,就像数据库表中的联合主键一样代表同一网段上的某个主机?