【问题标题】:Java encryption with sha256 and salt使用 sha256 和 salt 进行 Java 加密
【发布时间】:2017-05-03 20:55:14
【问题描述】:

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

【问题讨论】:

  • MD5 和 SHA 是 散列算法 - 它们不是加密算法。您只需在设置密码时进行哈希处理,当您尝试登录时,您会比较哈希值。

标签: java encryption salt


【解决方案1】:

试试下面的示例代码,对我来说效果很好

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;
}

}

【讨论】:

    【解决方案2】:

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

    我需要用什么来加密密码

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2016-06-11
        • 1970-01-01
        • 2014-08-01
        • 2015-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-09
        相关资源
        最近更新 更多