java如何给密码加密和解密 ?

时间:2022-06-10 05:42:10
求助!!有哪位能帮我解决这个问题?小弟在这里谢谢了!

15 个解决方案

#1


该回复于2015-05-26 10:46:18被管理员删除

#2


随便自己创造的
比如你可以把密码getbyte(),再把byte数值前后倒置,就生成了新密码。解密就做相反的操作。

最多的解密技术还是调用java的MD5,不过MD5不能解密的。

#3


写错了 是最多的加密技术不是解密技术

#4


有个开源组件不错,jasypt,一个简单的加密解密示例:
BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
textEncryptor.setPassword(myEncryptionPassword);  //设置密码
String myEncryptedText = textEncryptor.encrypt(myText); //加密
...
String plainText = textEncryptor.decrypt(myEncryptedText); //解密

具体可以查看官网 http://www.jasypt.org/

#5


数据库里保存密码的 MD5 码(参见  java.security.MessageDigest),登录时拿提交过来的密码计算其 MD5 码然后跟数据库的比较。

#6


根本没必要解密。

#7


请问楼上的sagezk,那修改密码怎么办?

#8


我是用的oracle数据库,它本身有个加密的函数,所以我是用它做的

#9


引用 7 楼 combai 的回复:
请问楼上的sagezk,那修改密码怎么办?


如果老密码输入正确就拿新密码的 MD5 替代老密码的 MD5 存入数据库。

#10


引用 8 楼 combai 的回复:
我是用的oracle数据库,它本身有个加密的函数,所以我是用它做的


可以,但不灵活,一旦数据库换了(不是所有数据库都有加密解密存储函数),你的加密功能就用不了了。

#11


md5()

#12


呵呵!~
兄弟,这个问题我换可以说点。正如6楼说的没必要解密。验证一下就可以了。
我是按照MVC模式写的:

加密部分(网上有,我稍作改动):
《JAVA上加密算法的实现用例》原文地址:
http://www.ibm.com/developerworks/cn/java/l-security/    牛人写的。我这个就是改编自他写的。

md5reg.java

package tdy218.md5;
import java.security.*;

public class md5reg
{
 byte[] digest;String tmp="",has="";
public  String hasString(String password)   //这里作了修改 
{
try {   
     MessageDigest md5 = MessageDigest.getInstance("MD5"); //SHA-1跟MD5写法上差不多。
    
     md5.update(password.getBytes());     // 添加要计算的摘要信息   
   
     digest = md5.digest();
     }
 catch(NoSuchAlgorithmException e) 
     {   
      System.out.println("非法摘要算法!"+e.getMessage());   
     } 
for(int i=0;i<digest.length;i++) 
     {   
       tmp=(Integer.toHexString(digest[i] & 0XFF));   
       if(tmp.length()==1)    
           has=has+i+tmp;    //这里也做了修改
       else   
           has=has+tmp;   
       if(i<digest.length-1)  
           has=has+i;        //这里又做了修改
      } 
return has.toUpperCase(); 
}

}


控制器(Servlet)Loginhandle.java代码:

package tdy218.md5;

import tdy218.md5.md5reg;
import tdy218.md5.Loginbean;

import java.io.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class Loginhandle extends HttpServlet
{
public void init(ServletConfig config) throws  ServletException 
   {
   super.init(config);
   }
public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException
   {
    response.setContentType("text/html;charset=gbk");
    HttpSession session = request.getSession(true);
   
    Connection con = null;
    PreparedStatement  ps = null;
    ResultSet rs = null;
   
    md5reg md5 = new  md5reg();
    Loginbean  login = new  Loginbean();
    request.setAttribute("land",login);
    PrintWriter  show = response.getWriter();
   
    String username = request.getParameter("username").trim();
    String password = request.getParameter("password").trim();
    String checkcode = request.getParameter("checkcode").trim();
    String rand = (String)session.getAttribute("rand");
   
    if(username==null||username.equals(""))
    {
     show.print("<script language=javascript>alert('用户名不能为空!~');");
     show.print("history.go(-1);</script>");
    }
    else if(password==null||password.equals(""))
    {
      show.print("<script language=javascript>alert('请输入密码!~');");
      show.print("history.go(-1);</script>");
     }
     else if(checkcode==null||checkcode.equals(""))
     {
      show.print("<script language=javascript>alert('请输入验证码!~');");
      show.print("history.go(-1);</script>");
     }
     else if(checkcode.equals(rand)==false)
     {
      show.print("<script language=javascript>alert('你输入的验证码有误,请重新输入!~');");
      show.print("history.go(-1);</script>");
     }
     else
     {
     try
     {
      String md5pwd = md5.hasString(password); 
      
      Class.forName("com.mysql.jdbc.Driver").newInstance();
      String uri = "jdbc:mysql://127.0.0.1:3306/admin?characterEncoding=utf-8";
      con = DriverManager.getConnection(uri,"root","soft");
      
      String sql = "select  username,password  from md5landing  where username=?";
      ps = con.prepareStatement(sql);
      ps.setString(1,username);  
     //防止SQLInjection方法之一,功能正在加强。这几天正在做URL过滤,做好了我发到博客里。感兴趣的留一下喽。
      rs = ps.executeQuery();
      while(rs.next())
        {
         String pwd = rs.getString("password");
         if(pwd.equals(md5pwd))
          {
           login.SetUsername(username);
           login.SetPassword(password);
           login.SetMd5pwd(md5pwd);
           RequestDispatcher  dispatcher = request.getRequestDispatcher("loginresult.jsp");//转发
           dispatcher.forward(request,response);
          }
         else
          {
          show.print("<script language=javascript>alert('用户不存在或密码错误,请重新输入!~');");
           show.print("history.go(-1);</script>");
          }
        }
      
      ps.close();
      con.close();
      }
     catch(Exception e)
     {
      show.print("发生异常:"+e.getMessage());
     //show.print("<script language=javascript>alert('发生异常,请联系网站管理员!~');");
     //show.print("history.go(-1);</script>");
     }
     
    }//else语句的结尾。

   }//doPost方法的结尾。
   
public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException
    {
     doPost(request,response);  
    }
}



视图、模型Bean就不用发了吧?用IDE之类的工具很快就写成了。
我的还加了验证码。代码太多了,还有注册模块。这里就发这么多吧。感兴趣的在我空间里留言,留下E-mail 

#13


密码加密后的效果图:
java如何给密码加密和解密 ?

#14


thank you !

#15


tdy218可以给我发一下全部的代码吗?我是初学者,请多多关照。。。。

我的邮箱:haoibm@163.com

#1


该回复于2015-05-26 10:46:18被管理员删除

#2


随便自己创造的
比如你可以把密码getbyte(),再把byte数值前后倒置,就生成了新密码。解密就做相反的操作。

最多的解密技术还是调用java的MD5,不过MD5不能解密的。

#3


写错了 是最多的加密技术不是解密技术

#4


有个开源组件不错,jasypt,一个简单的加密解密示例:
BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
textEncryptor.setPassword(myEncryptionPassword);  //设置密码
String myEncryptedText = textEncryptor.encrypt(myText); //加密
...
String plainText = textEncryptor.decrypt(myEncryptedText); //解密

具体可以查看官网 http://www.jasypt.org/

#5


数据库里保存密码的 MD5 码(参见  java.security.MessageDigest),登录时拿提交过来的密码计算其 MD5 码然后跟数据库的比较。

#6


根本没必要解密。

#7


请问楼上的sagezk,那修改密码怎么办?

#8


我是用的oracle数据库,它本身有个加密的函数,所以我是用它做的

#9


引用 7 楼 combai 的回复:
请问楼上的sagezk,那修改密码怎么办?


如果老密码输入正确就拿新密码的 MD5 替代老密码的 MD5 存入数据库。

#10


引用 8 楼 combai 的回复:
我是用的oracle数据库,它本身有个加密的函数,所以我是用它做的


可以,但不灵活,一旦数据库换了(不是所有数据库都有加密解密存储函数),你的加密功能就用不了了。

#11


md5()

#12


呵呵!~
兄弟,这个问题我换可以说点。正如6楼说的没必要解密。验证一下就可以了。
我是按照MVC模式写的:

加密部分(网上有,我稍作改动):
《JAVA上加密算法的实现用例》原文地址:
http://www.ibm.com/developerworks/cn/java/l-security/    牛人写的。我这个就是改编自他写的。

md5reg.java

package tdy218.md5;
import java.security.*;

public class md5reg
{
 byte[] digest;String tmp="",has="";
public  String hasString(String password)   //这里作了修改 
{
try {   
     MessageDigest md5 = MessageDigest.getInstance("MD5"); //SHA-1跟MD5写法上差不多。
    
     md5.update(password.getBytes());     // 添加要计算的摘要信息   
   
     digest = md5.digest();
     }
 catch(NoSuchAlgorithmException e) 
     {   
      System.out.println("非法摘要算法!"+e.getMessage());   
     } 
for(int i=0;i<digest.length;i++) 
     {   
       tmp=(Integer.toHexString(digest[i] & 0XFF));   
       if(tmp.length()==1)    
           has=has+i+tmp;    //这里也做了修改
       else   
           has=has+tmp;   
       if(i<digest.length-1)  
           has=has+i;        //这里又做了修改
      } 
return has.toUpperCase(); 
}

}


控制器(Servlet)Loginhandle.java代码:

package tdy218.md5;

import tdy218.md5.md5reg;
import tdy218.md5.Loginbean;

import java.io.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class Loginhandle extends HttpServlet
{
public void init(ServletConfig config) throws  ServletException 
   {
   super.init(config);
   }
public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException
   {
    response.setContentType("text/html;charset=gbk");
    HttpSession session = request.getSession(true);
   
    Connection con = null;
    PreparedStatement  ps = null;
    ResultSet rs = null;
   
    md5reg md5 = new  md5reg();
    Loginbean  login = new  Loginbean();
    request.setAttribute("land",login);
    PrintWriter  show = response.getWriter();
   
    String username = request.getParameter("username").trim();
    String password = request.getParameter("password").trim();
    String checkcode = request.getParameter("checkcode").trim();
    String rand = (String)session.getAttribute("rand");
   
    if(username==null||username.equals(""))
    {
     show.print("<script language=javascript>alert('用户名不能为空!~');");
     show.print("history.go(-1);</script>");
    }
    else if(password==null||password.equals(""))
    {
      show.print("<script language=javascript>alert('请输入密码!~');");
      show.print("history.go(-1);</script>");
     }
     else if(checkcode==null||checkcode.equals(""))
     {
      show.print("<script language=javascript>alert('请输入验证码!~');");
      show.print("history.go(-1);</script>");
     }
     else if(checkcode.equals(rand)==false)
     {
      show.print("<script language=javascript>alert('你输入的验证码有误,请重新输入!~');");
      show.print("history.go(-1);</script>");
     }
     else
     {
     try
     {
      String md5pwd = md5.hasString(password); 
      
      Class.forName("com.mysql.jdbc.Driver").newInstance();
      String uri = "jdbc:mysql://127.0.0.1:3306/admin?characterEncoding=utf-8";
      con = DriverManager.getConnection(uri,"root","soft");
      
      String sql = "select  username,password  from md5landing  where username=?";
      ps = con.prepareStatement(sql);
      ps.setString(1,username);  
     //防止SQLInjection方法之一,功能正在加强。这几天正在做URL过滤,做好了我发到博客里。感兴趣的留一下喽。
      rs = ps.executeQuery();
      while(rs.next())
        {
         String pwd = rs.getString("password");
         if(pwd.equals(md5pwd))
          {
           login.SetUsername(username);
           login.SetPassword(password);
           login.SetMd5pwd(md5pwd);
           RequestDispatcher  dispatcher = request.getRequestDispatcher("loginresult.jsp");//转发
           dispatcher.forward(request,response);
          }
         else
          {
          show.print("<script language=javascript>alert('用户不存在或密码错误,请重新输入!~');");
           show.print("history.go(-1);</script>");
          }
        }
      
      ps.close();
      con.close();
      }
     catch(Exception e)
     {
      show.print("发生异常:"+e.getMessage());
     //show.print("<script language=javascript>alert('发生异常,请联系网站管理员!~');");
     //show.print("history.go(-1);</script>");
     }
     
    }//else语句的结尾。

   }//doPost方法的结尾。
   
public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException
    {
     doPost(request,response);  
    }
}



视图、模型Bean就不用发了吧?用IDE之类的工具很快就写成了。
我的还加了验证码。代码太多了,还有注册模块。这里就发这么多吧。感兴趣的在我空间里留言,留下E-mail 

#13


密码加密后的效果图:
java如何给密码加密和解密 ?

#14


thank you !

#15


tdy218可以给我发一下全部的代码吗?我是初学者,请多多关照。。。。

我的邮箱:haoibm@163.com