我的mai服务器用的是extmail,密码加密方式是md5crypt方式,我现在要自己写个登陆和修改密码的页面,但是数据库里面存储的是 $1$iL5qCwKt$VXwkRD6w1IfErBCFp2LD61 这种格式的密码,我怎么才能验证密码和修改这种格式的密码?求高人解答...

解决方案 »

  1.   

    给你点代码,你看看:
    //得到数据库的密码(我这个是ibatis,你根据你自己的得到数据库中的密码)
    String password = (String) sqlDao.getRecord("enterprise.getEnterprisePassword", eid);
    //获得页面输入的旧密码
    String oldpassword = request.getParameter("oldpassword");
    //EncryptUtil封装类str2md5加密方法
    if(EncryptUtil.str2md5(oldpassword).equals(password)){
    ..........
      

  2.   

    MD5 属于 MessageDigest, 是hash function,是不可逆的。
    Sun的MessageDigest提供了下列Algorithm:
    MD2 
    MD5 
    SHA-1 
    SHA-256 
    SHA-384 
    SHA-512  一般写登陆程序,楼主只需要把form中拿到的password用同样的Algorithm进行hash运算,得到一个HASH字符串, 然后比较你hash后的字符串和数据库中的字符串是否一样,如果一样, 则表示拥护密码正确,反之,密码不正确, 例如 你的password 用 MD5 Algorithm算法 hash后得到$1$iL5qCwKt$VXwkRD6w1IfErBCFp2LD61, 正好和数据库中检测到的一样, 哪么说明用户密码正确。下列是JAVA中简单HASH的实现:
     public static String hash( String cleartext ) {
            try {
                // Can be MD5 (128bit), SHA-1(160bit), SHA-256, SHA-384,SHA-512
                MessageDigest algoHash = MessageDigest.getInstance( "SHA-256" );
                algoHash.update( cleartext.getBytes( "UTF-8" ) );
                byte[] digest = algoHash.digest();
                String b64Digest = new String( Base64.encode( digest ), "UTF-8" );
                return b64Digest;
            }
            catch ( GeneralSecurityException e ) {
                log.info( "sha2Hash: ", e );
                return null;
            }
            catch ( UnsupportedEncodingException e) {
                log.info( "sha2Hash: ", e );
                return null;
            }
        }
    这里使用了SHA-256作为算法进行hash运算, 楼主可以根据自己的算法替换 SHA-256, 就可以了希望我的回答对楼主有用。
      

  3.   

    大家切记: MD5 只是一种消息摘要技术,不是一种安全的加密算法。 对于登录系统,尽量少用直接MD5后的值来作为密码密文。  
      

  4.   

    $1$iL5qCwKt$VXwkRD6w1IfErBCFp2LD61 这种格式的密码是extmail本身加密后存进数据库的..$1$hhhhhh$xxxxxxxxxxx该格式以md5()结果为基础,用一串hhhhhh(随机数)的hash对md5进行加密得到的密码,xxxxxxxxxxxxx  就是md5密文数据,它的特征是以$1$为前缀,符合此说明的格式就是md5crypt。这是extmail官方的说明,但是同样是123456,每次保持进数据库的结果都不一样...请问..这样的话我该如何验证和修改密码?