Java 使用 sha256 和 salt 加密

Java encryption with sha256 and salt

我需要你的一点帮助,我有一个练习,做一个登录程序并用 sha-256 和 salt 存储密码,我做了一个部分,但这是困难的部分。我读过,如果您使用 sha-256,则无法通过逆向操作来确定密码。如果是真的那么我需要用什么来加密密码,加密密码后,如果密码被加密,我该如何登录? PS:我在 google 上搜索过。

我们假设您的密码是 12345678。您将散列此密码并将其保存到您的程序中。在您的登录程序中,您从用户那里获取输入,使用相同的算法对其进行散列,然后比较两个散列后的字符串。如果相等,则字符串相等,否则,它们不相等。此人无法弄清楚正确的密码是什么,而您已对密码进行哈希处理。

您应该了解散列函数的工作原理。哈希函数只产生一个值,这取决于您的输入。由于计算该值的公式对于特定的哈希函数(即 SHA-256)始终相同,因此如果您知道输入(在您的情况下为密码),则始终可以生成它。因此,与密码不同,哈希函数计算出的值不应该被解密。

what I need to use to encrypt the password

您不必加密密码,因为如您所说,您无法通过仅知道存储在您数据库中的哈希值来逆转操作。如果您知道纯文本形式的密码,您只能获得访问权限。

尝试下面的示例代码,它在我这边运行良好

import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;
import java.util.Base64;
import java.util.Base64.Encoder;
import java.util.Scanner;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import java.security.NoSuchAlgorithmException;
import java.util.Base64.Decoder;

public class Cryptography {

public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeySpecException {
    Encoder encoder = Base64.getUrlEncoder().withoutPadding();
    Decoder decoder = Base64.getUrlDecoder();
    String integritystring = "810710202108241079100KAY435788318046";
    String strSalt = "3a9IbkKNr2RjwFwGnPudHbLfA4zugj6TVcoBtlWpJl0m";
    byte[] bSalt = Base64.getMimeDecoder().decode(strSalt);
    System.out.println("Salt: " + strSalt);
    System.out.println("integritystring: " + integritystring);
    String strHash = encoder.encodeToString(Hash(integritystring, bSalt));
    System.out.println("Hash: " + strHash);
}



private static byte[] Salt() {
    SecureRandom random = new SecureRandom();
    byte salt[] = new byte[6];
    random.nextBytes(salt);
    return salt;
}

private static byte[] Hash(String password, byte[] salt) throws NoSuchAlgorithmException, InvalidKeySpecException {
    KeySpec spec = new PBEKeySpec(password.toCharArray(), salt, 65536, 128);
    SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
    byte[] hash = factory.generateSecret(spec).getEncoded();
    return hash;
}

}