人若无名,便可专心练剑

使用gpg加密自己重要文件

  |   0 评论   |   2,879 浏览

有时候我们经常把一些重要密码放在电脑里边,但是电脑里边也并不是安全的因此,采用gpg进行非对唱加密就非常重要了。

知识前缀:

非对称加密:公钥加密,私钥解密。私钥签名,公钥验证


直入主题:

0x1:生成公钥与私钥

exp@c2y2:~/gpg$ gpg --gen-key 
gpg (GnuPG) 1.4.12; Copyright (C) 2012 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Please select what kind of key you want:  #加密类型
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
Your selection? 1
RSA keys may be between 1024 and 4096 bits long.#加密长度
What keysize do you want? (2048) 
Requested keysize is 2048 bits
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0) 
Key does not expire at all
Is this correct? (y/N) 
Key is valid for? (0) 0
Key does not expire at all
Is this correct? (y/N) y

You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
    "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"

Real name: c2y2_gpg #私钥名字 以后可以直接使用私钥名管理密钥
Email address: lexiangtaotao1988@gmail.com #私钥email
Comment: c2y2 #备注
You selected this USER-ID:
    "c2y2_gpg (c2y2) <lexiangtaotao1988@gmail.com>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o
You need a Passphrase to protect your secret key.#私钥密码

We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.

Not enough random bytes available.  Please do some other work to give
the OS a chance to collect more entropy! (Need 185 more bytes)#←运行一些的程序或者干些其他事,以便在内存中获得更多随机数

#随后生成密钥对
gpg: key 2C863550 marked as ultimately trusted
public and secret key created and signed.

gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
pub   2048R/2C863550 2014-09-20
      Key fingerprint = D815 F828 E4CE 6383 5100  D6F3 B54A 92AB 2C86 3550
uid                  c2y2_gpg (c2y2) <lexiangtaotao1988@gmail.com>
sub   2048R/5DD4F3B4 2014-09-20
ox2:查看那密钥对 
exp@c2y2:~/gpg$ gpg --list-keys
/home/exp/.gnupg/pubring.gpg
----------------------------
pub   2048R/2C863550 2014-09-20
uid                  c2y2_gpg (c2y2) <lexiangtaotao1988@gmail.com>
sub   2048R/5DD4F3B4 2014-09-20
ox3:生成撤销证书 
当您的密钥对生成之后,您应该立即做一个公钥回收证书,如果您忘记了您的私钥的口令或者您的私钥丢失或者被盗窃,您可以发布这个证书来声明以前的公钥不再有效。生成回收证书的选项是"--gen-revoke"。
exp@c2y2:~/gpg$gpg -o revoke.asc --gen-revoke c2y2_gpg
ox4:上传公钥到三方公钥服务器 
PS:如果一旦决定撤销已经上传的公钥,就需要将该密钥的回收证书上传至密钥服务器完成回收工作。
exp@c2y2:~/gpg$ gpg --keyserver subkeys.pgp.net --send-keys 2C863550
PS:当然您也可以定义默认的服务器keyserver,一般安装好后的默认keyserver都是subkeys.pgp.net。你也可以通过修改.gnupg/gpg.conf中的keyserver信息来改变你的key server。
ox5:密钥导入导出 
我们通常需要导出公钥和私钥保存起来,当然公钥是可以满世界的泼洒,但是私钥请务必保存好,否则你
的密钥对将会永久性的失去作用。

公钥的导出:
exp@c2y2:~/gpg$gpg -o filename --export mykeyID
如果没有mykeyID则是备份所有的公钥,-o表示输出到文件keyfilename中,如果加上-a的参数则输出
文本格式( ASCII )的信息,否则输出的是二进制格式信息。

私钥的导出:
exp@c2y2:~/gpg$gpg -o keyfilename --export-secret-keys mykeyID
如果没有mykeyID则是备份所有的私钥,-o表示输出到文件keyfilename中,如果加上-a的参数则输出
文本格式的信息,否则输出的是二进制格式信息。
密钥的导入:
gpg --import filename
gpg --keyserver hkp://subkeys.pgp.net --search-keys xxx 
从服务器搜寻证书并下载证书
PS:用户可以使用gpg --list-keys命令查看是否成功导入了密钥。
ox6:文件加解密
加密:exp@kali:~/gpg$gpg -r c2y2_gpg -o outfilename.en.gpg -e text.txt
解密:exp@kali:~/gpg$gpg -o outfilename -d outfilename.en.gpg 

ox7:签名验证

签名:
exp@kali:~/gpg$gpg -s test.txt
验证:
exp@kali:~/gpg$ gpg --verify-files filename
ox8:删除密钥对
注意:删除密钥对时,先删除私钥然后才能删除公钥
删除私钥:
exp@c2y2:~/gpg$ gpg --delete-secret-keys c2y2_gpg
删除公钥:
exp@c2y2:~/gpg$gpg --delete-keys c2y2_gpg


后记:有时候我们密码太多了,而自己又记不住,因此为了方便密码统一管理,我们可以对存放密码的文件进行非对称加密处理

加密处理后的文件我们可以放到任何网盘上,即时别人拿到了我们的密码存放文件,也是无法查看其具体内容的,因此在这个毫无节操的社会

节操也就大大增强了


我的公钥:


-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.12 (GNU/Linux)

mQENBFQdUwEBCAC4Yh9kjOiKnJ+6v8dSrbOagk8WBYXwm6bjCa8F7uDfF5Mel/UI
8GxF1N3IP/8WfXY8zfpqZmTsd0sig+gb4aYOA1FSD3SRAt0/B8X5CpDc8AbLHmdq
RHn2itkUumT0QSjw0dEuaLCRs8KqQcZ4D+Vavk+jDwqd8Wnyo+xmPy1WcT7hVr3h
TouhyrEoRfxjJx1Mllfzij4u/p7uTOy5z6CjkccMRJ4EVUN+rOQvkIgcaqsr36ed
uCvWK6C22TI5kFr6m2BX6uBw5ts04qabrc6qY+HGBC9ljghGLEn3XLza4JpMChVj
2U15681moOgkjSC7q55AC32y0mqLJZCVvV/pABEBAAG0NmxleGlhbmd0YW90YW8x
OTg4IChjMnkyKSA8bGV4aWFuZ3Rhb3RhbzE5ODhAZ21haWwuY29tPokBOAQTAQIA
IgUCVB1TAQIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQ0cNcJgEtAkbu
DAgApvoVJd9Cly9v04YqQsEAmzSKeanG8HUC7BbKO0+zkvJX9aF0lIp7vW8brxq7
eBNemt/H5HhWzjH5+RRaRNZeFsklbYXV4BA/Mo6RZfGuIka8kLdUwZIuv5sAYavH
LK7kIDms5X853s24ucVx3CPjHDCyE4c3xInU855CkvzIB6ZV6eFwIwxfp7QJDv0i
4VZKn5HxzQaKOHZpqWdSFOl9qT9CSgOi17YWneFUPFwGczrn4LX987+TGmL9CQmC
cFrOLMk/jLoRmFEmJzhBFhCJKMaH7Y9VhWw43SCidcvFvr8KYTjCNAl123kLD9vc
L5SGIGbUOyWvPi7KIbICAwmILbkBDQRUHVMBAQgA6t3fcJJ93ulJmSzK45ddxJLf
IP19nKqUQ/xIqYKa2kawcWdhLN0V52oMRAEEc9kqEn3xhcIM09NhAN4p+DXffdXg
J0WAfP7iLECVF29NAcMt+kszYZSqUk+CwHdKIL66+1/rtEy6XQbzM6BGqClqVxza
VNidg0uyy+ZiUUHPFUjlWvYye6Uygu2ySLg/MF62DmtuyZV9NBO9pUXtsJFTD1om
TmTVJIIstAnkGIcEyvguDbb9yZzjk0bGGbhxgl0rbCk3alOQCzfnuq7/1hdZOFDy
qY4G0yYhfJShf/rcxAwEYcXv5JT6f4cj4lt1EwbrkYZLtPQLQ11iyV5YWmPwhwAR
AQABiQEfBBgBAgAJBQJUHVMBAhsMAAoJENHDXCYBLQJGGJsH/RGx7RwYzc4vQtDP
syjxIf/fB675Dg0ykA/6OLEQcMT86EfbxPIa6NqG+IGepdpnMYY79UYrk0x88C3R
FjkOSmI+JDO43BIuoMVeInICTw5jo+ADumvjVaoc8nTJaRYmWKaDC8DgIa2lNp3q
4DRQHCawOb1lC1Ghqe+O0JMJeoBWQ7ZjHfXfOcyxo+wvyw7uJuxWFV/4FeF6nvSW
53V2SolyHtMtDym9qvkyLV9fpiYKRICxwmlOxLgn5mSdNBC1hP5igmpR25fHkpsY
KvFzH/VB64KhoOSH0vtWhjFqxBxqo1nDXQxeY2J2W0UCzgh3yqyR2D+SM7PNTDvD
PWFndF8=
=K8hO
-----END PGP PUBLIC KEY BLOCK-----



iptables规则链执行顺序

  |   0 评论   |   2,263 浏览

本文来源:from http://bbs.chinaunix.net/thread-936284-1-1.html

预备知识(转): iptable有三种队列(表)规则,mangle queue, filter queue, nat queue。

1。The first is the mangle table which is responsible for the alteration of quality of service bits in the TCP header.
2。The second table is the filter queue which is responsible for packet filtering.
    * Forward chain: Filters packets to servers protected by the firewall.
    * Input chain: Filters packets destined for the firewall.
    * Output chain: Filters packets originating from the firewall.
3。The third table is the nat queue which is responsible for network address translation. It has two built-in chains; these are:
    * Pre-routing chain: NATs packets when the destination address of the packet needs to be changed.
    * Post-routing chain: NATs packets when the source address of the packet needs to be changed

个人总结:
iptables执行规则时,是从从规则表中从上至下顺序执行的,如果没遇到匹配的规则,就一条一条往下执行,如果遇到匹配的规则后,那么就执行本规则,执行后根据本规则的动作(accept, reject, log等),决定下一步执行的情况,后续执行一般有三种情况。
1。一种是继续执行当前规则队列内的下一条规则。比如执行过Filter队列内的LOG后,还会执行Filter队列内的下一条规则。
2。一种是中止当前规则队列的执行,转到下一条规则队列。比如从执行过accept后就中断Filter队列内其它规则,跳到nat队列规则去执行
3。一种是中止所有规则队列的执行。

--------------------其它相关知识补充(转过来的)-----------------------------

iptables 是采用规则堆栈的方式来进行过滤,当一个封包进入网卡,会先检查 Prerouting,然后检查目的 IP 判断是否需要转送出去,接着就会跳到 INPUT 或 Forward 进行过滤,如果封包需转送处理则检查 Postrouting,如果是来自本机封包,则检查 OUTPUT 以及 Postrouting。过程中如果符合某条规则将会进行处理,处理动作除了 ACCEPT、REJECT、DROP、REDIRECT 和 MASQUERADE 以外,还多出 LOG、ULOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、TOS、TTL、MARK 等,其中某些处理动作不会中断过滤程序,某些处理动作则会中断同一规则炼的过滤,并依照前述流程继续进行下一个规则炼的过滤(注意:这一点与 ipchains 不同),一直到堆栈中的规则检查完毕为止。透过这种机制所带来的好处是,我们可以进行复杂、多重的封包过滤,简单的说,iptables 可以进行纵横交错式的过滤(tables)而非炼状过滤(chains)。

1  ACCEPT 将封包放行,进行完此处理动作后,将不再比对其它规则,直接跳往下一个规则炼(nat:postrouting)。
2   REJECT 拦阻该封包,并传送封包通知对方,可以传送的封包有几个选择:ICMP port-unreachable、ICMP echo-reply
    或是 tcp-reset(这个封包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接 中断过滤程序。 范例如下:
     iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset
3   DROP 丢弃封包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。
4   REDIRECT 将封包重新导向到另一个端口(PNAT),进行完此处理动作后,将 会继续比对其它规则。 这个功能可以用来实作通透式 porxy
    或用来保护 web 服务器。
    例如:iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
5   MASQUERADE 改写封包来源 IP 为防火墙 NIC IP,可以指定 port
    对应的范围,进行完此处理动作后,直接跳往下一个规则炼(mangle:postrouting)。这个功能与 SNAT 略有不同,当进行 IP
    伪装时,不需指定要伪装成哪个 IP,IP 会从网卡直接读取,当使用拨接连线时,IP 通常是由 ISP 公司的 DHCP 服务器指派的,这个时候 MASQUERADE 特别有用。范例如下: 
      iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000
6   LOG 将封包相关讯息纪录在 /var/log 中,详细位置请查阅 /etc/syslog.conf 组态档,进行完此处理动作后,将会继续比对其它规则。
    例如:
      iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets"
7   SNAT 改写封包来源 IP 为某特定 IP 或 IP 范围,可以指定 port
    对应的范围,进行完此处理动作后,将直接跳往下一个规则炼(mangle:postrouting)。
    范例如下:
      iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT --to-source 194.236.50.155-194.236.50.160:1024-32000
8    DNAT 改写封包目的地 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将会直接跳往下一个规则炼
   (filter:input 或 filter:forward)。
     范例如下:
      iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.1.1-192.168.1.10:80-100
9   MIRROR 镜射封包,也就是将来源 IP 与目的地 IP 对调后,将封包送回,进行完此处理动作后,将会中断过滤程序。
10  QUEUE 中断过滤程序,将封包放入队列,交给其它程序处理。透过自行开发的处理程序,可以进行其它应用,例如:计算联机费用.......等。
11  RETURN 结束在目前规则炼中的过滤程序,返回主规则炼继续过滤,如果把自订规则炼看成是一个子程序,那么这个动作,
    就相当于提早结束子程序并返回到主程序中。
12  MARK 将封包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续比对其它规则。
    范例如下:
      iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2

linux 敏感日志 清除

  |   0 评论   |   2,809 浏览

ox1,清除登陆系统成功的记录(last 所查看信息)

[root@c2y2]#echo > /var/log/wtmp //此文件默认打开时乱码,可查到ip等信息
ox2,清除登陆系统失败的记录(lastb 所查看信息
[root@c2y2]#echo > /var/log/btmp //此文件默认打开时乱码,可查到登陆失败信息
ox3,清除历史执行命令(history 说查看信息)
[root@c2y2]#history -c //清空历史执行命令
[root@c2y2]#echo > ./.bash_history //或清空用户目录下的这个文件即可
ox4,导入空历史记录(常用于,先备份,完事后,然后清除后还原,)
[root@c2y2]#cp /root/.bash_history /root/history.txt //备份记录文件
[root@c2y2]#history -c //清除记录 
[root@c2y2]#history -r /root/history.txt //导入记录 
[root@c2y2]#history //查询导入结果

ox5,清除认证记录(/var/log/audit 所展示信息)

[root@c2y2]#echo "" > /var/log/audit/audit.log
或者的为:/var/log/audit
[root@c2y2]#echo "" > /var/log/audit


后记:1,不提倡一盘清,先友情备份,最后离开的时候还原,或者编写bash脚本,离开定时执行并清除定时执行脚本

         2,如果没有友情备份的化,提倡使用,sed 命令,替换相关记录或者清除相关记录即可。

         3,日志相关操作时,最好查找看日志配置文件,很多配置是被管理员修改过的。

         4,有的应用日志,根据相关配置查找.


linux 使用mail命令发送附件

  |   0 评论   |   2,227 浏览

上一篇使用uudecode方式发送附件,虽然看着很man,但是可读性太差,而且登录qq邮箱web端打开全是一篇编码。。。。

于是为了改进可读性,直接采用发送福建的方式发送(上一篇http://www.c2y2.org/articles/2014/03/21/1395378085671.html)

命令如下:

[root@c2y2 bin]# echo "`date +%Y%m%d`"|mail -s 'fujian2' -a /root/test.txt abcd@qq.com
现在采用这种方式,打开QQ邮箱就可以直接下载附件了,看着也顿时轻松多了。。。。

将linux作为软路由器使用

  |   0 评论   |   3,464 浏览

前述:由于这段时间公寓网络线路部分出现了问题,造成网络端口不够用了,

         而我电脑一般都直接网线链接,因此原来的无线路由器就不能分配端口了

        但是。。呢。。我有两个两个物理网卡,呵呵,又可以倒腾下了。


网络环境:eth1:192.168.28.126/24  电脑外出网络地址
          eth0:192.168.29.1/24   准备的虚拟网络地址,
          无线路由器:tp_link,静态地址:192.168.28.2/24


大致很为以下步骤(以下均在root权限操作):

1,连接上eth1保证能正常上网。

2,eth0 配置如下:

root@c2y2:/# ifconfig eth0 192.168.29.1 netmask 255.255.255.0
3,添加路由(由于eth1 连接时 默认路由都自动设置好了,这你就不需要我们再重新设置了)
root@c2y2:/#  route add -net 192.168.29.0 netmask 255.255.255.0 dev eth0
或者
root@c2y2:/#  route add -net 192.168.29.0/24 dev eth0
4,开启内核网络转发
root@c2y2:/# echo 1 >/proc/sys/net/ipv4/ip_forward
5,启用iptables,开启转发并开启nat
root@c2y2:/# iptables -P FORWARD ACCEPT #开启转发
root@c2y2:/# iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE #开启snat
6,配置tpl-link路由器如图:

路由器外出网路配置:


开启动态dhcp:



7,使用手机测试


:-),这样我们就可以上网了,enjoy,网络吧

到这里,我偷偷笑了,这里我们可以干的事有点多哦(发挥你的想象吧。。。。^_^)。。。。




附上两张设备照:eth1,图中的usb网卡,eth0:笔记本自带网卡 另外一张即路由器:其中eth0 网络接口与路由器的wan口连接




linux 下perl 拓展模块 cpan命令模式安装

  |   0 评论   |   3,318 浏览

今晚一程序使用报缺少perl的一些模块,报错信息如下:

root@c2y2:/home/exp/Dropbox/crack/GitHub/evilgrade# ./evilgrade 
Can't locate RPC/XML.pm in @INC (@INC contains: /home/exp/Dropbox/crack/GitHub/evilgrade /etc/perl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/5.14.2 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.14 /usr/share/perl/5.14 /usr/local/lib/site_perl .) at isrcore/shellz.pm line 36.
Compilation failed in require at ./evilgrade line 24.
BEGIN failed--compilation aborted at ./evilgrade line 24.
由于对perl仅仅是出于了解水平,so,对于其模块的安装不是甚了解,于是网上搜到一些处理方式。

安装有很多种方式,对于我这菜鸟级别的来说,推荐采用cpan方式安装:


主要命令如下:

1,进入命令模式界面(进入后,所有都默认回车)

root@c2y2:/home/exp# perl -MCPAN -e shell
2,获得帮助
cpan shell -- CPAN exploration and modules installation (v1.960001)
Enter 'h' for help.

cpan[1]> h

Display Information                                              (ver 1.960001)
 command  argument          description
 a,b,d,m  WORD or /REGEXP/  about authors, bundles, distributions, modules
 i        WORD or /REGEXP/  about any of the above
 ls       AUTHOR or GLOB    about files in the author's directory
    (with WORD being a module, bundle or author name or a distribution
    name of the form AUTHOR/DISTRIBUTION)

Download, Test, Make, Install...
 get      download                     clean    make clean
 make     make (implies get)           look     open subshell in dist directory
 test     make test (implies make)     readme   display these README files
 install  make install (implies test)  perldoc  display POD documentation

Upgrade
 r        WORDs or /REGEXP/ or NONE    report updates for some/matching/all modules
 upgrade  WORDs or /REGEXP/ or NONE    upgrade some/matching/all modules

Pragmas
 force  CMD    try hard to do command  fforce CMD    try harder
 notest CMD    skip testing

Other
 h,?           display this menu       ! perl-code   eval a perl command
 o conf [opt]  set and query options   q             quit the cpan shell
 reload cpan   load CPAN.pm again      reload index  load newer indices
 autobundle    Snapshot                recent        latest CPAN uploads

3,列模块

cpan[2]> m
Fetching with LWP:
http://cpan.mirror.serversaustralia.com.au/authors/01mailrc.txt.gz
Going to read '/root/.cpan/sources/authors/01mailrc.txt.gz'
............................................................................DONE
Fetching with LWP:
http://cpan.mirror.serversaustralia.com.au/modules/02packages.details.txt.gz
Going to read '/root/.cpan/sources/modules/02packages.details.txt.gz'
  Database was generated on Wed, 16 Jul 2014 02:53:02 GMT
..............
  New CPAN.pm version (v2.05) available.
  [Currently running version is v1.960001]
  You might want to try
    install CPAN
    reload cpan
  to both upgrade CPAN.pm and run the new version without leaving
  the current session.

..............................................................DONE
Fetching with LWP:
http://cpan.mirror.serversaustralia.com.au/modules/03modlist.data.gz
Going to read '/root/.cpan/sources/modules/03modlist.data.gz'
DONE
Going to write /root/.cpan/Metadata
Module  < AAA::Demo              (JWACH/Apache-FastForward-1.1.tar.gz)
Module  < AAA::eBay              (JWACH/Apache-FastForward-1.1.tar.gz)
Module  < AAAA::Crypt::DH        (BINGOS/AAAA-Crypt-DH-0.04.tar.gz)
Module  < AAAA::Mail::SpamAssassin (SCHWIGON/AAAA-Mail-SpamAssassin-0.002.tar.gz)
Module  < AAAAAAAAA              (MSCHWERN/AAAAAAAAA-1.01.tar.gz)
Module  < AAC::Pvoice            (JOUKE/AAC-Pvoice-0.91.tar.gz)
Module  < AAC::Pvoice::Bitmap    (JOUKE/AAC-Pvoice-0.91.tar.gz)
Module  < AAC::Pvoice::Dialog    (JOUKE/AAC-Pvoice-0.91.tar.gz)
Module  < AAC::Pvoice::EditableRow (JOUKE/AAC-Pvoice-0.91.tar.gz)
Module  < AAC::Pvoice::Input     (JOUKE/AAC-Pvoice-0.91.tar.gz)
Module  < AAC::Pvoice::Panel     (JOUKE/AAC-Pvoice-0.91.tar.gz)
Module  < AAC::Pvoice::Row       (JOUKE/AAC-Pvoice-0.91.tar.gz)
4,安装模块:



cpan[4]> install  Digest::MD5


通过cpan模式进行模块安装是很方便的。菜鸟也能很方便使用拉。

给几个用用的链接:http://www.perl.org/docs.html

                            http://www.cpan.org/


java unicode 转字符

  |   1 评论   |   2,673 浏览

当我们做一些手动测试时,目标网站给你返回一串unicode编码,很难目测出来具体意义,而网上搜工具又很麻烦

于是基于网上搜索然后总结了如下java方法:

public static String UnicodeToString(String str) {
        Pattern pattern = Pattern. compile("(\\\\u(\\p{XDigit}{4}))");  
        Matcher matcher = pattern.matcher(str);
        char ch;
        while (matcher.find()) {
            ch = ( char) Integer.parseInt(matcher.group(2), 16);
            str = str.replace(matcher.group(1), ch + "");  
        }
        return str;
 }
jar包源码:
package org.c2y2;

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang.StringEscapeUtils;

public class UnicodeToString {
	public static void main(String[] args) {
		String source = ""
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入你要转换的unicode编码");
		source = scanner.nextLine();
		while(true){
			if(!source.equals("exit")){
				System.out.println(UnicodeToStringMethod(source));
				System.out.println("请输入需要转换的unicode编码或输入:exit ");
				source = scanner.nextLine();
			}else{
				scanner.close();
				break;
			}
		}
		System.out.println(StringEscapeUtils.unescapeJavaScript(source));
	}
	
	public static String UnicodeToStringMethod(String str) {
        Pattern pattern = Pattern.compile("(\\\\u(\\p{XDigit}{4}))");   
        Matcher matcher = pattern.matcher(str);
        char ch;
        while (matcher.find()) {
            ch = (char) Integer.parseInt(matcher.group(2), 16);
            str = str.replace(matcher.group(1), ch + "");   
        }
        return str;
    }
}

可执行jar包下载地址:UnicodeToString.jar

使用效果:


root@c2y2:~/Dropbox$ java -jar UnicodeToString.jar 
请输入你需要转换的unicode编码
?({"result":"0","status":"-2","message":"\u5b89\u5168\u9a8c\u8bc1\u4e0d\u901a\u8fc7\uff0c\u4e0d\u7b26\u5408\u53c2\u6570\u89c4\u8303"})
?({"result":"0","status":"-2","message":"安全验证不通过,不符合参数规范"})
请输入需要转换的unicode编码或者输入:exit 退出=======>


tomcat 控制台乱码

  |   0 评论   |   3,130 浏览
1. 打开文件tomcat/bin/catalina.bat 或者:tomcat/bin/catalina.sh
2. set JAVA_OPTS= 的内容中添加选项-Dfile.encoding=GBK 
        (这里的编码根据自己程序编码相应设置)如:JAVA_OPTS="-Xms2000m -Xmx2000m -XX:PermSize=128m -XX:MaxPermSize=700m -Dfile.encoding=UTF8"
3. 重启tomcat即可

帮你深入理解OAuth2.0协议

  |   0 评论   |   2,067 浏览

from:http://hi.baidu.com/powerthinks/item/f1cb9b3c7a88251c9dc65efa


1. 引言

如果你开车去酒店赴宴,你经常会苦于找不到停车位而耽误很多时间。是否有好办法可以避免这个问题呢?有的,听说有一些豪车的车主就不担心这个问题。豪车一般配备两种钥匙:主钥匙和泊车钥匙。当你到酒店后,只需要将泊车钥匙交给服务生,停车的事情就由服务生去处理。与主钥匙相比,这种泊车钥匙的使用功能是受限制的:它只能启动发动机并让车行驶一段有限的距离,可以锁车,但无法打开后备箱,无法使用车内其他设备。这里就体现了一种简单的“开放授权”思想:通过一把泊车钥匙,车主便能将汽车的部分使用功能(如启动发动机、行驶一段有限的距离)授权给服务生。

授权是一个古老的概念,它是一个多用户系统必须支持的功能特性。比如,Alice和Bob都是Google的用户,那么Alice应该可以将自己的照片授权给Bob访问。但请注意到,这种授权是一种封闭授权,它只支持系统内部用户之间的相互授权,而不能支持与其他外部系统或用户之间的授权。比如说,Alice想使用“网易印像服务”将她的部分照片冲印出来,她怎么能做到呢?

肯定有人会说,Alice可以将自己的Google用户名和密码告诉网易印像服务,事情不就解决了吗?是的,但只有毫不关注安全和隐私的同学才会出此“绝招”。那么我们就来想一想,这一“绝招”存在哪些问题?(1) 网易印像服务可能会缓存Alice的用户名和密码,而且可能没有加密保护。它一旦遭到攻击,Alice就会躺着中枪。(2) 网易印像服务可以访问Alice在Google上的所有资源,Alice无法对他们进行最小的权限控制,比如只允许访问某一张照片,1小时内访问有效。(3) Alice无法撤消她的单个授权,除非Alice更新密码。

在以Web服务为核心的云计算时代,像用户Alice的这种授权需求变得日益迫切与兴盛,“开放授权(Open Authorization)”也正因此而生,意在帮助Alice将她的资源授权给第三方应用,支持细粒度的权限控制,并且不会泄漏Alice的密码或其它认证凭据。

根据应用场景的不同,目前实现开放授权的方法分为两种:一种是使用OAuth协议[1];另一种是使用IAM服务[2]。OAuth协议主要适用于针对个人用户对资源的开放授权,比如Google的用户Alice。OAuth的特点是“现场授权”或“在线授权”:客户端主要通过浏览器去访问资源,授权时需要认证Alice的资源所有者身份,并且需要Alice现场审批。OAuth一般在SNS服务中广泛使用,如微博。IAM服务则不同,它的特点是“预先授权”或“离线授权”:客户端主要通过REST API方式去访问资源,资源所有者可以预先知道第三方应用所需要的资源请求,一次授权之后,很少会变更。IAM服务一般在云计算服务中使用,如AWS服务、阿里云计算服务。

本文主要介绍OAuth开放授权。关于以IAM服务提供的开放授权,我将在另一篇博文中介绍。下面我来介绍OAuth 2.0协议、协议的实例化描述、安全性分析。


2. OAuth 2.0 协议

OAuth 2.0 是目前比较流行的做法,它率先被Google, Yahoo, Microsoft, Facebook等使用。之所以标注为 2.0,是因为最初有一个1.0协议,但这个1.0协议被弄得太复杂,易用性差,所以没有得到普及。2.0是一个新的设计,协议简单清晰,但它并不兼容1.0,可以说与1.0没什么关系。所以,我就只介绍2.0。

2.1 协议的参与者

从引言部分的描述我们可以看出,OAuth的参与实体至少有如下三个:

· RO (resource owner): 资源所有者,对资源具有授权能力的人。如上文中的用户Alice。

· RS (resource server): 资源服务器,它存储资源,并处理对资源的访问请求。如Google资源服务器,它所保管的资源就是用户Alice的照片。

· Client: 第三方应用,它获得RO的授权后便可以去访问RO的资源。如网易印像服务。

此外,为了支持开放授权功能以及更好地描述开放授权协议,OAuth引入了第四个参与实体:

· AS (authorization server): 授权服务器,它认证RO的身份,为RO提供授权审批流程,并最终颁发授权令牌(Access Token)。读者请注意,为了便于协议的描述,这里只是在逻辑上把AS与RS区分开来;在物理上,AS与RS的功能可以由同一个服务器来提供服务。


2.2 授权类型

在开放授权中,第三方应用(Client)可能是一个Web站点,也可能是在浏览器中运行的一段JavaScript代码,还可能是安装在本地的一个应用程序。这些第三方应用都有各自的安全特性。对于Web站点来说,它与RO浏览器是分离的,它可以自己保存协议中的敏感数据,这些密钥可以不暴露给RO;对于JavaScript代码和本地安全的应用程序来说,它本来就运行在RO的浏览器中,RO是可以访问到Client在协议中的敏感数据。

OAuth为了支持这些不同类型的第三方应用,提出了多种授权类型,如授权码 (Authorization Code Grant)、隐式授权 (Implicit Grant)、RO凭证授权 (Resource Owner Password Credentials Grant)、Client凭证授权 (Client Credentials Grant)。由于本文旨在帮助用户理解OAuth协议,所以我将先介绍这些授权类型的基本思路,然后选择其中最核心、最难理解、也是最广泛使用的一种授权类型——“授权码”,进行深入的介绍。


2.3 OAuth协议 - 基本思路


[Figure 1: Abstract Protocol Flow]

如图1所示,协议的基本流程如下:

(1) Client请求RO的授权,请求中一般包含:要访问的资源路径,操作类型,Client的身份等信息。

(2) RO批准授权,并将“授权证据”发送给Client。至于RO如何批准,这个是协议之外的事情。典型的做法是,AS提供授权审批界面,让RO显式批准。这个可以参考下一节实例化分析中的描述。

(3) Client向AS请求“访问令牌(Access Token)”。此时,Client需向AS提供RO的“授权证据”,以及Client自己身份的凭证。

(4) AS验证通过后,向Client返回“访问令牌”。访问令牌也有多种类型,若为bearer类型,那么谁持有访问令牌,谁就能访问资源。

(5) Client携带“访问令牌”访问RS上的资源。在令牌的有效期内,Client可以多次携带令牌去访问资源。

(6) RS验证令牌的有效性,比如是否伪造、是否越权、是否过期,验证通过后,才能提供服务。


2.4 授权码类型的开放授权



[Figure 2: Authorization Code Flow]

如图2所示,授权码类型的开放授权协议流程描述如下:

(1) Client初始化协议的执行流程。首先通过HTTP 302来重定向RO用户代理到AS。Client在redirect_uri中应包含如下参数:client_id, scope (描述被访问的资源), redirect_uri (即Client的URI), state (用于抵制CSRF攻击). 此外,请求中还可以包含access_type和approval_prompt参数。当approval_prompt=force时,AS将提供交互页面,要求RO必须显式地批准(或拒绝)Client的此次请求。如果没有approval_prompt参数,则默认为RO批准此次请求。当access_type=offline时,AS将在颁发access_token时,同时还会颁发一个refresh_token。因为access_token的有效期较短(如3600秒),为了优化协议执行流程,offline方式将允许Client直接持refresh_token来换取一个新的access_token。

(2) AS认证RO身份,并提供页面供RO决定是否批准或拒绝Client的此次请求(当approval_prompt=force时)。

(3) 若请求被批准,AS使用步骤(1)中Client提供的redirect_uri重定向RO用户代理到Client。redirect_uri须包含authorization_code,以及步骤1中Client提供的state。若请求被拒绝,AS将通过redirect_uri返回相应的错误信息。

(4) Client拿authorization_code去访问AS以交换所需的access_token。Client请求信息中应包含用于认证Client身份所需的认证数据,以及上一步请求authorization_code时所用的redirect_uri。

(5) AS在收到authorization_code时需要验证Client的身份,并验证收到的redirect_uri与第3步请求authorization_code时所使用的redirect_uri相匹配。如果验证通过,AS将返回access_token,以及refresh_token(若access_type=offline)。

如果读者对这个流程的细节不甚清楚,那么可以先看第3节的一个实例化描述,然后再回来看这部分内容。

3. OAuth协议实例化描述

下面我以实例化方式来帮助读者理解授权码类型的授权协议的运行过程。假设: 
(1) Alice有一个有效的Google帐号;
(2) Facebook.com已经在Google Authorization Server上注册了Client身份,已经获得(client_id, client_secret),注意client_secret是Client与AS之间的一个共享密钥。
(3) Alice想授权Facebook.com查看她的联系人列表(https://www.google.com/m8/feeds)。

图3展示了Alice、Facebook.com、Google资源服务器、以及Google OAuth授权服务器之间的协议运行过程。


[Figure 3: An Instance of Authorization Code Flow]  
//若字体无法看清,请单击右键->选择查看原图

协议所涉及到的细节都已经在图3上了,所以不打算再做详细介绍了。若看懂了此图,OAuth2.0就理解了。

读者请注意,在步骤(4)中,Client需要拿“授权码”去换“授权令牌”时,Client需要向AS证明自己的身份,即证明自己就是步骤(2)中Alice批准授权时的Grantee。这个身份证明的方法主要有两种(图3中使用了第1种):
(1) 通过https直接将client_secret发送给AS,因为client_secret是由Client与AS所共享,所以只要传送client_secret的信道安全即可。
(2) 通过消息认证码来认证Client身份,典型的算法有HMAC-SHA1。在这种方式下,Client无需传送client_secret,只需发送消息请求的signature即可。由于不需要向AS传递敏感数据,所以它只需要使用http即可。

此外, 在步骤(2)中,Google授权服务器需要认证Alice的RO身份,并提供授权界面给Alice进行授权审批。今天Google提供的实例如图4、图5所示,仅供读者理解OAuth这种“现场授权”或"在线授权"的含义。



[Figure 4: RO's Identity Authentication]


[Figure 5: RO's Authorization Decision]

4. OAuth设计上的安全性考虑

4.1 为何引入authorization_code?


协议设计中,为什么要使用authorization_code来交换access_token?这是读者容易想到的一个问题。也就是说,在协议的第3步,为什么不直接将access_token通过重定向方式返回给Client呢?比如:

HTTP/1.1 302
Location:
https://www.facebook.com/?access_token=ya29.AHES6ZSXVKYTW2VAGZtnMjD&token_type=Bearer&expires_in=3600


如果直接返回access_token,协议将变得更加简洁,而且少一次Client与AS之间的交互,性能也更优。那为何不这么设计呢?协议文档[1]中并没有给出这样设计的理由,但也不难分析:

(1) 浏览器的redirect_uri是一个不安全信道,此方式不适合于传递敏感数据(如access_token)。因为uri可能通过HTTP referrer被传递给其它恶意站点,也可能存在于浏览器cacher或log文件中,这就给攻击者盗取access_token带来了很多机会。另外,此协议也不应该假设RO用户代理的行为是可信赖的,因为RO的浏览器可能早已被攻击者植入了跨站脚本用来监听access_token。因此,access_token通过RO的用户代理传递给Client,会显著扩大access_token被泄露的风险。 但authorization_code可以通过redirect_uri方式来传递,是因为authorization_code并不像access_token一样敏感。即使authorization_code被泄露,攻击者也无法直接拿到access_token,因为拿authorization_code去交换access_token是需要验证Client的真实身份。也就是说,除了Client之外,其他人拿authorization_code是没有用的。 此外,access_token应该只颁发给Client使用,其他任何主体(包括RO)都不应该获取access_token。协议的设计应能保证Client是唯一有能力获取access_token的主体。引入authorization_code之后,便可以保证Client是access_token的唯一持有人。当然,Client也是唯一的有义务需要保护access_token不被泄露。

(2) 引入authorization_code还会带来如下的好处。由于协议需要验证Client的身份,如果不引入authorization_code,这个Client的身份认证只能通过第1步的redirect_uri来传递。同样由于redirect_uri是一个不安全信道,这就额外要求Client必须使用数字签名技术来进行身份认证,而不能用简单的密码或口令认证方式。引入authorization_code之后,AS可以直接对Client进行身份认证(见步骤4和5),而且可以支持任意的Client认证方式(比如,简单地直接将Client端密钥发送给AS)。

在我们理解了上述安全性考虑之后,读者也许会有豁然开朗的感觉,懂得了引入authorization_code的妙处。那么,是不是一定要引入authorization_code才能解决这些安全问题呢?当然不是。笔者将会在另一篇博文给出一个直接返回access_token的扩展授权类型解决方案,它在满足相同安全性的条件下,使协议更简洁,交互次数更少。

4.2 基于Web安全的考虑

OAuth协议设计不同于简单的网络安全协议的设计,因为OAuth需要考虑各种Web攻击,比如CSRF (Cross-Site Request Forgery), XSS (Cross Site Script), Clickjacking。要理解这些攻击原理,读者需要对浏览器安全(eg, Same Origin Policy, 同源策略)有基本理解。比如,在redirect_uri中引入state参数就是从浏览器安全角度考虑的,有了它就可以抵制CSRF攻击。如果没有这个参数,攻击者便可以在redirect_uri中注入攻击者提供的authorization_code或access_token,结果可能导致Client访问错误的资源(比如,将款项汇到一个错误的帐号)。

基于Web安全的考虑,OAuth协议文档中已经有了比较全面的阐述,所以我不打算在此文中进行展开,有兴趣的读者请参考[1]。

5. 结语

本文对OAuth 2.0 开放授权协议及其设计上的安全性考虑做了一个基本的介绍,希望能给参与安全协议设计和开发的同学起到一点帮助。

参考文献:

[1] Hammer-Lahav, E., Recordon, D., and D. Hardt, "The OAuth 2.0 Authorization Framework", draft-ietf-oauth-v2-31 (work in progress), June 2012.
[2] http://aws.amazon.com/iam/