我想用自己的密钥使用AES加密字符串.但是我遇到了密钥的位长问题.你能查看我的代码,看看我需要修改/改变什么.
public static void main(String[] args) throws Exception {
String username = "bob@google.org";
String password = "Password1";
String secretID = "BlahBlahBlah";
String SALT2 = "deliciously salty";
// Get the Key
byte[] key = (SALT2 + username + password).getBytes();
System.out.println((SALT2 + username + password).getBytes().length);
// Need to pad key for AES
// TODO: Best way?
// Generate the secret key specs.
SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
// Instantiate the cipher
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
byte[] encrypted = cipher.doFinal((secrectID).getBytes()); …Run Code Online (Sandbox Code Playgroud) 为什么我问这个问题:
我知道有很多关于AES加密的问题,即使对于Android也是如此.如果你在网上搜索,有很多代码片段.但是在每一个页面上,在每个Stack Overflow问题中,我都发现了另一个具有重大差异的实现.
所以我创建了这个问题以找到"最佳实践".我希望我们可以收集最重要的要求列表,并建立一个非常安全的实施!
我读到了初始化载体和盐.并非我发现的所有实现都具有这些功能.所以你需要它吗?它是否会增加安全性?你是如何实现它的?如果加密数据无法解密,算法是否应该引发异常?或者这是不安全的,它应该只返回一个不可读的字符串?算法可以使用Bcrypt而不是SHA吗?
我发现这两个实现怎么样?他们还好吗?缺少完美或一些重要的事情?这些是安全的吗?
算法应该使用字符串和"密码"进行加密,然后使用该密码加密字符串.输出应该是一个字符串(十六进制或base64?).当然,解密也应该是可能的.
什么是Android的完美AES实现?
实施#1:
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
public class AdvancedCrypto implements ICrypto {
public static final String PROVIDER = "BC";
public static final int SALT_LENGTH = 20;
public static final int IV_LENGTH = 16;
public static final int PBE_ITERATION_COUNT = 100;
private static final String RANDOM_ALGORITHM = "SHA1PRNG";
private static final String HASH_ALGORITHM = "SHA-512";
private static final …Run Code Online (Sandbox Code Playgroud) 我正在寻找一些如何使用node.js和mongodb安全地存储密码和其他敏感数据的示例.
我希望一切都使用一个独特的盐,我将存储在mongo文档中的哈希旁边.
对于身份验证,我是否只需对输入进行加密和加密,并将其与存储的哈希相匹配?
我是否需要解密此数据?如果需要,我应该如何解决?
如何将私钥,甚至salting方法安全地存储在服务器上?
我听说AES和Blowfish都是不错的选择,我该怎么用?
任何如何设计这个的例子都会非常有用!
谢谢!
我正在处理的应用程序允许用户加密文件.文件可以是任何格式(电子表格,文档,演示文稿等).
对于指定的输入文件,我创建了两个输出文件 - 加密数据文件和密钥文件.您需要这两个文件才能获取原始数据.密钥文件必须仅适用于相应的数据文件.它不适用于来自同一用户或任何其他用户的任何其他文件.
AES算法需要两个不同的加密参数,一个密钥和一个初始化向量(IV).
我看到了创建密钥文件的三种选择:
请注意,它与不同客户使用的应用程序相同.
看起来所有三种选择都会实现相同的最终目标.但是,我想就正确的方法应该得到您的反馈.
我想知道AES加密后数据的大小,这样我就可以避免缓冲我的后AES数据(在磁盘或内存上),主要是为了知道大小.
我使用128位AES和javax.crypto.Cipher和javax.crypto.CipherInputStream加密.
使用各种输入大小执行的一些测试表明,如下计算的后加密大小是正确的:
long size = input_Size_In_Bytes;
long post_AES_Size = size + (16 - (size % 16));
Run Code Online (Sandbox Code Playgroud)
但我不确定上述公式是否适用于所有可能的输入尺寸.
有没有办法在应用AES加密后计算数据大小 - 事先无需缓冲加密数据(在磁盘或内存上)以了解其加密后大小?
我有一个在我的开发MacBook Pro上运行良好的测试,但无法在持续集成的TeamCity服务器中运行.
错误如下:
java.security.InvalidKeyException: Illegal key size
at javax.crypto.Cipher.a(DashoA13*..)
at javax.crypto.Cipher.init(DashoA13*..)
at javax.crypto.Cipher.init(DashoA13*..)
Run Code Online (Sandbox Code Playgroud)
开发盒和TeamCity都使用Java 1.6,我使用BouncyCastle库来满足特殊的AES加密需求.
代码如下:
private byte[] aesEncryptedInfo(String info) throws UnsupportedEncodingException, IllegalBlockSizeException, BadPaddingException, InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidParameterSpecException, InvalidAlgorithmParameterException, NoSuchProviderException {
Security.addProvider(new BouncyCastleProvider());
SecretKey secret = new SecretKeySpec(CUSTOMLONGSECRETKEY.substring(0, 32).getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
cipher.init(Cipher.ENCRYPT_MODE, secret, new IvParameterSpec(VECTOR_SECRET_KEY.getBytes()));
return cipher.doFinal(info.getBytes("UTF-8"));
}
Run Code Online (Sandbox Code Playgroud)
UPDATE
看起来根据所选答案,我必须在我的TeamCity安装上修改一些东西,它可能会影响一些用户安装 - 所以它不是一个好选择我必须切换到另一个加密库来做到这一点没有限制.所以充满弹性的城堡可能会有所帮助.
更新2
我实际上切换到使用BouncyCastle来避免这种限制.请注意,这仅适用于直接使用自己的BC类,而不是BC提供程序.
如果我对AES加密文件,然后对其进行ZLIB压缩,那么压缩效率是否会低于我先压缩然后加密的效率?
换句话说,我应该先压缩还是首先加密,还是重要?
OpenSSL为AES加密提供了一种流行的(但不安全 - 见下文!)命令行界面:
openssl aes-256-cbc -salt -in filename -out filename.enc
Run Code Online (Sandbox Code Playgroud)
Python以PyCrypto包的形式支持AES,但它只提供工具.如何使用Python/PyCrypto解密使用OpenSSL加密的文件?
此问题过去也涉及使用相同方案的Python加密.我已经删除了那部分以阻止任何人使用它.不要以这种方式加密任何数据,因为它不符合今天的标准.你应该只使用解密,除了后向兼容性之外没有其他原因,即当你别无选择时.想要加密?如果可能的话,使用NaCl/libsodium.
使用标准JDK在Java中生成安全随机AES密钥的推荐方法是什么?
在其他帖子中,我发现了这一点,但使用a SecretKeyFactory可能是一个更好的主意:
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
SecureRandom random = new SecureRandom(); // cryptograph. secure random
keyGen.init(random);
SecretKey secretKey = keyGen.generateKey();
Run Code Online (Sandbox Code Playgroud)
如果答案包括解释为什么它是生成随机密钥的好方法,那将是很好的.谢谢!
aes ×10
encryption ×7
java ×4
jce ×2
android ×1
compression ×1
cryptography ×1
javascript ×1
key ×1
mongodb ×1
node.js ×1
openssl ×1
performance ×1
pycrypto ×1
python ×1
zlib ×1