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

安全传输用于加密/解密密码的密钥

贾骏喆
2023-03-14

我正在考虑使用ChaCha20-Poly1305来加密/解密密码(我需要加密/解密不能只哈希)。但是,要使用此算法,我们需要使用密钥。然而,这是一个问题,因为我正在他们的设备上加密/解密用户的密码,所以在我的数据库中,我只存储他们加密的密码。

问题是,如果用户从他们的手机上卸载我的应用程序或换成新手机,我需要相同的密钥才能再次解密用户的密码。

我的问题是:如何安全地传输和存储这个密钥?

另外,如果您有更好的选择来解决我的问题,例如不同的加密算法或方法,请告诉我。

这是一个我提到的带有秘密密钥对象的代码示例:

package com.javainterviewpoint;

import java.security.spec.AlgorithmParameterSpec;
import java.util.Base64;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class ChaCha20Poly1305Example
{
    static String plainText = "This is a plain text which will be encrypted by ChaCha20 Poly1305 Algorithm";

    public static void main(String[] args) throws Exception
    {
        KeyGenerator keyGenerator = KeyGenerator.getInstance("ChaCha20");
        keyGenerator.init(256);

        // Generate Key
        SecretKey key = keyGenerator.generateKey();

        System.out.println("Original Text  : " + plainText);

        byte[] cipherText = encrypt(plainText.getBytes(), key);
        System.out.println("Encrypted Text : " + Base64.getEncoder().encodeToString(cipherText));

        String decryptedText = decrypt(cipherText, key);
        System.out.println("DeCrypted Text : " + decryptedText);

    }

    public static byte[] encrypt(byte[] plaintext, SecretKey key) throws Exception
    {
        byte[] nonceBytes = new byte[12];

        // Get Cipher Instance
        Cipher cipher = Cipher.getInstance("ChaCha20-Poly1305/None/NoPadding");
        
        // Create IvParamterSpec
        AlgorithmParameterSpec ivParameterSpec = new IvParameterSpec(nonceBytes);

        // Create SecretKeySpec
        SecretKeySpec keySpec = new SecretKeySpec(key.getEncoded(), "ChaCha20");

        // Initialize Cipher for ENCRYPT_MODE
        cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivParameterSpec);

        // Perform Encryption
        byte[] cipherText = cipher.doFinal(plaintext);

        return cipherText;
    }

    public static String decrypt(byte[] cipherText, SecretKey key) throws Exception
    {
        byte[] nonceBytes = new byte[12];

        // Get Cipher Instance
        Cipher cipher = Cipher.getInstance("ChaCha20-Poly1305/None/NoPadding");

        // Create IvParamterSpec
        AlgorithmParameterSpec ivParameterSpec = new IvParameterSpec(nonceBytes);
                
        // Create SecretKeySpec
        SecretKeySpec keySpec = new SecretKeySpec(key.getEncoded(), "ChaCha20");

        // Initialize Cipher for DECRYPT_MODE
        cipher.init(Cipher.DECRYPT_MODE, keySpec, ivParameterSpec);

        // Perform Decryption
        byte[] decryptedText = cipher.doFinal(cipherText);

        return new String(decryptedText);
    }
}

共有1个答案

贺奕
2023-03-14

对于对称加密和解密,最佳做法是使用固定字符串或具有固定算法的主密钥,您只知道如何生成它。您必须使用此主密钥加密和解密所有其他密钥(名称为工作密钥)来加密/解密真实数据。

如果您的设备有一个可以安全保存密钥的安全区域,您必须通过其他设备或与服务器通信在其上注入主密钥。如果没有,您将面临泄露密钥的风险。

但是,如果您是该应用程序的唯一程序员,则可以使用固定算法生成主密钥。例如hash(xor(of1c1c)和设备的ID。现在,设备可以向服务器发送获取工作密钥的请求(通过发送其ID和由主密钥加密的mac块),然后您返回正确的工作密钥。

此方案用于ISO-8583支付。

 类似资料:
  • 我正在尝试使用javax.crypto.ciper加密/解密数据,其中我将转换指定为aes/ecb/pkcs5padding。 在我的本地机器中,jcesecurity.isrestricted()返回FALSE,但是当它在服务器上运行时,相同的方法返回true。由于服务器上的这种情况,系统不会为密码分配正确的权限。 不确定,JceSecurity restriction确切设置在哪里。感谢你的帮

  • 问题内容: 我想用Java加密和解密密码,然后以加密形式存储到数据库中。如果它是开源的,那就太好了。有什么建议/建议吗? 问题答案: 编辑 :这个答案是旧的。现在 不建议 使用MD5,因为它很容易被破坏。 我想象中的MD5必须足够好?您可以使用MessageDigest实现它。 这里还列出了其他算法。 如果确实需要,这是它的第三方版本: Fast MD5

  • 我在网络上看到了大量使用System.Security.Cryptography.RSacryptoServiceProvider的C#加密/解密教程和示例,但我希望能够做到的是: null 谁能给我指出一个有用的资源吗?

  • 问题内容: 我找到了用Java实施AES加密/解密的指南,并试图理解每一行并将其放入自己的解决方案中。但是,我没有完全理解它,因此出现了问题。最终目标是拥有基于密码的加密/解密。我已经阅读了有关此的其他文章/ stackoverflow帖子,但是大多数文章没有提供足够的解释(我对Java加密非常陌生) 我现在的主要问题是,即使设置了 I,最后还是会得到不同的Base64结果(每次都是随机的,但是我

  • 我理解哈希和加密之间的区别。我正在寻找一种在Python中实现加密/解密字符串的简单方法。我在网上找到的大多数方法都是关于使用散列算法(MD5-SHA-1等)来进行单向散列。但不幸的是,哈希是不可逆的。有什么建议吗?

  • 问题内容: 我正在加密用于登录的密码,它可以正常工作,但是我在Google Play控制台中收到一条警告,该如何删除它? 我正在android studio上尝试。 问题答案: 主要问题是您使用的密码没有完整性,并且使用了硬编码的加密密钥。如果使用“ 查找安全性错误”来分析源,则会收到CIPHER_INTEGRITY和HARD_CODE_KEY警告: 解决方案是使用包含基于哈希的消息认证码(HMA