Tag: 加密

我需要建议开发敏感数据传输/存储/加密系统

介绍 我目前正在开展一个项目,该项目涉及从VisualFox Pro数据库中每日提取数据(药房记录),并将其中的一些上传到WordPress网站,药房的客户可以安全地查看它。 我想在我的软件的一般方法方面提出一些建议 – 我能够对其进行编码,但需要知道我是否采用了正确的方法。 我正在编写PC软件(在C#/ .NET 4.5中)和PHP WordPress插件。 问题1:加密 我计划使用的加密数据服务器端的当前进程基于本文 。 总而言之,它主张用存储在服务器上的自己的公钥非对称地加密每个单独的用户数据。 然后,用于解密该数据的私钥本身使用用户的密码对称加密并存储。 这样,即使数据库被盗,也需要破坏用户的密码哈希,即使这样,也需要为每个用户的数据重复该过程。 作者本人指出的唯一弱点,以及我的问题的主要观点是,当用户登录时,解密的密钥存储在会话存储中。 文章建议处理它的方式是仅限制用户登录的时间。我认为更好的解决方案是将该密钥存储在短期安全cookie中(当然整个过程通过HTTPS进行) 。 这样,如果攻击者可以控制用户的计算机并且可以读取他们的cookie,他们可能只需键入密码并登录,无需窃取数据库,而即使攻击者获得对服务器的访问权限,他们也无法解密HTTPS流量(或者可以吗?我不确定。) 我应该使用安全cookie或会话存储来临时存储解密密钥吗? 问题2:存储 我还想解决的第二件事是如何存储数据 – 这更像是一个效率问题。 由于每个用户都有自己的加密密钥,因此每个用户的记录必须单独存储。 我不知道是否应该为每个用户存储一个“块”数据,包含带有表示记录的对象数组的加密JSON,或者我是否应该将记录存储在具有实际数据结构的表中,并加密每个数据字段与钥匙分开。 我倾向于将数据存储为一个块 – 在我看来,一次解密一个大块数据比使用数千个单独的字段更有效。 此外,即使我以正确的结构存储数据,我仍然无法使用MySQL的WHERE,ORDERBY等,因为数据都是BLOB。 我应该将数据存储为每个用户的大块,还是分成不同的字段? 问题3:转移 我从DBF文件中提取数据,并基本上形成一个“差异”,从而比较当前提取的数据和最后一天的数据,并只上传已更改的用户的块(我不仅可以上传记录,因为我可能最终将用户的数据存储在块中)。 我还为已被删除的用户添加了“删除”说明。 这是因为数据库中有数十万条记录,总计超过200mb,并且每天都会增加大小。 我目前的计划是将所有这些数据写入JSON文件,gzip并将其上传到服务器。 我的问题是,如何在确保数据安全的同时做到这一点? 当然,上传将通过HTTPS进行,我有一个API密码,只允许授权上传,但我主要担心的是如果服务器受到损害,如何保护数据。 我不希望攻击者只是在处理服务器时从服务器获取JSON文件。 我的一个想法是让服务器向我发送用户的公钥列表,并在上传之前在我的软件中执行加密。 在我看来,这是保护数据的唯一方法。 我可以加密整个JSON文件,可能使用API​​密钥或特殊密码,但如果攻击者可以在服务器上处理解密文件时只是访问解密文件,那就没有实际意义了。 这是一个好的解决方案吗? 我应该在客户端单独加密数据,还是有办法将其安全地传输到服务器并在那里加密? 在此先感谢任何答案,我很想听到之前处理过这类问题的人。 注意: 交叉发布给程序员 ,请参阅注释。

快速安全的加密算法C#

我正在寻找一种使用C#实现的快速安全的加密算法。 我需要能够恢复初始消息。 你有什么建议吗? 谢谢您的帮助!

将包含C中的无符号字符指针的代码移植到C#

我在C中有这个代码,我需要移植到C#: void CryptoBuffer(unsigned char *Buffer, unsigned short length) { unsigned short i; for(i=0; i < length; i++) { *Buffer ^= 0xAA; *Buffer++ += 0xC9; } } 我试过这个: public void CryptoBuffer(byte[] buffer, int length) { for(int i = 0; i < length; i++) { buffer[i] ^= 0xAA; buffer[i] += 0xC9; } } 但结果与预期不符。 根据这个例子,这个: A5 03 […]

具有可导出私钥的证书的“坏密钥”例外

我正在尝试使用非对称加密来加密然后解密文件。 我使用makecert创建了一个测试证书,并将其安装到我的个人localmachine商店中。 将来我必须在几台服务器上安装这个证书,这就是为什么我用“-pe”标志创建它,也就是说,用可导出的私钥创建它。 证书已成功创建和安装,我在mmc中看到“您有一个与此证书对应的私钥”注释。 现在我尝试使用.NET 3.5中的RSACryptoServiceProvider加密数据。 它成功了。 但是当我试图解密它时,我得到“坏键”exception。 如果我创建没有“-pe”选项的证书,相同的代码适用于解密。 这是代码: RSA rsaKey = (RSA)myCertificate.PrivateKey; RSACryptoServiceProvider rsaCsp = (RSACryptoServiceProvider)rsaKey; byte[] plainText = rsaCsp.Decrypt(encryptedText, true); 我还尝试了另一种方法,使用System.Security.Cryptography.Pkcs命名空间: EnvelopedCms envelope = new EnvelopedCms(); envelope.Decode(encryptedText); envelope.Decrypt(); byte[] plainText = envelope.ContentInfo.Content; 结果是一样的……任何人都可以帮忙吗?

C#Web服务中的加密

我正在寻找一种简单的方法来加密我在C#Web服务中的肥皂通信。 我正在研究WSE 3.0,但似乎微软放弃了对它的支持,因此使用它并不简单。 看来WCF可能是一个选项,但我不想从.NET 2.0升级。 任何简单 ,直接的加密方法?

如何为Base64应用填充

当我使用四个字母的单词作为输入时,我有以下代码可以正常工作,例如“测试”。 当输入不是4的倍数时,它会失败例如“MyTest”。 Eexception:Base-64 char数组的长度无效。 质询 是否保证加密结果始终与Unicode字符串兼容(没有任何损失)。 如果是,我可以使用UTF编码而不是Base64? 在编码方面,UTF8 / UTF16和Base64之间有什么区别 如何输入填充以便我们得到正确的结果(解密后),即使输入不是4的倍数? 主要的PRGORAM class Program { static void Main(string[] args) { string valid128BitString = “AAECAwQFBgcICQoLDA0ODw==”; string inputValue = “MyTest”; string keyValue = valid128BitString; byte[] byteValForString = Convert.FromBase64String(inputValue); EncryptResult result = Aes128Utility.EncryptData(byteValForString, keyValue); EncryptResult encyptedValue = new EncryptResult(); string resultingIV = “4uy34C9sqOC9rbV4GD8jrA==”; if (String.Equals(resultingIV,result.IV)) { int x […]

算法 – C#中的RijndaelManaged类是否等同于AES加密?

我问这个问题是为了确认C#中的RijndaelManaged类是否等同于AES加密。 从我读过的内容来看,RijndaelManaged是实现AES加密的首选算法。 有人可以确认一下吗? RijndaelManaged算法可以安全地用于Web项目吗? 谢谢 :)

将IV添加到CryptoStream的开头

我正在现有的文件管理程序中实现本地加密。 我可以找到的大部分示例代码(如Microsoft)都演示了如何直接写入文件,但我需要做的是提供一个在程序中其他地方使用的流: CryptoStream GetEncryptStream(string filename) { var rjndl = new RijndaelManaged(); rjndl.KeySize = 256; rjndl.BlockSize = 256; rjndl.Mode = CipherMode.CBC; rjndl.Padding = PaddingMode.PKCS7; // Open read stream of unencrypted source fileStream: var fileStream = new FileStream(filename, FileMode.Open); /* Get key and iv */ var transform = rjndl.CreateEncryptor(key, iv); // CryptoStream in *read* mode: var cryptoStream […]

在WebApi后端加密Json结果

我用数据描述完成了我的web api,但现在,我必须编写Json结果。 当我在浏览器上放置查询字符串时,现在我有了答案(示例): [{ “SUSPID”: “111”, “IVNOME”: “睾丸中”, “IVMAE”: “睾丸中”, “IVPAI”: “睾丸中”, “IVDATANASC”: “1970年2月7日”, “IVRG”: “0000(IFP)”,“ICPF”:“NãoCadastrado”}] 我无法certificate这一点……我必须表现出(加密):[{“SUSPID”:“AUAUAUA”,“IVNOME”:“UAUAU”,“IVMAE”:“UAUAU”,……] 我看到一些例子,但我找不到一个我需要的东西 我服务的部分代码(Cliente-side): var response = await client.GetAsync(urllink); var JsonResult = response.Content.ReadAsStringAsync().Result; if (typeof(T) == typeof(string)) return null; var rootobject = JsonConvert.DeserializeObject(JsonResult); return rootobject; 在我的控制器(web api BackEnd)中,我返回此数据集: return lretorno.Tables[0].AsEnumerable().Select(row => new Envolvido { SUSPID = Convert.ToString(row[“SUSPID”]), IVNOME = Convert.ToString(row[“SUSPNOME”]), […]

如何在一个程序中使用AES加密,在另一个程序中解密

我被告知不要使用 RSA来加密简单文本,而是使用AES。 我找到了一段简单的代码来实现AES: public static class Crypto { #region Settings private static int _iterations = 2; private static int _keySize = 256; private static string _hash = “SHA1”; private static string _salt = “aselrias38490a32”; // Random private static string _vector = “8947az34awl34kjq”; // Random #endregion public static string Encrypt(string value, string password) { return Encrypt(value, […]