【问题标题】:how to compare sha1 encripted password in Java?如何比较Java中的sha1加密密码?
【发布时间】:2016-12-15 11:00:46
【问题描述】:

假设我已经像这样加密了 SHA1 密码

String pass = "f6ce584e7b4ff5253eed4a2ea2b44247";

我想要这样的条件:

 if (pass.equals("userinput")){
        System.out.println("success");
    }

请有人帮助我制定适当的条件/功能来比较用户输入和加密密码之间的值。您的帮助将不胜感激。谢谢

【问题讨论】:

  • 首先了解如何获取"userinput" 的SHA1 哈希(javax.crypto 包可以提供帮助),将结果转换为十六进制字符串并进行比较。
  • 事实上,最好不要以纯文本形式传递用户密码。如果这是在网站上,您应该使用 Javascript 进行 sha1 散列并将其发送已散列。那么比较就很容易了。
  • @RealSkeptic 所以 MIM 可以只获取哈希而不是密码?这和发送明文密码一样安全。
  • @Durandal 不完全是。考虑社会工程学。如果您知道明文密码,则可能在同一用户使用的其他服务上相同,可能使用不同的哈希算法。但是,当然,在现实生活中,您会用挑战来加盐密码。事实上,你加盐两次 - 用于存储和每次登录。

标签: java encryption sha1


【解决方案1】:

SHA1 是一种哈希算法,这意味着它是单向的。散列后您无法获得原始消息。与双向加密不同(允许加密和解密)。

这意味着如果你想比较一个哈希,你不要尝试获取原始消息。相反,您也对要比较的消息进行哈希处理,然后执行匹配:

所以如果散列后的密码存储为:

String pass = "f6ce584e7b4ff5253eed4a2ea2b44247";

要匹配随后输入的密码,您可以:

//check if hashed userInput is also "f6ce584e7b4ff5253eed4a2ea2b44247"
if(pass.equals(sha1(userInput))){          
    //do whatever
}

要实现sha1()哈希函数,请参考:Java String to SHA1

【讨论】:

    【解决方案2】:

    获取您的哈希码:

    public static byte[] sha1(byte[] data)
    Calculates the SHA-1 digest and returns the value as a byte[].
    Parameters:
    data - Data to digest
    Returns:
    SHA-1 digest
    

    在以下位置找到这些 https://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/digest/DigestUtils.html#sha1Hex(java.lang.String)

    这有助于您的流程。

    import java.io.UnsupportedEncodingException;
    import java.security.InvalidKeyException;
    import java.security.NoSuchAlgorithmException;
    
    import javax.crypto.Mac;
    import javax.crypto.spec.SecretKeySpec;
    
    import org.apache.commons.codec.binary.Base64;
    import org.bouncycastle.jcajce.provider.asymmetric.rsa.DigestSignatureSpi.SHA1;
    
    public class SHA1_test {
    
        public static String sha1(String s, String keyString)
                throws UnsupportedEncodingException, NoSuchAlgorithmException,
                InvalidKeyException {
    
            SecretKeySpec key = new SecretKeySpec((keyString).getBytes("UTF-8"),
                    "HmacSHA1");
            Mac mac = Mac.getInstance("HmacSHA1");
            mac.init(key);
    
            byte[] bytes = mac.doFinal(s.getBytes("UTF-8"));
    
            return new String(Base64.encodeBase64(bytes));
    
        }
    
        public static void main(String[] args) throws InvalidKeyException,
                UnsupportedEncodingException, NoSuchAlgorithmException {
            Boolean validate = false;
            String code = sha1("admin", "123456");
            String your_user_inputString = "testpassword";
    
            if (code.equals(sha1(your_user_inputString, "123456"))) {
                System.out.println("Correct");
            } else {
                System.out.println("Bad password");
            }
    
        }
    
    }
    

    这行得通!!!

    【讨论】:

    • 我什至直接取用户输入,代码可以改成输入有代码
    • 我试过直接比较它们,但是失败了,我用的是spring框架
    猜你喜欢
    • 1970-01-01
    • 2011-03-03
    • 2017-10-31
    • 2021-10-28
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 2021-04-10
    • 1970-01-01
    相关资源
    最近更新 更多