android sha512的例子

时间:2011-06-18 01:28:52

标签: java android performance sha512

  1. 有人可以提供一个关于如何使用sha512 + salt的PW_HASH_ITERATION_COUNT次迭代来密码密码的java / android示例吗?

    伪代码中的

    hash = sha512(concat(pw,salt));
    for (i = 1; i<PW_HASH_ITERATION_COUNT; i++){
        hash = sha512(concat(hash,concat(pw,salt)));
    }
    

    其中z = concat(x,y)是x和y的串联。

    也许使用MessageDigest

  2. 您建议PW_HASH_ITERATION_COUNT?最多可以进行多少次迭代,以便甚至可以在某些旧设备上运行(2.1 +)

  3. 更新更新更新

    由于充分的理由,我们将使用bcrypt来加密我们的密码。我们使用jBCrypt实现。

    无论如何......回答这个问题......这是上面使用SHA-512和MessageDigest的问题的代码:

    import java.io.UnsupportedEncodingException;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    import de.seduceme.utils.Base64;
    
    public class PwStorage {
        public static int PW_HASH_ITERATION_COUNT = 5000;
        private static MessageDigest md;
    
        public static void main(String[] args) {
            String pw = "teüöäßÖst1";
            String salt = "e33ptcbnto8wo8c4o48kwws0g8ksck0";
    
            try {
                md = MessageDigest.getInstance("SHA-512");
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
                throw new RuntimeException("No Such Algorithm");
            }
    
            String result = PwStorage.hashPw(pw, salt);
            System.out.println(result);
            // result: 2SzT+ikuO9FBq7KJWulZy2uZYujLjFkSpcOwlfBhi6VvajJMr6gxuRo5WvilrMlcM/44u2q8Y1smUlidZQrLCQ==
        }
    
    
        private static String hashPw(String pw, String salt) {
            byte[] bSalt;
            byte[] bPw;
    
            try {
                bSalt = salt.getBytes("UTF-8");
                bPw = pw.getBytes("UTF-8");
            } catch (UnsupportedEncodingException e) {
                throw new RuntimeException("Unsupported Encoding", e);
            }
    
            byte[] digest = run(bPw, bSalt);
            for (int i = 0; i < PW_HASH_ITERATION_COUNT - 1; i++) {
                digest = run(digest, bSalt);
            }
    
            return Base64.encodeBytes(digest);
        }
    
        private static byte[] run(byte[] input, byte[] salt) {
            md.update(input);
            return md.digest(salt);
        }
    }
    

    使用this Base64 lib

2 个答案:

答案 0 :(得分:4)

在此处阅读my post,特别是我关于password hashing的帖子。

  • 理想情况下,您应该使用bcrypt或scrypt而不是自己进行密码散列。
  • 但如果你必须,你应该至少运行几千次迭代,最好是更多。

是的,您可以将MessageDigest用于SHA-512。每次调用digest时,对象的状态都会自动重置,这非常方便 - 您可以立即开始更新下一次迭代。

但我仍然认为你应该使用bcrypt或scrypt。为了您自己的利益,以及您的用户的利益。 : - )

答案 1 :(得分:0)

发现HMAC足以满足你想做的事情而且只进行2次迭代

归结为

hash = sha512(concat(xor(salt,nonce2),sha512(concat(xor(salt,nonce1),pw)));