当前位置: 首页 > 知识库问答 >
问题:

Java 7中的加密

高兴贤
2023-03-14
public class PasswordUtil {

    private static final String ALGORITHM = "PBKDF2WithHmacSHA256";
    private static final int ITERATION_COUNT = 10000;
    private static final int KEY_LENGTH = 256;

    /**
     *
     * @param password
     * @param salt
     * @return
     */
    public static String getSafetyPassword(String password, String salt) {

        char[] passCharAry = password.toCharArray();
        byte[] hashedSalt = getHashedSalt(salt);

        PBEKeySpec keySpec = new PBEKeySpec(passCharAry, hashedSalt, ITERATION_COUNT, KEY_LENGTH);

        SecretKeyFactory skf;
        try {
            skf = SecretKeyFactory.getInstance(ALGORITHM);
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }

        SecretKey secretKey;
        try {
            secretKey = skf.generateSecret(keySpec);
        } catch (InvalidKeySpecException e) {
            throw new RuntimeException(e);
        }
        byte[] passByteAry = secretKey.getEncoded();

        StringBuilder sb = new StringBuilder(64);
        for (byte b : passByteAry) {
            sb.append(String.format("%02x", b & 0xff));
        }
        return sb.toString();
    }

    /**
     *
     * @param salt
     * @return
     */
    private static byte[] getHashedSalt(String salt) {
        MessageDigest messageDigest;
        try {
            messageDigest = MessageDigest.getInstance("SHA-256");
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
        messageDigest.update(salt.getBytes());
        return messageDigest.digest();
    }
}

共有1个答案

弓温书
2023-03-14

在Java7中使用AES实现密码的加解密

Encryptionss.java::

public class Encryptionsss {

public static void main(String[] args) throws Exception {

     try {
         String text = "Hello World";
         String key = "1234567891234567";
         // Create key and cipher
         Key aesKey = new SecretKeySpec(key.getBytes(), "AES");
         Cipher cipher = Cipher.getInstance("AES");

     // encrypt the text
     cipher.init(Cipher.ENCRYPT_MODE, aesKey);
     byte[] encrypted = cipher.doFinal(text.getBytes());
     System.out.println("Encrypted text: " + new String(encrypted));

     // decrypt the text
     cipher.init(Cipher.DECRYPT_MODE, aesKey);
     String decrypted = new String(cipher.doFinal(encrypted));
     System.out.println("Decrypted text: " + decrypted);
  }catch(Exception e) {
     e.printStackTrace();
  }

    String plainText = "Hello World";

    /**
     * Generate new Key 
     */
//  String str = generatenewkeyasString();



 /*** Generate Cipher Text from Key(We are using same key stored in String-str)
 ****/


    String str = "]˜??4I-S@æ,Ôt";
    byte[] data = str.getBytes();
    SecretKey key2 = new SecretKeySpec(data, 0, data.length, "AES");
    byte[] cipherText = encryptText(plainText, key2);
    String scipherText = new String(cipherText);
   /**
    *
    * Decrypt Cipher Text with Key****/

    cipherText = scipherText.getBytes();
    String decryptedText = decryptText(cipherText, key2);
    System.out.println("ScipherText:" + scipherText);
    System.out.println("Original Text:" + plainText);
    System.out.println("AES Key (Hex Form):"
            + bytesToHex(key2.getEncoded()));
    System.out.println("Encrypted Text (Hex Form):"
            + bytesToHex(cipherText));
    System.out.println("Descrypted Text:" + decryptedText);

}

/**
 * 
 * @return byte[] as String
 * @Generate Key
 */

private static String generatenewkeyasString() throws Exception {
    SecretKey secKey = KeyGenerator.getInstance("AES").generateKey();
    byte[] data = secKey.getEncoded();
    String str = new String(data);
    return str;

}

/**
 * 
 * Encrypts plainText in AES using the secret key
 * 
 * @param plainText
 * 
 * @param secKey
 * 
 * @return
 * 
 * @throws Exception
 */

public static byte[] encryptText(String plainText, SecretKey secKey)
        throws Exception {

    // AES defaults to AES/ECB/PKCS5Padding in Java 7

    Cipher aesCipher = Cipher.getInstance("AES");
    aesCipher.init(Cipher.ENCRYPT_MODE, secKey);
    byte[] byteCipherText = aesCipher.doFinal(plainText.getBytes());
    return byteCipherText;

}

/**
 * 
 * Decrypts encrypted byte array using the key used for encryption.
 * 
 * @param byteCipherText
 * @param secKey
 * 
 * @return
 * 
 * @throws Exception
 */

public static String decryptText(byte[] byteCipherText, SecretKey secKey)
        throws Exception {

    // AES defaults to AES/ECB/PKCS5Padding in Java 7

    Cipher aesCipher = Cipher.getInstance("AES");
    aesCipher.init(Cipher.DECRYPT_MODE, secKey);
    byte[] bytePlainText = aesCipher.doFinal(byteCipherText);
    return new String(bytePlainText);

}

/**
 * 
 * Convert a binary byte array into readable hex form
 * 
 * @param hash
 * 
 * @return
 */

private static String bytesToHex(byte[] hash) {
    return DatatypeConverter.printHexBinary(hash);

}

}

 类似资料:
  • 问题内容: 首先,我希望这不是问题,所以我开始了一个新话题。我不知道如何根据已经回答的问题提出问题,所以我做到了。 我对Java很陌生,以下是我的问题。我正在编写一个小型聊天程序,并且使用带有的来显示不同颜色的文本,显示笑脸和显示超链接。 我的问题是,经过一些研究,我发现问题可能是由于Java7造成的,我无法使换行器正常工作。我希望文本自动换行,并包裹在超出组件宽度的字符串中间。自动换行可以很好地

  • 我使用intellij IDEA进行开发,我注意到IDEA在Java7上运行时,maven插件在下载依赖项时出现了问题(我在Windows7)。然而,在Java6上运行它就没有这个问题了。 以下是idea.log的摘录 我按照建议做了以下几点 > 确保我的/etc/hosts文件中有 将添加到我的idea64.exe.vmoptions,因此文件如下所示 谢谢你的帮助。

  • 支持哪些版本的Java? 但是,生成失败,出现以下消息:

  • Java 7的并发性和并行性特性——Fork/Join框架让我的手变得脏兮兮的。 我试图显示给定路径下的所有目录的列表。有人能告诉我我是否答对了吗? 下面是我的主要课程——JoinForkExample,它启动了这项任务 这是我的实际任务 我基本上达到了预期的效果。但我不太确定我是否做对了。令人惊讶的是,即使没有使用join/fork框架,我也没有注意到执行过程中的任何时间差。 任何想法!

  • 问题内容: JLS v7的第18章中的语法似乎与文档中其他地方的结构不同,但是对我而言似乎有所不同。具体在第15章中,规则是: 这样就可以创建一个RelationalExpression(并因此生成一个EqualityExpresson),而该关系又可以在创建EqualityExpression的EqualityExpression规则中用作LHS 。 但是当看第18章中的语法时,他们做了一些简化

  • 我遇到了一个奇怪的问题——供应商使用TLS SSLv3,同时使用自签名客户端和服务器证书。Java1.5和Java1.6没有这个问题——只需将客户端证书和私钥导入密钥库,将服务器公共证书导入信任库。一切都很好。然而,在Java7中,服务器证书无法被信任,即使使用的是同一个信任库。我尝试过使用Java7 (1.7.03, 04和05、x86和x64版本)的视窗和红帽,但没有成功。 我从头开始重新创建

  • Java7编译器是如何处理多捕获块的?一个简单的实现是生成字节码,就好像存在多个catch块一样。然而,我从多个来源得到的信息表明,情况并非如此--处理多个异常类型的catch块在编译期间不会产生重复的字节码。 那么,它是如何工作的呢?是否有一个新的字节码指令告诉JVM关于多捕获块?

  • 我有一个字符串,其中我需要拆分它并存储在ArrayList中,如下所示;所有这些都使用Java7。 下面是我的程序的输入; 我在这里试图实现的是一个数组列表,如下所示。 我编写了一个示例代码,但似乎没有将elementB分组到列表中。我们如何将这两个元素组合成一个列表。 示例代码: 我得到下面的输出,其中elementB没有改变,而是重复自身。有人能给我指路吗