【问题标题】:Encryption of Password in Java or MySQL? [closed]Java或MySQL中的密码加密? [关闭]
【发布时间】:2012-05-28 14:43:31
【问题描述】:

我正在尝试在用户注册中使用 MD5 加密密码,并在登录时匹配相同的密码。我使用 Mysql 作为我的数据库。Mysql 也提供了将密码转换为 MD5 的选项(即 MD5(密码)) ..我想知道哪种加密方法更好..是使用java代码还是mysql查询..

提前致谢。

【问题讨论】:

  • 您可能还想阅读codinghorror.com/blog/2007/09/…
  • 这不是加密:这是 MD5 散列。散列是正确的做法,但您需要用正确的名称来称呼它。 SHA 哈希会更加安全。

标签: java mysql


【解决方案1】:

【讨论】:

  • 他没有存储密码。你的观点?
  • 使用加密密码登录时匹配密码意味着他会将密码存储在mysql中。这就是重点。
  • 不,关键是他正在“存储密码哈希”。阅读问题。他误用了“加密”这个词,应该使用 SHA 而不是 MD5,否则他正在做你说他应该做的事情。
【解决方案2】:

由于逻辑上您的应用程序和数据库可以存在于两个单独的物理盒子中,因此如果您在应用程序层加密密码然后将其移动到数据库中,则更安全。

从应用程序设计的角度来看,你应该考虑加密,在很早的时候对你的密码进行哈希处理,这样你的密码就不会像纯字符串一样从一层到另一层移动。

题外话:

MD5 容易出现collision attack,您可以考虑使用salt 之类的附加电子邮件或动态生成的值来防止Rainbow Table

definitely-safest-password-storage-scheme

【讨论】:

    【解决方案3】:

    这是我使用 MD5 加密的算法。它返回您的加密输出。

       public class CryptWithMD5 {
       private static MessageDigest md;
    
       public static String cryptWithMD5(String pass){
        try {
            md = MessageDigest.getInstance("MD5");
            byte[] passBytes = pass.getBytes();
            md.reset();
            byte[] digested = md.digest(passBytes);
            StringBuffer sb = new StringBuffer();
            for(int i=0;i<digested.length;i++){
                sb.append(Integer.toHexString(0xff & digested[i]));
            }
            return sb.toString();
        } catch (NoSuchAlgorithmException ex) {
            Logger.getLogger(CryptWithMD5.class.getName()).log(Level.SEVERE, null, ex);
        }
            return null;
    
    
       }
    }
    

    您无法解密 MD5,但您可以比较输出,因为如果您在此方法中放入相同的字符串,它将返回相同的加密输出。如果您想解密,您需要使用 SHA。您永远不会使用解密用户密码。为此始终使用 MD5。该异常非常多余。它永远不会抛出它。当您将密码添加到数据库时,您添加此方法返回的内容。要登录您比较它们。

    【讨论】:

      猜你喜欢
      • 2011-09-29
      • 2020-04-13
      • 2021-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-10
      • 1970-01-01
      相关资源
      最近更新 更多