好吧,这实际上是两部分的…
首先我需要
然后,来自#2或#3的结果将进入另一个项目。我正在尝试保护我们的PEM / DER密钥。
对于解密,我需要
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128); // 192 and 256 bits may not be available
SecretKey secretKey = keyGenerator.generateKey();
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
// By initializing the cipher in CBC mode, an "initialization vector" has been randomly
// generated. This initialization vector will be necessary to decrypt the encrypted data.
// It is safe to store the initialization vector in plain text for later use. You can obtain
// it's bytes by calling iv.getIV().
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
IvParameterSpec iv = cipher.getParameters().getParameterSpec(IvParameterSpec.class);
// IvParameterSpec iv = new IvParameterSpec(IV); //used for the hardcoded one
byte[] encryptedData = cipher.doFinal(data);
并解密一个
cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
byte[] decryptedData = cipher.doFinal(encryptedData);
System.out.println("decrypted: " + new String(decryptedData));
问题是:
给定一个用例场景,该场景很少会加密某些东西,而是分发要在运行时解密的加密密钥,除了密文,我还需要保存什么?
我知道我需要保存IV,但是解密时还不太好-这使我相信我也需要保存secretKey。
谁能给我任何提示,指针或一般安全提示,以寻求更好的解决方案?如果需要保存密钥,IV和加密数据,应将它们存储在哪里?也许对密钥进行硬编码并将IV连同加密数据一起存储?也许对IV和密钥都进行硬编码,然后将加密的数据存储在文件中?
这与理论安全性无关,可以认为这是您可能给试图窃取钥匙的人造成的最大麻烦和不便。我们都知道,我无法完美地隐藏它们。
我非常需要这个人从解密加密文件并在Java中执行开始
但是,如果有更好的方式将安全数据馈入PemKeyReader,我将不知所措。
共享密钥和加密某些东西是完全不同的两件事。如何分享金钥
话虽如此,AES
使用128位元比使用128位元的加密算法要强大得多。3DES
因此,您可以做的是保持PKI基础结构交换AES keys
,然后使用它们进行加密和解密。
为什么不RSA
呢?RSA
需要最少512位才能将其视为最强,如果增加更多位,则将增加加密和解密所需的时间。
SO AES快速安全。
使用SecretKeySpec从字节创建密钥[]
public static void main(String[] args) throws Exception
{
// Initialise secret key with predefined byte array [] like below. I
// have used simple string to array method to generate 16 byte array.
// AES Key must be minimum 16 bytes.
// Now you can put this byte array some where is .SO file.
// Generate new Key using this byte []
// Then you can generate a key using device specific information at
// first boot up.
// Use second key to encrypt data and first key to encrypt the second
// key
// I Hope it clears all the doubts
SecretKey key = new SecretKeySpec("ABCDEFGHIJKLMNOP".getBytes(), "AES");
System.out.println(Arrays.toString(key.getEncoded()));
// Initialise Cipher with AES Algorithm
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
// Set The Encrypt Mode
cipher.init(Cipher.ENCRYPT_MODE, key);
// Encrypt some bytes
byte[] encrypted = cipher.doFinal("ABCDEFGH".getBytes());
// Print it to vefiry
System.out.println(Arrays.toString(encrypted));
// Get The IV
byte[] iv = cipher.getIV();
System.out.println(iv.length);
// Now why storing you can create structure like [16 IV][Encrypted Data]
// And while decrypting you can read first [16] bytes IV and then
// decrypt remaining bytes
//byte[] iv = new byte[16];
// System.arraycopy(encrypted, 0, iv, 0, 16)
//Copy remaining bytes to decrypt
// set cipher to decrypt mode
cipher.init(Cipher.DECRYPT_MODE, key,new IvParameterSpec(iv));
// decrypt it
byte[] decrypted = cipher.doFinal(encrypted);
System.out.println(new String(decrypted));
}
现在编写一种算法,该算法将从某些随机数据(例如设备名称,用户名,随机种子等)生成byte []。
您可以通过在算法源代码中编写该算法C并创建.SO文件并byte []使用来为其添加更多保护Native calls。
完成所有这些操作有什么好处?
有人请帮助我如何解决CWE-259:使用硬编码密码缺陷。
目前,我们正在使用Checkmarx扫描应用程序代码。不确定Checkmarx是否检测/扫描源代码中的任何硬编码密码。是否需要在Checkmarx服务器上添加任何额外的配置来检测密码?
} 公共类GMailSender扩展javax.mail.authenticator{ } /**根据一个或多个*贡献者许可协议授权给Apache Software Foundation(ASF)。有关版权所有权的更多信息,请参阅与本作品一起分发的通知文件。*ASF根据Apache License,Version 2.0*(“License”)向您许可此文件;除非符合*许可证,否则您不得使用此文件
问题: 做这件事的最佳方法是什么? 注: 编码:输入任意字符串;创建有效的文件名作为输出 decode:从encode获取文件名,恢复原始字符串
问题内容: 我正在用Java实现与第三方应用程序的通信。作为登录过程的一部分,第三方应用程序正在发送一个加密的字符串,我必须对其进行解码并发回。我已经花了将近2天的时间进行糊涂和阅读文章,但是我找不到实现此目的的正确方法。 我有一个测试用例,其中加密的字符串为“ c1W2YO1vYQzu6czteEidrG0U4g5gT4h57vAlP7tdjcY =“,使用密码“ GAT”解密的字符串必须返回“
我有一个编码为base64的SVG文件,我想用ImageView显示图像。这是我尝试过的: 但是decodedByte总是返回null。 附注: 此代码适用于jpeg图像。 如果Bas64字符串包含Bas64前缀("data: Image/svg xml; Bas64,"或"data: Image/jpeg; Bas64,),则decdedByte也总是返回null Bas64字符串是正确的(它在