java - Android sha512 示例

标签 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+)上运行

更新更新更新

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

最佳答案

阅读my post在这里,特别是我链接到的关于 password hashing 的帖子.

  • 您最好使用 bcrypt 或 scrypt,而不是自己进行密码哈希处理。
  • 但如果必须的话,您应该至少运行几千次迭代,最好是更多。

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

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

关于java - Android sha512 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6393292/

相关文章:

android - 与 AsyncTask 结合使用时处理 GridView 的并发

android - 在 android 中使用 webView 的最佳实践是什么?我们可以在 recyclerview 的每一行中使用 webview 吗?

java - XOM 规范化耗时过长

java - 如何使用 <s :property/> tag 执行 JavaScript

java - XML 文本元素空白

java - Android(Java)中另一个 jar 里的一个 jar

java - Proguard 保持集体诉讼禁止夏洛克

java - Flink Streaming - 在windows中应用函数

java - 如何将 Stream<String[]> 转换为 Stream<String>?

javascript - 用 jasmine 跟踪函数执行时间