如果我使用AES(System.Security.Cryptography)简单地加密和解密SQL服务器中的blob或memo字段,那么我在哪里将"Key"和"IV"值存储在服务器上?(文件,Regkey,Dbase,......)
那些AES"Key"和"IV"值的保护是什么?
背景问题更多:如果"他们"攻击服务器并获得dbase ...那么他们可能也可以进入加密程序的程序(它在同一台服务器上,无法帮助它)...如果"他们"非常好,那么他们会注意到存储"Key"和"IV"值的位置......(.NET 4.5 ILSPY)并且所有内容都可以再次解密.
请指教?你们如何处理AES"Key"和"IV"值?
Ps:这不是关于pwd字段...所以,它不是关于散列...它的纯数据加密.
我正在寻找一个(最好是纯粹的)python库来进行AES 256加密和解密.
该库应该支持CBC密码模式,并根据我之前的问题的答案使用PKCS7填充.
该库至少应该适用于Mac OS X(10.4)和Windows XP.理想情况下,只需将其放入我的项目的源目录中.我已经看过Josh Davis的这个,但我不确定它有多好,如果它做了所需的CBC密码模式......扫描源表明它没有
我有以下加密数据的程序.
import java.security.Key;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
public class Test {
private static final String ALGORITHM = "AES";
private static final byte[] keyValue = "ADBSJHJS12547896".getBytes();
public static void main(String args[]) throws Exception {
String encriptValue = encrypt("dude5");
decrypt(encriptValue);
}
/**
* @param args
* @throws Exception
*/
public static String encrypt(String valueToEnc) throws Exception {
Key key = generateKey();
Cipher c = Cipher.getInstance(ALGORITHM);
c.init(Cipher.ENCRYPT_MODE, key);
System.out.println("valueToEnc.getBytes().length "+valueToEnc.getBytes().length);
byte[] encValue = c.doFinal(valueToEnc.getBytes());
System.out.println("encValue length" + encValue.length);
byte[] encryptedByteValue = …
Run Code Online (Sandbox Code Playgroud) 我正在eclipse 上开展基于Web的文本加密和解密项目(遵循Struts 2)
每当我输入密码和纯文本时,我都会收到无效的AES密钥长度错误.
服务类(SymAES.java)
package com.anoncrypt.services;
import java.security.Key;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
public class SymAES
{
private static final String ALGORITHM = "AES";
private static byte[] keyValue= new byte[] { 'T', 'h', 'i', 's', 'I', 's', 'A', 'S', 'e', 'c', 'r', 'e', 't', 'K', 'e', 'y' };
public String encode(String valueToEnc) throws Exception {
Key key = new SecretKeySpec(keyValue, ALGORITHM);
Cipher c = Cipher.getInstance(ALGORITHM);
c.init(Cipher.ENCRYPT_MODE, key);
byte[] encValue = c.doFinal(valueToEnc.getBytes());
String encryptedValue = …
Run Code Online (Sandbox Code Playgroud) 我通过swift编写应用程序,我需要AES加密和解密功能,我从另一个.Net解决方案接收加密数据,但我找不到要做的事情.
这是我的.net加密:
public static byte[] AES_Encrypt(byte[] bytesToBeEncrypted, byte[] passwordBytes)
{
byte[] encryptedBytes = null;
byte[] saltBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
using (MemoryStream ms = new MemoryStream())
{
using (RijndaelManaged AES = new RijndaelManaged())
{
AES.KeySize = 256;
AES.BlockSize = 128;
var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000);
AES.Key = key.GetBytes(AES.KeySize / 8);
AES.IV = key.GetBytes(AES.BlockSize / 8);
AES.Mode = CipherMode.CBC;
using (var cs = new CryptoStream(ms, AES.CreateEncryptor(), CryptoStreamMode.Write))
{
cs.Write(bytesToBeEncrypted, 0, …
Run Code Online (Sandbox Code Playgroud) 我知道独特的IV在加密时非常重要,可以防止频率分析等攻击.问题:对于AES CBC加密,最重要的是IV?有一个非常明确的答案解释了IV的重要性.
以明文形式发送IV会有任何安全漏洞吗?或者是否需要使用用于发送对称密钥的相同公钥/私钥进行加密?
如果需要加密发送IV,那么为什么不每次都生成一个新的对称密钥并将IV视为密钥的一部分?是否生成对称密钥太昂贵了?还是最小化传输的数据量?
Secret与Non-secret Initialization Vector的最佳答案如下:
典型的密钥建立协议将导致双方计算一个数据,但只有他们都知道.利用Diffie-Hellman(或其任何椭圆曲线变体),所述共享数据片段具有固定长度并且它们不能控制其值(它们两者都获得相同的看似随机的比特序列).
两个实体如何在没有共享信息的情况下导出"相同的看似随机的比特序列"?假设共享信息是加密发送的吗?并且,如果共享信息是加密发送的,为什么不直接发送加密的IV?
因为应用程序需要安全地传输对称密钥,所以将IV与密钥本身分开似乎是一种优化.或者我错过了什么?
在AES加密(.net框架)中,公钥和私钥是如何使用的?
公钥和私钥是否组合在一起形成一个完整的密钥,然后算法使用公钥+私钥来加密数据?
(以下用于示例目的的简化密钥)
例如,公钥= 12345私钥= 67890
所以生成加密结果时使用的密钥是:1234567890
此代码提供无效的AES密钥长度错误.我怎么能纠正它?(我想要128位密钥AES加密)
package org.temp2.cod1;
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import java.io.*;
public class Code1 {
public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {
String s = "9882623867";
byte[] plaintext = s.getBytes("UTF-16");
String s2 = "supernova";
byte[] key = s2.getBytes("UTF-16");
Cipher c = Cipher.getInstance("AES");
SecretKeySpec k = new SecretKeySpec(key, "AES");
c.init(Cipher.ENCRYPT_MODE, k);
byte[] encryptedData = c.doFinal(plaintext);
System.out.println(encryptedData);
}
}
Run Code Online (Sandbox Code Playgroud)
任何帮助赞赏
我正在加密objective-c中的字符串,并使用AES加密Java中的相同字符串,并且看到一些奇怪的问题.结果的第一部分与某个点匹配,但后来却不同,因此当我将Java的结果解码到iPhone上时,它无法对其进行解密.
我正在使用一个源代码字符串"现在然后这是什么废话.你知道吗?" 使用"1234567890123456"的键
加密的objective-c代码如下:注意:它是NSData类别,因此假设在NSData对象上调用该方法,因此'self'包含要加密的字节数据.
- (NSData *)AESEncryptWithKey:(NSString *)key {
char keyPtr[kCCKeySizeAES128+1]; // room for terminator (unused)
bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)
// fetch key data
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [self length];
//See the doc: For block ciphers, the output size will always be less than or
//equal to the input size plus the size of one block.
//That's why we need to add the size of one block here
size_t bufferSize = dataLength + …
Run Code Online (Sandbox Code Playgroud) 我将SQL Server数据库从一个系统复制到下一个相同的设置,但是完全不同的物理机器.我使用Norton Ghost手动恢复文件,例如,重新安装SQL Server 2008 Express后,在c:\ Program Files中找到的整个SQL Server 2008文件夹.
我的一个数据库在其中一个表列上启用了AES_256加密.我重置我的IIS7并试图运行访问数据库的应用程序,检索数据后,我收到此错误:
'/'应用程序中的服务器错误.请在执行此操作之前在数据库中创建主密钥或在会话中打开主密钥.描述:执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.
异常详细信息:System.Data.SqlClient.SqlException:请在执行此操作之前在数据库中创建主密钥或在会话中打开主密钥.
来源错误:
在执行当前Web请求期间生成了未处理的异常.可以使用下面的异常堆栈跟踪来识别有关异常的起源和位置的信息.
我已经完成了一些阅读,并找到了一些关于AES加密如何与机器密钥相关联的链接,但是如何将其复制到新系统却不知所措.或者甚至可能不是这样.
注意:我尝试删除对称密钥,证书和主密钥并重新创建它们.这消除了错误,但是通过AES_256加密的数据没有显示出来.但是,未加密的列可以执行.
任何帮助将非常感激.提前致谢!
aes ×10
encryption ×9
java ×4
cryptography ×2
.net ×1
c# ×1
cryptoswift ×1
ios ×1
iphone ×1
objective-c ×1
python ×1
sql ×1
swift ×1