随笔 - 72  文章 - 28  trackbacks - 0
<2008年1月>
303112345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用链接

留言簿(4)

随笔分类(66)

随笔档案(72)

文章档案(19)

收藏夹

搜索

  •  

最新评论

阅读排行榜

评论排行榜

今天碰到java.security.MessageDigest这个类;查看api解释为: 此 MessageDigest 类为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法。信息摘要是安全的单向哈希函数,它接收任意大小的数据,输出固定长度的哈希值。
又baidu了一下,搜搜资料,下面一个例子很不错,就把它引用过来咯;完整如下 ^^V

<!------------------------

有时候,我们必须把用户密码存放到数据库,为了安全起见,我们需要对这些密码进行单向的加密处理,
比如,有明文密码如下:
String originalPwd = "mypassword";

应用报文摘要方法,得到单向的加密字符串

//MD5是16位,SHA是20位(这是两种报文摘要的算法)
//MessageDigest md= MessageDigest.getInstance("MD5");
MessageDigest messageDigest=MessageDigest.getInstance("SHA-1");
messageDigest.update(originalPwd.getBytes());
//String digestedPwdString = new String(messageDigest.digest());
String digestedPwdString = new String(Base64.encode(messageDigest.digest()));
System.out.println("pwd:" + digestedPwdString);
这样,就得到密码的报文摘要,把此摘要保存到数据库,
以后用户登陆时,用相同的算法算出摘要,和数据库中的比较,如果一致,则密码正确。

注意:
byte[] digest = messageDigest.digest();
得到的是个二进制byte数组,有可能某些byte是不可打印的字符。
所以用Base64.encode把它转化成可打印字符。

也可以把digest的每个byte转化成hex(16进制)保存。
MessageDigest messageDigest=MessageDigest.getInstance("SHA-1");
messageDigest.update(originalPwd.getBytes());
byte[] bin = messageDigest.digest();
再调用下面的方法生产hex(16进制)保存。


二行制转hex字符串的方法如下:
private static String byte2hex(byte[] b){
    String hs="";
    String stmp="";
    for (int n=0; n<b.length; n++){
        stmp=(java.lang.Integer.toHexString(b[n] & 0xFF));
        if (stmp.length()==1) hs=hs+"0"+stmp;
            else hs=hs+stmp;
    }
    return hs;
}

或者:
private static String byto2hex2(byte[] bin){
    StringBuffer buf = new StringBuffer();
    for (int i = 0; i < bin.length; ++i) {
        int x = bin[i] & 0xFF, h = x >>> 4, l = x & 0x0F;
        buf.append((char) (h + ((h < 10) ? '0' : 'a' - 10)));
        buf.append((char) (l + ((l < 10) ? '0' : 'a' - 10)));
    }
    return buf.toString();
}

或者:
干脆直接用下面的方法生成,用到第三方包:
public static String encryptPwd(String pwd, String algorithm){
    //String a = org.apache.catalina.realm.RealmBase.Digest(pwd,"SHA-1");
    return org.apache.catalina.realm.RealmBase.Digest(pwd, algorithm);
}

posted on 2008-01-04 16:26 kelly 阅读(659) 评论(0)  编辑  收藏 所属分类: java

只有注册用户登录后才能发表评论。


网站导航: