2
  1. 有人可以为 java/android 提供一个关于如何使用PW_HASH_ITERATION_COUNTsha512 + salt 迭代来散列密码的示例吗?

    在伪代码中:

    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+)

更新更新更新

由于充分的理由,我们将使用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);
    }
}

有了这个 Base64 库

4

2 回答 2

4

在这里阅读我的帖子,尤其是我链接到的关于密码散列的帖子。

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

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

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

于 2011-06-18T01:38:22.627 回答
0

发现HMAC足以满足您的需求,并且只进行 2 次迭代

归结为

hash = sha512(concat(xor(salt,nonce2),sha512(concat(xor(salt,nonce1),pw)));
于 2011-06-18T02:14:34.140 回答