//AES加密 KeyGenerator kgen = KeyGenerator.getInstance("AES"); kgen.init(128, new SecureRandom(pwd.getBytes())); SecretKey skey = kgen.generateKey(); byte[] raw = skey.getEncoded(); SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.DECRYPT_MODE, skeySpec); //写文件 byte[] bytOut = cipher.doFinal(bytIn); String ecrOut = new String(bytOut,"UTF8"); return ecrOut; }catch(Exception e){ e.printStackTrace(); throw new Exception(); } }
/** * 生一个长度为len 的随机数 * @param int len * 生成的随机密码的长度 * @return String pwd * 返回生成的随机密码 */ public static String getRandomKey(int len) { StringBuffer buffer = new StringBuffer("123456789"); StringBuffer pwd = new StringBuffer(); Random r = new Random(); int range = buffer.length(); for (int i = 0; i < len; i ++) { int k = Math.abs(r.nextInt(range)); if(k>=0 && k<range){ pwd.append(buffer.charAt(k)); } } return pwd.toString(); }
public static void main(String[] args) { try{ //String ms = MD5("12345678"); String ms = "abcdefg==akl;k/*,"; System.out.println(ms+"----------------明文"); String key = getRandomKey(8); System.out.println(key+"----------------密钥"); String ins = AESEncrypt(key,ms); System.out.println(ins+"----------------密文"); String outs = AESDencrypt(key,ins); System.out.println(outs+"----------------解后明文"); }catch(Exception e){ e.printStackTrace(); System.out.println("----------------------"); } } } //字节数组及字符串转换类 import java.io.ByteArrayOutputStream; import java.io.IOException;public class Base64 { public static String encode(byte[] data) { StringBuffer sb = new StringBuffer(); int len = data.length; int i = 0; int b1, b2; while (i < len) { byte ms = data[i]; b1 = (ms >>> 4) & 0xf;// 高四位 b2 = ms & 0xf;// 低四位 sb.append(Integer.toHexString(b1)); sb.append(Integer.toHexString(b2)); i++; } return sb.toString(); } public static byte[] decode(String str) throws IOException { int len = str.length(); ByteArrayOutputStream buf = new ByteArrayOutputStream(len); int i = 0; if (len % 2 != 0) { throw new IOException("输入的长度只能为偶数!"); } while (i < len) { String tmp_hight = str.substring(i, i + 1); String tmp = str.substring(i, i + 2); System.out.println(tmp_hight); int dec_sign = Integer.parseInt(tmp_hight, 16) >>> 3; int dec = 0; if (dec_sign == 1) { dec = Integer.parseInt(tmp, 16) ^ 0xff; dec = dec + 1; dec = -dec; } else { dec = Integer.parseInt(tmp, 16); } buf.write(dec); i = i + 2; } return buf.toByteArray(); } public static String getBase64Encode(byte[] src) throws Exception { try { return Base64.encode(src); } catch (Exception e) { e.printStackTrace(); throw e; } } public static byte[] getBase64Dencode(String src) throws Exception { try { return Base64.decode(src); } catch (Exception e) { e.printStackTrace(); throw e; } }}
请不要偷换概念。
小僧也知道一旦和所谓的第一扯上关系,大家就会为了这个东西口水一番。
没有意义。希望各位感兴趣 有经验的CSDNer 整理下哈PS:其实我挺莫名奇妙滴。我什么时候强调一处的安全设置了。我开的搜集贴 就是搜集web开发体系的安全应用。
keytool -genkey -dname "CN=demo, OU=softDept, O=company, L=puddong,S=shanghai, C=cn" -alias demo -keyalg RSA -keysize 1024 -keystore demoKeystore -validity 3650 -storepass storePwd -keypass demoPwd
生成保存公钥和私钥的密钥仓库,保存在demoKeystore文件中。这里storepass 和 keypass 不要有java 正则表达式中的特殊字符,否则程序里要转义麻烦。keytool -export -alias demo -keystore demoKeystore -rfc -file demo.cer //从密钥仓库中导出保存公钥的证书
输入keypass 即demoPwd
try{
//密钥仓库
KeyStore ks = KeyStore.getInstance("JKS");
//读取密钥仓库
FileInputStream ksfis = new FileInputStream("demoKeystore");
BufferedInputStream ksbufin = new BufferedInputStream(ksfis);
char[] storePwd = "storePwd".toCharArray();
ks.load(ksbufin, storePwd);
ksbufin.close();
char[] keyPwd = "demoPwd".toCharArray();
//从密钥仓库得到私钥
PrivateKey priK = (PrivateKey) ks.getKey("demo", keyPwd);
//生成cipher
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding",new org.bouncycastle.jce.provider.BouncyCastleProvider());
//用私钥初始化cipher
cipher.init(Cipher.ENCRYPT_MODE, priK);
byte[] plain = "This is plain text".getBytes("UTF-8");
//因为用的1024位rsa算法,一次只能加密1024/8-11字节数据,分开加密
byte[] code = new byte[(((plain.length-1)/117+1))*128];
int ixplain = 0;
int ixcode = 0;
while((plain.length - ixplain) > 117) {//每117字节做一次加密
ixcode += cipher.doFinal(plain, ixplain, 117, code, ixcode);
ixplain += 117;
}
cipher.doFinal(plain, ixplain, plain.length - ixplain, code, ixcode);
//加密后的code
System.out.println(Arrays.toString(code));
//通常会用base64编码
String base64 = encoder.encode(code); CertificateFactory certificatefactory = CertificateFactory
.getInstance("X.509");
//读取证书
FileInputStream fin = new FileInputStream("demo.cer");
X509Certificate certificate = (X509Certificate) certificatefactory
.generateCertificate(fin);
fin.close();
//得到公钥
PublicKey pubK = certificate.getPublicKey();
//初始化cipher
cipher.init(Cipher.DECRYPT_MODE, pubK);
//base64解码
code = decoder.decodeBuffer(base64);
System.out.println(Arrays.toString(code));
byte[] plain2 = new byte[code.length];
int ixplain2 = 0;
int ixcode2 = 0;
while((code.length - ixcode2) > 128) {//每128字节做一次解密
ixplain2 += cipher.doFinal(code, ixcode2, 128, plain2, ixplain2);
ixcode2 += 128;
}
ixplain2 += cipher.doFinal(code, ixcode2, code.length - ixcode2, plain2, ixplain2);
String s2 = new String(plain2, 0, ixplain2, "UTF-8");
System.out.println(s2);
}catch(Exception ex){
ex.printStackTrace();
}keytool使用方法可以参考jdk文档
Java keytool工具的作用及使用方法引用地址 :http://blog.csdn.net/zhanghaooy/archive/2008/10/02/3010107.aspx
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Random;import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;/**
* AES 加解密,附加MD5
**/public class Encryptor {
/**
* 对一个字符串进行MD5加密,返回一个加密后的密文
* @param String pwd
* 要加密的字符串
* @return 加密后的字符串
*/
public static String MD5(String pwd) throws NoSuchAlgorithmException,Exception
{
try{
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(pwd.getBytes());
byte[] hash = md5.digest();
/* 将二进制的字节码转成十六进制的字符串 */
String result = Base64.getBase64Encode(hash);
return result;
}catch(NoSuchAlgorithmException e){
throw new NoSuchAlgorithmException();
}catch(Exception ex){
throw ex;
}
}
public static String AESEncrypt(String pwd,String strEncpt)throws Exception
{
try{
byte[] bytIn = strEncpt.getBytes("UTF8");
//AES加密
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128, new SecureRandom(pwd.getBytes()));
SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec); byte[] bytOut = cipher.doFinal(bytIn);
String ecrOut = Base64.getBase64Encode(bytOut);
return ecrOut; }catch(Exception e){
e.printStackTrace();
System.out.println(e.getMessage());
throw new Exception();
}
}
public static String AESDencrypt(String pwd,String strDencpt)throws Exception
{
try{
byte[] bytIn = Base64.getBase64Dencode(strDencpt);
//AES加密
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128, new SecureRandom(pwd.getBytes()));
SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, skeySpec); //写文件
byte[] bytOut = cipher.doFinal(bytIn);
String ecrOut = new String(bytOut,"UTF8");
return ecrOut;
}catch(Exception e){
e.printStackTrace();
throw new Exception();
}
}
/**
* 生一个长度为len 的随机数
* @param int len
* 生成的随机密码的长度
* @return String pwd
* 返回生成的随机密码
*/
public static String getRandomKey(int len)
{
StringBuffer buffer = new StringBuffer("123456789");
StringBuffer pwd = new StringBuffer();
Random r = new Random();
int range = buffer.length();
for (int i = 0; i < len; i ++) {
int k = Math.abs(r.nextInt(range));
if(k>=0 && k<range){
pwd.append(buffer.charAt(k));
}
}
return pwd.toString();
}
public static void main(String[] args)
{
try{
//String ms = MD5("12345678");
String ms = "abcdefg==akl;k/*,";
System.out.println(ms+"----------------明文");
String key = getRandomKey(8);
System.out.println(key+"----------------密钥");
String ins = AESEncrypt(key,ms);
System.out.println(ins+"----------------密文");
String outs = AESDencrypt(key,ins);
System.out.println(outs+"----------------解后明文");
}catch(Exception e){
e.printStackTrace();
System.out.println("----------------------");
}
}
}
//字节数组及字符串转换类
import java.io.ByteArrayOutputStream;
import java.io.IOException;public class Base64 { public static String encode(byte[] data) {
StringBuffer sb = new StringBuffer();
int len = data.length;
int i = 0;
int b1, b2; while (i < len) {
byte ms = data[i];
b1 = (ms >>> 4) & 0xf;// 高四位
b2 = ms & 0xf;// 低四位
sb.append(Integer.toHexString(b1));
sb.append(Integer.toHexString(b2));
i++;
}
return sb.toString();
} public static byte[] decode(String str) throws IOException {
int len = str.length();
ByteArrayOutputStream buf = new ByteArrayOutputStream(len);
int i = 0;
if (len % 2 != 0) {
throw new IOException("输入的长度只能为偶数!");
} while (i < len) {
String tmp_hight = str.substring(i, i + 1);
String tmp = str.substring(i, i + 2);
System.out.println(tmp_hight);
int dec_sign = Integer.parseInt(tmp_hight, 16) >>> 3;
int dec = 0;
if (dec_sign == 1) {
dec = Integer.parseInt(tmp, 16) ^ 0xff;
dec = dec + 1;
dec = -dec;
} else {
dec = Integer.parseInt(tmp, 16);
} buf.write(dec);
i = i + 2;
}
return buf.toByteArray();
} public static String getBase64Encode(byte[] src) throws Exception {
try {
return Base64.encode(src);
} catch (Exception e) {
e.printStackTrace();
throw e;
}
} public static byte[] getBase64Dencode(String src) throws Exception {
try {
return Base64.decode(src);
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}}
分享了MD5加密方式大家不要把安全看的太片面了 其实对于我们应用开发程序员来说 安全相当滴重要了
有些朋友老是捧着 没有绝对的安全 的老话题来说真的没有必要也许有的人到现在仍然就接触不到整体安全问题的设计和编码,借用老某的话 一个都不能少
我强调的是安全的重要性,却不是否定其他因素的必要性这个只是个专题贴,我们就谈如何安全,怎么安全,不谈安全必不必要。
"
就把服务端证书添加到了客户端的信任域中,能够完成ssl通信。 注:ssl通信主要验证三个方面: a, 证书是否可信(第6步) b, 证书是否过期(第1步:validity) c, 证书地址是否和当前访问地址符合(第1步) 客户端添加信任域还有编程的动态方法,但是那样会降低通信的安全性,对于证书相对固定的服务,不建议使 用。 以上是客户端对于服务端的验证,这也是SSL默认的实现方式。在这种方式下,每次通信时,发起请求方(如PC 中的BROWSER)都会验证响应方(如某个WEB服务端)的证书是否在己方信任域中,对方的证书是否过期,对方 的域名或IP,是否与信任域中证书记载的一致;不符合其中任何一项,通信都会被拒绝。但反过来,响应方是不 对请求方做任何验证的。所以有些需要双向验证的服务(比如某些服务只能对特定的拥有证书的用户开放),就需 要添加客户端证书,由服务端来验证了,原理和实现与默认模式类似。
单点登陆 SSO 个人认为是个易用性的方面为主的东西。关于SSO ,现在大部分软件或引入或自己编写了 java方面 有个著名的开源SSO OpenSSO 哪位有这方面的资料可以发上来分享下 关于如何在项目中引入OpenSSO
有什么优点 有什么缺点都可以谈谈我之前做过一个,缺没有使用过这个开源的。有她的源代码 可惜一直没有看
单点登陆,看过一些关于这方面的,但是没有在项目上用过...
WEB实现主要有两种方式:
(1)是使用cookie,每次访问时附带上客户信息,然后在服务器恢复客户的个人信息,达到单点登陆的目的.
(2)是在服务器使用一个代理服务,通过代理生成入场券,用户的每次请求都是通过了代理处理,再将请求转发到真实的服务程序处理并返回.使用Cookies,这种方式最是简单,但是个人认为:不安全.
通过代理这种方式是安全的,但是实现复杂..关于单点登陆的好处,我只知道两个:
一个是对于使用者来说,不用去记忆多套的账号及密码,给于用户良好的使用体验;
另一个是对系统管理员来说,也简化了管理工作,不用在每个系统里设置权限,只要在一个地方设置了权限就OK了..
这是个人理解,下面,兄弟们补充吧..
也可以直接使用https。
只是在美剧中经常看到各种研究32位或64位加密和解密算法的高手~~
在这里学习了~~
前段时间配置的单点登录cas,关于什么是cas网上一查便知;
使用cas,看好的就是cas使用的技术
http://blog.csdn.net/accessmanager88/archive/2009/04/07/4054995.aspx
(内容有些长,所以就不贴出来了)
2、负责对公司研发项目进行安全评审;
3、负责本网站产品、服务的安全规范制定、推广、评审;
4、对开发,测试相关人员进行安全规范的培训,提升规范的可实施性;职位需求:
1、熟悉J2EE体系,具备3年以上系统分析,设计经验;
2、熟悉Web攻防技术及原理,关注业界最新的安全技术发展;
3、熟悉PKI技术及应用方案、熟悉密码技术;
4、有良好的沟通能力及组织能力,出色的团队合作精神;
登陆IP限制
使用密码
Session超时控制
证书验证
分角色分权限
密码加密,如MD5等等(软加密、硬加密)
Session及超时控制
2、防恶意攻击
验证码核对
HTTPS
增加拦截器,过滤非法/恶意访问
IP访问控制3、恶意攻击服务器
防止SQL注入
通讯安全:通讯中的帐号或者密码等重要数据加密或者全加密