java jdk keytool
C:\Program Files\Java\jdk1.7.0_11\bin\keytool.exe
[lindows@Loadrunner19 ~]$ ll /opt/soft/jdk1.7.0_11/bin/keytool
-rwxrwxrwx 1 lindows lindows 7957 Jan 12 18:05 /opt/soft/jdk1.7.0_11/bin/keytool
tomcat7 开启https ,使用JDK 7的keytool 生成tomcat证书
http://lixor.iteye.com/blog/1532655
https单向/双向认证的tomcat配置攻略
http://xiaohuafyle.iteye.com/blog/1538719
C:\Program Files\Java\jdk1.7.0_11\bin>keytool -v -genkey -alias tomcat -keyalg RSA -keystore d:/tomcat.keystore
C:\Program Files\Java\jdk1.7.0_11\bin>keytool.exe -help
Dos代码
C:\Program Files\Java\jdk1.7.0_11\bin>keytool.exe -genkey -help
Dos代码
linux jdk7 keytool
[lindows@Loadrunner19 ~]$ /opt/soft/jdk1.7.0_11/bin/keytool --help
Shell代码
[root@Loadrunner19 bin]# /usr/bin/keytool -?
Shell代码
Unrecognized command: --help
Usage: keytool [COMMAND] [-- COMMAND]…
Manage private keys and public certificates.
Available commands:
-genkey Generate a Key Entry, eventually creating a key store.
[-alias ALIAS] [-keyalg ALGORITHM] [-keysize KEY_SIZE]
[-sigalg ALGORITHM] [-dname NAME] [-keypass PASSWORD]
[-validity DAY_COUNT] [-storetype STORE_TYPE]
[-keystore URL] [-storepass PASSWORD]
[-provider PROVIDER_CLASS_NAME] [-v].
-import Add Key Entries and Trusted Certificates.
[-alias ALIAS] [-file FILE] [-keypass PASSWORD]
[-noprompt] [-trustcacerts] [-storetype STORE_TYPE]
[-keystore URL] [-storepass PASSWORD]
[-provider PROVIDER_CLASS_NAME] [-v].
-selfcert Generate a self-signed Trusted Certificate.
[-alias ALIAS] [-sigalg ALGORITHM] [-dname NAME]
[-validity DAY_COUNT] [-keypass PASSWORD]
[-storetype STORE_TYPE] [-keystore URL]
[-storepass PASSWORD] [-provider PROVIDER_CLASS_NAME] [-v].
-identitydb NOT IMPLEMENTED YET. Import JDK1.1 Identity Database.
[-file FILE] [-storetype STORE_TYPE] [-keystore URL]
[-storepass PASSWORD] [-provider PROVIDER_CLASS_NAME] [-v].
-certreq Issue a Certificate Signing Request (CSR).
[-alias ALIAS] [-sigalg ALGORITHM] [-file FILE]
[-keypass PASSWORD] [-storetype STORE_TYPE] [-keystore URL]
[-storepass PASSWORD] [-provider PROVIDER_CLASS_NAME] [-v]
[-attributes].
-export Export a Certificate from a key store.
[-alias ALIAS] [-file FILE] [-storetype STORE_TYPE]
[-keystore URL] [-storepass PASSWORD]
[-provider PROVIDER_CLASS_NAME] [-rfc] [-v].
-list Print one or all Certificates in a key store to STDOUT.
[-alias ALIAS] [-storetype STORE_TYPE] [-keystore URL]
[-storepass PASSWORD] [-provider PROVIDER_CLASS_NAME]
[-rfc] [-v].
-printcert Print a human-readable form of a Certificate in a FILE.
[-file FILE] [-v].
-keyclone Clone a Key Entry in a key store.
[-alias ALIAS] [-dest ALIAS] [-keypass PASSWORD]
[-new PASSWORD] [-storetype STORE_TYPE] [-keystore URL]
[-storepass PASSWORD] [-provider PROVIDER_CLASS_NAME] [-v].
-storepasswd Change the password protecting a key store.
[-new PASSWORD] [-storetype STORE_TYPE] [-keystore URL]
[-storepass PASSWORD] [-provider PROVIDER_CLASS_NAME] [-v].
-keypasswd Change the password protecting a Key Entry in a key store.
[-alias ALIAS] [-keypass PASSWORD] [-new PASSWORD]
[-storetype STORE_TYPE] [-keystore URL]
[-storepass PASSWORD] [-provider PROVIDER_CLASS_NAME] [-v].
-delete Delete a Key Entry or a Trusted Certificate from a key store.
[-alias ALIAS] [-storetype STORE_TYPE] [-keystore URL]
[-storepass PASSWORD] [-provider PROVIDER_CLASS_NAME] [-v].
-cacert Import a CA's Trusted Certificate.
[-file FILE] [-storetype STORE_TYPE] [-keystore URL]
[-storepass PASSWORD] [-provider PROVIDER_CLASS_NAME] [-v].
Standard options:
-help print this help, then exit
-version print version number, then exit
-JOPTION pass argument to the Java runtime
Please report bugs at http://www.gnu.org/software/classpath/bugs.html
javax.net.ssl
JAVA 加密技术
http://www.iteye.com/topic/426342
Java加密技术(一)
Java加密技术(二)
Java加密技术(三)
Java加密技术(四)
Java加密技术(五)
Java加密技术(六)
Java加密技术(七)
Java加密技术(八)
Java加密技术(九)
Java加密技术(十)
HTTPS和HTTP的区别
http://jessicacao.iteye.com/blog/318912
http://bbs.5dmail.net/redirect.php?tid=184648&goto=lastpost
HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议
它是一个安全通信通道,它基于HTTP开发,用于在客户计算机和服务器之间交换信息。它使用安全套接字层(SSL)进行信息交换,简单来说它是HTTP的安全版。
它是由Netscape开发并内置于其浏览器中,用于对数据进行压缩和解压操作,并返回网络上传送回的结果。HTTPS实际上应用了Netscape的安全全套接字层(SSL)作为HTTP应用层的子层。(HTTPS使用端口443,而不是象HTTP那样使用端口80来和TCP/IP进行通信。)SSL使用 40 位关键字作为RC4流加密算法,这对于商业信息的加密是合适的。HTTPS和SSL支持使用X.509数字认证,如果需要的话用户可以确认发送者是谁。
HTTPS和HTTP的区别:
https协议需要到ca申请证书,一般免费证书很少,需要交费。
http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议
http和https使用的是完全不同的连接方式用的端口也不一样,前者是80,后者是443。
http的连接很简单,是无状态的
HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议 要比http协议安全
HTTPS解决的问题:
1 . 信任主机的问题. 采用https 的server 必须从CA 申请一个用于证明服务器用途类型的证书. 改证书只有用于对应的server 的时候,客户度才信任次主机. 所以目前所有的银行系统网站,关键部分应用都是https 的. 客户通过信任该证书,从而信任了该主机. 其实这样做效率很低,但是银行更侧重安全. 这一点对我们没有任何意义,我们的server ,采用的证书不管自己issue 还是从公众的地方issue, 客户端都是自己人,所以我们也就肯定信任该server.
2 . 通讯过程中的数据的泄密和被窜改
1. 一般意义上的https, 就是 server 有一个证书.
a) 主要目的是保证server 就是他声称的server. 这个跟第一点一样.
b) 服务端和客户端之间的所有通讯,都是加密的.
i. 具体讲,是客户端产生一个对称的密钥,通过server 的证书来交换密钥. 一般意义上的握手过程.
ii. 加下来所有的信息往来就都是加密的. 第三方即使截获,也没有任何意义.因为他没有密钥. 当然窜改也就没有什么意义了.
2. 少许对客户端有要求的情况下,会要求客户端也必须有一个证书.
a) 这里客户端证书,其实就类似表示个人信息的时候,除了用户名/密码, 还有一个CA 认证过的身份. 应为个人证书一般来说上别人无法模拟的,所有这样能够更深的确认自己的身份.
b) 目前少数个人银行的专业版是这种做法,具体证书可能是拿U盘作为一个备份的载体.
HTTPS 一定是繁琐的.
a) 本来简单的http协议,一个get一个response. 由于https 要还密钥和确认加密算法的需要.单握手就需要6/7 个往返.
i. 任何应用中,过多的round trip 肯定影响性能.
b) 接下来才是具体的http协议,每一次响应或者请求, 都要求客户端和服务端对会话的内容做加密/解密.
i. 尽管对称加密/解密效率比较高,可是仍然要消耗过多的CPU,为此有专门的SSL 芯片. 如果CPU 信能比较低的话,肯定会降低性能,从而不能serve 更多的请求.
ii. 加密后数据量的影响. 所以,才会出现那么多的安全认证提示
电信行业Http接口(通道)设计思路与实现过程
http://www.iteye.com/topic/398334
本页不但包含安全的内容,也包含不安全的内容.是否显示不安全的内容?
https中夹带有http的问题,
http://swingboat.iteye.com/blog/445608
今天解决了一个困扰我们很久的一个问题(说是很久,但一直没有花时间去research,想想不影响功能使用,没什么啊。而真正解决问题,也就那二十来分钟,哎!人已经懒惰成这样了)。
问题描述:
我们利用ajax做了一套系统,但通过https访问的时候,IE总会弹出下面的对话框:
而在我们的代码中所有的访问都是通过https的,怎么会有不安全的元素呢?在网上google了一下,有人提到可能是iframe的问题。而在我们系统中确实用到了很多的iframe。修改code,去掉所有的iframe。再次run,上面的对话框没有了,终于找到原因了。但是我们的系统中是需要iframe啊?请看下面的code:
1 var iframe = document.createElement( " iframe " );
2 iframe.style.zIndex =- 1 ;
3 iframe.style.position = " absolute " ;
4 iframe.style.left = 0 ;
5 iframe.style.top = 0 ;
6 iframe.style.width = menu.getSize().x - 2 ;
7 iframe.style.height = menu.getSize().y - 4 ;
8 menu.getHtmlElement().appendChild(iframe);
从上面的code,可以看出代码中没有指定src属性,这样IE是没有办法知道这个iframe将引用的是安全内容还是不安全内容呢。所以会弹出上面的对话框。增加src属性,修改code:
var iframe=document.createElement("
再次run,对话框没有了,问题解决。
附录:
在IE下,如果div悬浮在select上面。select会透过div显示出来。这非常影响视觉效果。网上有很多的解决办法,其中一个就是在div中增加iframe。我们就是通过这个方法的,但又产生了这个问题。
md5
http://baike.baidu.com/view/7636.htm
目录
http://www.md5.com.cn (百万亿以上数据)
http://www.cmd5.com
http://www.xmd5.com 和http://www.xmd5.org 是一个网站(这三个网站都是国人做的)。
http://md5.mmkey.com
http://www.md5lookup.com/ (对数字破解比较好)
http://md5.rednoize.com (对字母破解比较好)
http://nz.md5.crysm.net (从1到4位数字)- 好像关了
http://us.md5.crysm.net (美英字典的破解收集和IP地址)
http://gdataonline.com (估计是基础字典的破解)
http://www.hashchecker.com (这个倒是说得很厉害,但是在实际中,很多次我在这里都找不到)
http://passcracking.ru
http://www.milw0rm.com/md5
http://plain-text.info (这个是我比较喜欢一个.也请你提交一些已破解的MD5)
http://www.securitystats.com/tools/hashcrack.php (多种破解.我试过…没有一次破解出来.非常没用)
http://www.schwett.com/md5/ - (破解挪威人(Norwegian)字典)
http://passcrack.spb.ru/
http://shm.pl/md5/
http://www.und0it.com/
http://www.neeao.com/md5/
http://md5.benramsey.com/
http://www.md5decrypt.com/
http://md5.khrone.pl/
http://www.csthis.com/md5/index.php
http://www.md5decrypter.com/
http://www.md5encryption.com/
http://www.md5database.net/
http://md5.xpzone.de/
http://md5.geeks.li/
http://www.hashreverse.com/
http://www.cmd5.com/english.aspx
http://www.md5.altervista.org/
http://md5.overclock.ch/biz/index.php?p=md5crack&l=en
http://alimamed.pp.ru/md5/ (如果你看不懂俄文,我告诉你,把你的MD5放到第2个格子)
http://md5crack.it-helpnet.de/index.php?op=add (德国的….)
http://cijfer.hua.fi/ (Projects->md5 reverse lookup)
http://shm.hard-core.pl/md5/
http://www.thepanicroom.org/index.php?view=cracker
http://rainbowtables.net/services/results.php (我试过破过几次在这里)
http://rainbowcrack.com/ (需要捐献)
http://www.securitydb.org/cracker/
http://passwordsecuritycenter.com/index.php?main_page=product_info&cPath=3&products_id=7 这个是证明他们的破解商品的质量..好让你来买这个破解程序…但是…只要能破解到即可.你又不一定要买..
http://0ptix.co.nr/md5
lm:
http://sys9five.ath.cx:8080/hak5rtables/
http://lasecwww.epfl.ch/~oechslin/projects/ophcrack/
lm + ntlm:
http://plain-text.info
http://www.securitystats.com/tools/hashcrack.php
http://rainbowtables.net/services/results_.php_ http://rainbowcrack.com/
http://passwordsecuritycenter.com/index.php?main_page=product_info&cPath=3&products_id=7
md4:
http://www.securitystats.com/tools/hashcrack.php
http://rainbowtables.net/services/results.php
http://rainbowcrack.com/
sha1:
http://www.securitystats.com/tools/hashcrack.php
http://passcrack.spb.ru/
http://www.hashreverse.com/
http://rainbowtables.net/services/results.php
http://rainbowcrack.com/
http://www.md5encryption.com/
http://passcracking.ru
http://www.shalookup.com/
16位和32位密码查询
MD5:670B14728AD9902AECBA32E22FA4F6BD
解密:000000
md5(13851897759,32) = 7d3be18db14b452a11e4940ede114004
md5(13851897759,16) = b14b452a11e4940e
md5(18651665725,32) = 584285834b0032b2f809cde51228bb8e
md5(18651665725,16) = 4b0032b2f809cde5
md5(linezing.com,32) = be1fbc4210ef483dac295f1d7d424454
md5(linezing.com,16) = 10ef483dac295f1d
md5(kaixin001.com,32) = 1e0cca7301a54982fe7010c5a404d5bf
md5(kaixin001.com,16) = 01a54982fe7010c5
**收录概况:
**
收录内容
是否收费
常用密码、网友奉献的明文密码
免费
1-5位大小写字母+数字
免费
6位小写字母
免费
6位大小写字母+数字
收费
7位数字
免费
7位小写字母+数字
收费
8位数字
免费
8位字母
收费
9-12位数字
收费
本站数据量不断增长中,是否收费可能也发生变动。
收录举例:
密码明文
说明
woshiniba
“我是你爸”,没错,很多人就是用这个做密码,强烈bs。
zhoujielun
“周杰伦”,明星,很多人顺手拿来做密码
zjl1234
“周杰伦1234”,加了数字照样可以查到!
mayingjiu
“马英九”,不要以为你用它做密码很安全!
chenshuibian
“陈水扁”,不要以为你用它做密码很安全!
13301010101
手机号码,全部可以查到
01062881234
北京的电话号码,全部可以查到
热门查询:
下面是查询较多的
admin888
469e80d32c0559f8
123456
49ba59abbe56e057
admin
7a57a5a743894a0e
111111
965eb72c92a549dd
123456
e10adc3949ba59abbe56e057f20f883e
admin
21232f297a57a5a743894a0e4a801fc3
c65e114ded21a75b
000000
8ad9902aecba32e2
123456789
323b453885f5181f
12345678
83aa400af464c76d
123123
13955235245b2497
4e909fc4cfd910bb
msmir
043f668459d83aae
f1a38af5600c4ba8
5b183d3c8b79f69b
123
ac59075b964b0715
888888
77804d2ba1922c33
8cade77736368765
3865512b48aa0e0a
123
202cb962ac59075b964b07152d234b70
123456789
25f9e794323b453885f5181f1b624d0b
1c620a01bc338712
cccccc
6b490b3ecb4066b1
111111
96e79218965eb72c92a549dd5a330112
5201314
16e0c197e42a6be3
511136c555647e8e
0be93abb4dd831c2
395839e41fe65599
123321
ff8aaa8a2dde9154
000000
670b14728ad9902aecba32e22fa4f6bd
b4bb8eb9536548df
88888888
80f4189ca1c9d4d9
654321
1511b4f6020ec61d
7bbd73250516f069
93e853c0c3b2176e
af5a630d06e9fd27
164750fa6368334c
87742341
befd5a451518be7c
1234
52d04dc20036dbd8
d35b08c903d65ca3
1234567890
f82d132f9bb018ca
user
9052e40b07aac0ca
7fba6736f95a65d5
666666
c831b04de153469d
8bda608cb00bcccb
admin888
7fef6171469e80d32c0559f88b377245
5c86f8bd883edbbe
f2cdfc31339c937f
d41d8cd98f00b204e9800998ecf8427e
1234567
7412b5da7be0cf42
aisuhua
63a22ff2ce23fd32
2a0cfd5de1c5970e
664d117e1f56934b
6ea31402d9656860
c8bb891c23e1a4ee
8f00b204e9800998
bd9a9bd7daa7ec70
63a2879064fe0e96
6acb14aaa8c33eba
ff22a6ce2021ac01
112233
757783e6cf17b26f
4d9287164f38dde2
u88
ca105fe54f04781f
9def65456fc2a68a
88b346089154eae7
1
a0b923820dcc509a
fkuyygy
e54c72aea6a17a51
c1818c5b30a4ee4e
12345678
25d55ad283aa400af464c76d713c07ad
7c02897c08550b0b
woaini
4b0db47d5f3e476a
111
9d8a121ce581499d
fbcd4678e3c7b288
sxp750916
cbf76eed0e55cf43
b8474564be2a76f5
qaz2324575
3daa9c6d91e704a22241e6a11f43d2a0
yejinfa
df28256993c7b7eb
d24b74525d30785d
fb5dea26d8338782
5211314
eb03f6c72908fd84
1314520
4384298962649e58
1d0066104956061b
123123
4297f44b13955235245b2497399d7a93
fengyun
2c7a8880ba4b1340
654321
c33367701511b4f6020ec61ded352059
11111111
60827015e5d605ed
6c2a837fdc874433
82601628
d40badc0382a8f16
ddd5a3cd645a3d6d
83252964a2a30d2e
456123
c44da83eeafa3aeb
ce34d0b608b3b45f
1
c4ca4238a0b923820dcc509a6f75849b
1234
81dc9bdb52d04dc20036dbd8313ed055
888888
21218cca77804d2ba1922c33e0151105
a9d495b6e20cde2f
15a1a9790140d714
06dd87daabf43d31
3cda31572e0509b4
19790919
3941e6262b1312e5
SSL
PKI
security
重放攻击 (Replay attack )是一种网络攻击,它恶意的欺诈性的重复或拖延正常的数据传输。
http://zh.wikipedia.org/wiki/%E9%87%8D%E6%94%BE%E6%94%BB%E5%87%BB
http://blog.csdn.net/jiangbin00cn/archive/2007/11/07/1872127.aspx
http://zhidao.baidu.com/question/50733410.html?fr=qrl
Java的简单MD5加密
http://ifanvip.iteye.com/blog/505475
/**
* MD5加密运算
* @param str 要加密的字符串,不为null
* @return result 加密后的MD5值
*/
public String getMD5(String str){
MessageDigest messageDigest = null;
try {
messageDigest = MessageDigest.getInstance("MD5");
messageDigest.reset(); // 重置,供再次使用
messageDigest.update(str.getBytes("UTF-8")); // 使用指定的字节数组更新摘要,Char[]为编码为UTF-8
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
byte[] byteArr = messageDigest.digest(); // 重置摘要,通过诸如填充之类的最终操作完成哈希计算
StringBuffer md5Buffer = new StringBuffer(); // 构造一个字符串缓冲区,通过Append追加,装载加密后的值
/*
* 下面涉及到位运算,不懂,研究中。。。
*/
for (int i = 0; i < byteArr.length; i++) {
if (Integer.toHexString(0xFF & byteArr[i]).length() == 1) {
md5Buffer.append("0").append(Integer.toHexString(0xFF & byteArr[i]));
} else {
md5Buffer.append(Integer.toHexString(0xFF & byteArr[i]));
}
}
String result = md5Buffer.toString(); // 从缓冲区得到运算结果
return result;
}
package org.richin.crypto.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* 使用java.security.MessageDigest类写的一个工具类用来获取MD5码
* @author Talen
* @see java.security.MessageDigest
*/
public class MD5Util {
/**
* 默认的密码字符串组合,apache校验下载的文件的正确性用的就是默认的这个组合
*/
protected static char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9','a', 'b', 'c', 'd', 'e', 'f' };
protected static MessageDigest messagedigest = null;
static{
try{
messagedigest = MessageDigest.getInstance("MD5");
}catch(NoSuchAlgorithmException nsaex){
System.err.println(MD5Util.class.getName()+"初始化失败,MessageDigest不支持MD5Util。");
nsaex.printStackTrace();
}
}
/**
* 向getMD5方法传入一个你需要转换的原始字符串,将返回字符串的MD5码
* @param code 原始字符串
* @return 返回字符串的MD5码
*/
public static String getMD5(String code) throws Exception {
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
byte[] bytes = code.getBytes();
byte[] results = messageDigest.digest(bytes);
StringBuilder stringBuilder = new StringBuilder();
for (byte result : results) {
//将byte数组转化为16进制字符存入stringbuilder中
stringBuilder.append(String.format("%02x", result));
}
return stringBuilder.toString();
}
/**
* 适用于上G大的文件
* @param file
* @return
* @throws IOException
*/
public static String getFileMD5String(File file) throws IOException {
FileInputStream in = new FileInputStream(file);
FileChannel ch = in.getChannel();
MappedByteBuffer byteBuffer = ch.map(FileChannel.MapMode.READ_ONLY, 0, file.length());
messagedigest.update(byteBuffer);
return bufferToHex(messagedigest.digest());
}
private static String bufferToHex(byte bytes[]) {
return bufferToHex(bytes, 0, bytes.length);
}
private static String bufferToHex(byte bytes[], int m, int n) {
StringBuffer stringbuffer = new StringBuffer(2 * n);
int k = m + n;
for (int l = m; l < k; l++) {
appendHexPair(bytes[l], stringbuffer);
}
return stringbuffer.toString();
}
private static void appendHexPair(byte bt, StringBuffer stringbuffer) {
char c0 = hexDigits[(bt & 0xf0) >> 4];
char c1 = hexDigits[bt & 0xf];
stringbuffer.append(c0);
stringbuffer.append(c1);
}
public static boolean checkPassword(String password, String md5PwdStr) {
String s = getMD5String(password);
return s.equals(md5PwdStr);
}
public static String getMD5String(String s) {
return getMD5String(s.getBytes());
}
public static String getMD5String(byte[] bytes) {
messagedigest.update(bytes);
return bufferToHex(messagedigest.digest());
}
/** */
/**
* main方法用于测试
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//字符'a'的MD5码是0cc175b9c0f1b6a831c399e269772661,如果是,则成功。
try {
System.out.println(MD5Util.getMD5("a"));
} catch (Exception e) {
e.printStackTrace();
}
}
}
/*
Hide details
Change log
r80 by aslanchin on Nov 17, 2009 Diff
[No log message]
Go to:
Project members, sign in to write a code review
Older revisions
r45 by aslanchin on May 30, 2009 Diff
All revisions of this file
File info
Size: 3662 bytes, 109 lines
View raw file
*/
重庆沙海硬件加密机
http://www.shahaiinfo.com/ourocx.jsp#
一、高安全性
密码全程防护,全程不出现明文
防御100%的已知的键盘钩子
防止重放攻击、防止中间人篡改
密钥安全:一次一密、非对称加密、私钥存储在服务器不可获取
客户端核心模块工作在驱动层,客户端程序防反汇编,防脱壳技术,抗逆向分析
二、易用性
客户端可在浏览器窗口上自动安装、升级
也有独立安装使用的一键点击安装包
后台操作维护方便,基于HTTPS的WEB管理界面
三、高可用性
支持HA,保证业务连续性
沙海信息防护系统针对不同层次客户规模需求提供不同规格的产品供用户选择
四、兼容性
支持WIN2000-WIN7全系列操作系统、IE5-IE8全系列浏览器
全面兼容主流防病毒及防火墙软件
兼容集中监控软件或实时监控平台
五、可审计性
支持内部行为审计(管理员操作日志)
支持外部行为审计(客户信息日志)
支持回滚日志及远程SYSLOG日志服务器
安全编码规范
版本号:V2.4.2
目录
1 目标
2 安全编码原则
3 安全设计中的重要问题分布
4 安全编码规范
4.1 验证用户
1、身份验证
2、密码管理遵循的原则
4.2 保护敏感数据
1、前端保护敏感数据
2、后端保护敏感数据
3、传输保护
4.3 防止会话劫持和保护cookie
1、会话管理
2、cookie管理
4.4 提供安全配置
4.5 验证输入
4.6 授权用户
4.7 访问控制
4.8 审核和记录活动和事件
1、错误处理
2、日志记录
4.9 数据库安全性
4.10 加密
4.11 输出编码
5 安全编码示例
5.1 输入验证和数据合法性校验
避免SQL注入
避免XML注入
避免跨站点脚本(XSS)
5.2 声明和初始化
避免类初始化的相互依赖
5.3 表达式
不可忽略方法的返回值
不要引用空指针
使用Arrays.equals()来比较数组的内容
5.4 数字类型和操作
防止整数溢出
避免除法和取模运算分母为零
5.5 类和方法操作
数据成员声明为私有,提供可访问的包装方法
敏感类不允许复制
比较类的正确做法
不要硬编码敏感信息
验证方法参数
不要使用过时、陈旧或低效的方法
数组引用问题
不要产生内存泄露
5.6 异常处理
不要忽略捕获的异常
不允许暴露异常的敏感信息
不允许抛出RuntimeException, Exception,Throwable
不要捕获NullPointerException或其他父类异常
5.7 多线程编程
确保共享变量的可见性
确保共享变量的操作是原子的
不要调用Thread.run(),不要使用Thread.stop()以终止线程
确保执行阻塞操作的线程可以终止
相互依存的任务不要在一个有限的线程池执行
5.8 输入输出
程序终止前删除临时文件
检测和处理文件相关的错误
及时释放资源
5.9 序列化
不要序列化未加密的敏感数据
在序列化过程中避免内存和资源泄漏
反序列化要在程序最小权限的安全环境中
6 安全编码检查
6.1 输入和输出
6.2 API程序
6.3 跨站脚本
6.4 响应截断
6.5 重定向
6.6 SQL和数据库
6.7 SSL
6.8 会话管理
6.9 操作系统命令
6.10 记录
6.11 架构组件分析
6.12 JavaScript/XMLHTTP
使用本规范可以实现:
1. 确定安全Web应用程序的重要体系结构和设计问题。
2. 设计时考虑重要部署问题。
3. 制定能增强Web应用程序输入验证的策略。
4. 设计安全的身份验证和会话管理机制。
5. 选择适当的授权模型。
6. 实现有效的帐户管理方法,并保护用户会话。
7. 对隐私、认可、防止篡改和身份验证信息进行加密。
8. 防止参数操作。
9. 设计审核和记录策略。
1. 程序只实现指定的功能
2. 永不要信任用户输入,对用户输入数据做有效性检查
3. 必须考虑意外情况并进行处理
4. 不要试图在发现错误之后继续执行
5. 尽可能使用安全函数进行编程
6. 小心、认真、细致地编程
图1 列出了安全设计方法中必须解决的重要问题:验证用户、保护敏感数据、防止会话劫持和保护cookie、提供安全配置、验证输入、授权用户、访问控制、审核和记录活动和事件以及数据库安全。本文档分类总结归纳出解决以上重要问题必须遵循的一些基本原则,遵循基本原则可以很大程度地提高系统的安全性,减少漏洞,预防攻击。
图1
1、验证控制的执行代码放在服务器上
2、对所有的验证控件都使用一个集中的工具,包括调用外部认证服务的库
3、确保身份验证凭证不是以明文的形式在线传输的
4、保护身份验证 cookie
5、只使用HTTP POST请求发送身份验证凭据等敏感信息,只接受通过HTTP“POST”方法传递的信息,不可接受通过HTTP“GET”方法传递的信息
6、所有验证控件应该安全地失败
7、验证失败时进行模糊提示,失败响应不应该表明身份认证数据的哪一部分是不正确的的。例如,只是都使用“无效的用户名和/或密码”,而不是“无效的用户名”或“密码无效”。显示界面和源代码中的错误响应必须是真正的一致。
8、对最终用户账户使用账户锁定策略:在无效登录尝试超过预定的次数(例如,五次尝试是最常见的)后强制将账户禁用或将事件写入日志。该账户必须禁用足够长的时间来阻止对凭证的蛮力猜测,但不应比允许执行拒绝服务攻击的时间更长(请注意,账户锁定策略不能用于拒绝服务攻击)
9、一个用户账号的最后一次使用(成功或不成功)应该在用户下次成功登录时报告给他们
10 、尽可能建立和利用标准的,被测试过的认证服务
1、强制要求密码的长度。八个字符是常用的,但16更好或考虑使用多单词组成词组
2、在用户的屏幕上输入的密码被遮蔽(例如,基于Web形式使用“密码”输入型)
3、密码重置和更改的操作需要与创建账户和身份验证相同的控制水平,密码重置发生时通知用户,同时密码重置的问题应该支持足够随机的答案。(例如,“最喜爱的书”是一个坏问题,因为“圣经”是一个非常普通的答案)
4、临时密码和链接应该有一个短的到期时间,并在下次使用时强制执行临时密码的更改
5、防止密码重复使用
6、建议对密码字段禁用“记住我”功能
7、注意密码的储存,不要在用户存储中存储密码,将其加密储存在服务器上,一般它以保密性强的单向密码哈希被储存(不要使用MD5算法)。使用强密码,并将随机 salt 值与该密码结合。对于重要的系统入口,可有多个密码,如:管理员密码,管理认证码。分别把他们存放在不同的位置:数据库与文件中,这种多密码大大增强系统的安全性(其中对密码的加密方法,见下文的加密)
8、建议设置密码有效期:密码不应固定不变,而应作为常规密码维护的一部分,通过设置密码有效期对密码进行更改。在应用程序设计阶段,应该考虑提供这种类型的功能
1、cookie中不要存放敏感信息,所有敏感信息存放在服务器。如果保存了敏感数据,应该确保整个cookie加密
2、如果状态数据必须存储在客户端,在服务器端使用加密和完整性检查,以便跟踪状态篡改
3、对包含敏感信息的网页禁用客户端缓存
1、保护所有存储在服务器上的敏感数据的缓存或临时副本,对敏感数据执行适当的访问控制,以免来自未授权的访问所访问,一旦不再需要那些临时工作文件,就立即清除它们
2、应用程序应该支持对不再被需要的敏感数据的清除。(如个人资料或某些财务数据)
2、加密高度敏感的储存信息,如身份验证数据,即使在服务器端也要加密。并始终使用已审核好的算法
3、防止用户下载服务器端的源代码
5、删除不必要的应用程序和系统文件,因为这可以给攻击者揭示有用的信息
1、不要在HTTP GET请求参数中包括敏感信息
2、实现对所有敏感信息的传输进行加密,这应包括用于保护连接的TLS和可能是由离散加密敏感文件的一个补充或基于非HTTP连接
3、TLS证书应有效的(而不是过期的),并且有正确的域名
4、失败的TLS连接不应该回滚到一个不安全的连接
5、给所有连接指定字符编码
1、确保会话ID足够复杂以满足相关强度的要求
2、检查会话是如何储存的:例如,在数据库,在内存中等,以确定其安全性,必要时可以进行加密
3、设置会话的HTTP闲置超时
4、当无效的会话ID出现时,应有相应的处理程序
5、会话标识符在服务器上创建
6、会话管理控制应该使用审核好的算法,以确保足够随机的会话标识符
7、对任何重新验证都要生成一个新的会话标识符
8、不允许同时登录相同的用户ID
9、建议为敏感操作附加除cookie之外的额外的强随机令牌,这种方法可以用来防止跨站请求伪造攻击
1、为涉及敏感信息而保密要求高的cookie和保密性要求不高的cookie分别设置不同的域和路径
2、如果在登录前建立一个会话,关闭那个会话,并在成功登录后建立一个新会话
3、尽可能使用 SSL 保护会话身份验证 cookie,不要通过 HTTP 连接传递身份验证 cookie。在授权 cookie 内将其标记为安全的,那么它将只在浏览器和服务器通过https或其他安全协议链接时才被传输
4、将cookie设置为HttpOnly属性
1、确保服务器,框架和系统组件运行批准的最新版本,并且有为使用的版本发行的所有补丁
2、关闭目录列表
3、限制Web服务器,进程和服务账户具有可能的最少特权
4、发生异常时,要安全地失败
5、删除所有不必要的功能和文件
6、在部署之前,删除测试代码或不打算用于生产上的任何功能
7、禁用不必要的HTTP方法,如WebDAV扩展。如果必需有一个支持文件处理的扩展的HTTP方法,那么要利用一个良好的审核认证机制
8、应用程序的安全配置存储应能以可读的形式输出,以便支持审计
9、实施一个软件变更控制系统来管理和记录在开发和生产中代码的变更
1、在验证前将数据编码为一个共同的字符集,如UTF-8(规范化,标准化)。标准化是指将数据转化为标准形式的过程。文件路径和 URL 尤其倾向于标准化问题,许多广为人知的漏洞利用都直接源自标准化缺陷
2、验证预期的数据类型、范围、长度
3、使用服务器端代码执行其自身的验证。以免攻击者绕过客户端或关闭客户端脚本例程(例如,通过禁用 JavaScript 脚本)
4、所有的验证失败都导致输入拒绝,拒绝已知的有害的输入
5、在处理数据前,验证客户提供的所有数据,包括所有的参数。确保所有可以被恶意用户修改的输入,例如:HTTP头(例如cookies名称和值),URLs,输入字段,隐藏字段,下拉列表和其他Web组件,都被正确地验证。一定要包括从JavaScript,Flash或其他嵌入式代码的自动返回值
6、只要有可能,按照允许字符的白名单,对所有的输入进行验证:
如果任何有潜在危险的字符必须允许作为输入,确保执行了额外的控制来过滤输入。
常见的危险字符的例子包括:<>“”%()&+ \ \“\”;
谨慎检查是否为空字节(00%),检查新行字符(\ R \ N%0D%0A);
检查“点-点-斜线”(.. / .. \)路径改变字符;
过滤输入示例:使用 URL 编码或 HTML 编码来包装数据,并将其作为文本而不是可执行脚本来处理。HtmlEncode 方法去除 HTML 字符,而 UrlEncode 方法对 URL 进行编码,使其成为有效的 URL 请求。
7、建议使用一个应用程序的集中输入验证例程,考虑集中式验证方法,例如,通过使用共享库中的公共验证和筛选代码。这可确保验证规则应用的一致性,此外,还能减少开发的工作量,且有助于以后的维护工作
1、确保应用程序已明确定义了用户角色和其对应的权利
2、确保在操作中使用最少的特权,限制用户对系统级资源的访问
3、确保授权机制工作正常,安全地失败,并不能绕过
4、确保授权机制对每一个请求进行了检查
5、确保开发/调试的后门程序不在生产代码中出现,以免泄露敏感信息
6、实现最少的权限,限制用户只有对那些执行他们的任务所需要的功能,数据和系统信息具有权限
1、只使用可信任的系统对象,如服务器端会话对象,来做访问授权的决策
2、访问控制应该安全失败
3、对于GET方式的请求,不能仅仅依赖“referer”头作为检查手段,因为它是可以被欺骗的。对于POST方式的请求,在通常范围内检查“referer”头可以保证一定程度的安全性
4、对每个请求执行授权控制,包括服务器端脚步制作的请求,还有来自富客户端技术如AJAX和Flash的请求
5、限制只有被授权的用户才可以访问文件或其他资源,包括在应用程序的直接控制之外的资源
6、限制只有被授权的用户才可以访问被保护的URL和功能,访问服务、应用程序数据和与安全相关的配置信息(如果应用程序不能访问它的安全配置信息,那么拒绝所有的访问),以及进行直接对象引用
7、服务器端执行和表示层表示的访问控制规则必须匹配
8、限制单个用户或设备可以在一个给定的时间内执行的操作数量。操作/时间限制应高于实际业务需求,但也要足够的低,以防止自动攻击
9、如果允许长的身份验证会话,定期重新验证用户的授权,以确保他们的特权没有改变,如果特权改变了,注销用户,并迫使他们重新验证
10、实现账户的审计,强制禁用不可用的账户(例如,一个账户的密码到期后超过了30天)
11、应用程序必须支持账户的禁用(在系统受到威胁时使凭证失效或禁用账户,则可以避免遭受进一步的攻击),以及当授权终止时终止会话
12、服务账户或支持连接到/或来自外部系统的连接,应该被授予可能最少的特权
13、建议使用一个单一的站点范围内的组件检查访问授权
1、应用程序应该处理应用错误(而不是依赖于服务器的配置),使用不显示调试或堆栈跟踪信息的错误处理程序,在错误响应中不要泄露敏感信息,包括系统的详细信息,会话标识符或账户信息
2、确保应用程序是以安全的方式失败的
3、实施一般性错误消息,并使用自定义错误页面,确保异常和错误情况被正确的处理了,并正确释放分配的内存,释放资源
1、所有的记录控制应该在一个可信任的系统(例如,服务器)上执行并且记录的控制应该支持指定的安全事件的成功和失败
2、确保日志中包含一些重要的日志的事件数据,但不要在日志中存放敏感信息,包括不必要的系统详细信息,会话标识符或密码
3、确保包括不可信任的数据的日志条目在预定的日志查看界面或软件中不会作为代码执行
4、限制只有授权的个人才可以访问日志,并且对所有的日志操作使用一个主程序
5、确保存在一种机制来进行日志分析
6、记录所有的输入验证失败
7、记录所有验证尝试,尤其是失败的
8、记录所有的访问控制失败的信息
9、记录所有明显的篡改事件,包括状态数据的异常改变
10、记录连接到无效或过期的会话令牌的尝试
11、记录所有系统异常
12、记录所有的行政职能,包括安全配置设置的更改
13、记录所有后端的TLS连接失败的信息
14、记录加密模块故障
15、使用加密哈希函数来验证日志条目的完整性
1、使用强类型参数化查询
2、使用PreparedStatement预编译语句,传入的任何内容就不会和原来的语句发生任何匹配的关系
3、使用输入验证和输出编码,同时确保解决元字符。如果这些都失败了,不要运行数据库命令
4、应用程序访问数据库时,其应使用尽可能低水平的特权
5、对数据库访问使用加密连接
6、在应用程序中,连接字符串不应该使用硬编码。连接字符串应该储存在一个可信任的系统的单独的配置文件中,并且他们应该被加密。
7、使用储存过程来抽象数据访问
8、删除或更改所有默认的数据库管理密码。使用强密码或实施多因子身份认证
9、关闭所有不必要的数据库功能(例如,不必要的存储过程或服务,使用工具包,只安装最低要求的功能和选项设置(受攻击面减少))
10、禁用任何不需要的默认账户
11、建议应用程序应该为每个信任的区别(例如,用户、只读用户、访客、管理员)用不同的凭据连接到数据库
1、用来对应用程序用户保密的加密功能必须在一个可信任的系统上执行
2、对连接字符串进行加密,防止用户非法得到数据库连接密码
3、加密模块应该安全地失败
4、所有的随机数,随机文件名,随机GUID,以及随机字符串,当需要它们的随机值是不可猜测时,应该使用加密模块批准的随机数生成器产生
5、妥善管理加密密钥
6、不要自创加密方法,以免减弱保护能力
7、使用正确的算法和密钥大小,密钥越大,安全性越高
数据加密标准:
(DES) 64 位密钥(8 个字节);
TripleDES 128 位密钥或 192 位密钥(16 或 24 个字节);
AES 128位密匙、192位密匙或256位密匙(16、24或32个字节);
RSA 384 – 16,384 位密钥(48 – 2,048 个字节);
对于大量数据加密,应使用 TripleDES 对称加密算法;对于加密等级要求高,并且要高效快捷的加密一个区段时,应使用AES算法。要对将暂时存储的数据加密,可以考虑使用较快但较弱的算法,如 DES。对于数字签名,应使用 RSA 或 DSA 算法。对于哈希,应使用 SHA1 算法。对于用户键入的哈希,应使用基于哈希的消息验证(HMAC-SHA1)算法。
8、确保加密密钥的安全:使用 DPAPI 来回避密钥管理;定期回收密钥,以防密码的泄露。
1、 在受信任的系统上执行所有的编码(例如,服务器)
2、 对所有字符进行编码,除非他们被称为对web编译器是安全的
3、 对出站编码的每种类型都运用一个标准的,被测试过的方法:
输出的种类以及其对应的防御手段:
1) 支持HTML代码的输出:过滤。输出前要确保代码中不含有跨站攻击脚本。
2) 对不支持HTML的输出:HTML编码。在输出到页面前要进行HtmlEncode编码,部分服务器控件或者XSLT转换本身就支持HtmlEncode编码,可不必进行重复编码。
3) 对于URL的输出:URL编码。要对输出URL进行UrlEncode处理。
4) 页面内容的输出:转换特殊符号的编码形式,防止因特殊符号而出现错误,或跨站。
a. 对于js脚本的输出,要确保输出代码中不包含跨站脚本,注意“‘”和“”“的输出,以免被组合成危险的js代码。
b. 对于style样式的输出,要确保样式的正确性。
c. 对于xml数据的输出,要确保数据中是否有XML不允许的字符,要对特殊字符进行转换才能输出。
程序接受数据可能来源于未经验证的用户,网络连接和其他不受信任的来源,如果未对程序接受数据进行校验,则可能会引发安全问题。
使用PreparedStatement预编译SQL,解决SQL注入问题,传递给PreparedStatement对象的参数可以被强制进行类型转换,确保在插入或查询数据时与底层的数据库格式匹配。
public void doPrivilegedAction(
String username, char[] password
) throws SQLException {
Connection connection = getConnection();
if (connection == null) {
// Handle error
}
try {
String pwd = hashPassword(password);
// Ensure that the length of user name is legitimate
if ((username.length() > 8) {
// Handle error
}
String sqlString =
"select * from db_user where username=? and password=?";
PreparedStatement stmt = connection.prepareStatement(sqlString);
stmt.setString(1, username);
stmt.setString(2, pwd);
ResultSet rs = stmt.executeQuery();
if (!rs.next()) {
throw new SecurityException("User name or password incorrect");
}
// Authenticated, proceed
} finally {
try {
connection.close();
} catch (SQLException x) {
// forward to handler
}
}
}
使用存储过程
String custname = request.getParameter("customerName"); // This should REALLY be validated
try {
CallableStatement cs = connection.prepareCall("{call sp_getAccountBalance(?)}");
cs.setString(1, custname);
ResultSet results = cs.executeQuery();
// … result set handling
} catch (SQLException se) {
// … logging and error handling
}
通过StringBulider 或 StringBuffer 拼接XML文件时,需对输入数据进行合法性校验。
对数量quantity进行合法性校验,控制只能传入0-9的数字:
if (!Pattern.matches("[0-9]+", quantity)) {
// Format violation
}
String xmlString = "
"
"
outStream.write(xmlString.getBytes());
outStream.flush();
或者
class CustomResolver implements EntityResolver {
public InputSource resolveEntity(String publicId, String systemId)
throws SAXException, IOException {
// check for known good entities
String entityPath = "/home/username/java/xxe/file";
if (systemId.equals(entityPath)) {
System.out.println("Resolving entity: " + publicId +
" " + systemId);
return new InputSource(entityPath);
} else {
return new InputSource(); // Disallow unknown entities
// by returning a blank path
}
}
}
class XXE {
private static void receiveXMLStream(InputStream inStream,
DefaultHandler defaultHandler)
throws ParserConfigurationException, SAXException, IOException {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
// To set the Entity Resolver, an XML reader needs to be created
XMLReader reader = saxParser.getXMLReader();
reader.setEntityResolver(new CustomResolver());
reader.setErrorHandler(defaultHandler);
InputSource is = new InputSource(inStream);
reader.parse(is);
}
public static void main(String[] args)
throws ParserConfigurationException, SAXException, IOException {
receiveXMLStream(new FileInputStream("evil.xml"),
new DefaultHandler());
}
}
对产生跨站的参数进行严格过滤,禁止传入