- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
一直在审查一些对称加密方法,我看到了很多在类中对私有(private)静态变量进行硬编码的示例,通常类似于:
string key = "THISISYOURENCRYPTIONKEY!"
然后再往下的某个地方,代码使用它进行加密/解密。
抛开正确的实现/算法/策略以及存储位置不谈,我有一个简单的问题。 我的 key 的值应该是多少?即我如何生成它?我看到的大多数示例要么使用他们刚刚组成的一些随机句子,要么使用生成字节数组的 .net 类以及返回 byte[] 的加密安全随机数生成器。我用它 byte[] 做什么?我会假设它不应该是一个字节数组,而是一个我可以保存在某个地方的实际字符串(并且可能不在我类(class)的顶部)。
有人可以为我澄清一些基础知识吗?
谢谢!
最佳答案
对于对称加密算法来说,最常需要一个二进制数组作为 key 。它提出了以下问题:
key 应该是随机的。如果不是随机的,就更容易被别人揣摩出来。不幸的是,由计算机生成随机数并不是那么简单。简单的随机生成算法是循环的,周期很短,所以很容易找到用于key的段。有时他们试图从现实世界中获取一些输入作为参数来生成随机数,例如时间(可预测,不安全)来自硬盘驱动器的一些数据,来自网络的数据,让用户输入一些东西等等。这些是或多或少可以预见的事情。也可以购买为此目的而设计的设备,这些设备具有强大的算法和存储良好的种子值,或者它们具有某种粒子检测器,因为这些粒子会随机撞击设备。关键是,如果可能的话, key 必须是不可预测的。
在对称加密的情况下,相同的 key 用于加密和解密。因此,如果要解密数据,则必须至少第二次使用 key - 因此必须以某种方式保留它。保留 key 是危险的,因为其他人可能会得到它。将 key 保存到硬盘驱动器?它适用于非常简单的系统,但很容易找到 key 。 Windows 提供 key storage providers ,并且有许多实现可用。简单的实现将 key 存储在硬盘上,但它是用另一个 key 加密的——当然 key 存储在硬盘上,否则 Windows 将无法为您解密 key 。可以以在启动期间获取“主” key 的方式设置系统,因此管理员必须键入它,然后 key 存储在内存中 - 但管理员必须记住“主 key ”,也许它被写在他钱包里的一张纸上 :) 您也可以购买专为存储 key 而设计的设备,这些设备具有非常复杂的机制来安全地存储 key ,使用专为执行此操作而设计的芯片。这些设备通常可以进行加密/解密,所以 key 不必离开设备——只有当它必须共享时,这在对称算法的情况下是不可避免的。所以这是一个很大的话题,一个人可以花一大笔钱来保护 key ,其他人只是乐于使用 Windows key 存储。
人们无法记住 32 字节的六边形数组,这也是发明 key 推导算法的原因之一。这些获取输入文本并从中生成伪随机数据。当然,此数据不如真正的随 secret 钥安全。您可以使用 rfc2898derivebytes在 .net 中。
这取决于您的使用情况,但最好避免多次使用 key 。通信协议(protocol)在握手期间就新的对称 key 达成一致,并在一段时间后更改 key ,即使它们仍然处于连接状态。这是因为长时间使用 key 意味着 key 存在时间更长(意味着窃取它的时间更长)并产生更多数据,这些数据是分析它并尝试找出 key 的良好输入。此外,如果您使用单个 key 加密所有内容,那么获取单个 key 就足以窃取所有数据。如果有更多的 key ,如果 key 被知道,只有部分数据是危险的。一次pad encryption是唯一无法根据统计分析解密的加密。在该算法中, key 的每一位仅使用一次。
关于c# - 在 C# 中创建我的对称 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30657323/
我需要将文本放在 中在一个 Div 中,在另一个 Div 中,在另一个 Div 中。所以这是它的样子: #document Change PIN
奇怪的事情发生了。 我有一个基本的 html 代码。 html,头部, body 。(因为我收到了一些反对票,这里是完整的代码) 这是我的CSS: html { backgroun
我正在尝试将 Assets 中的一组图像加载到 UICollectionview 中存在的 ImageView 中,但每当我运行应用程序时它都会显示错误。而且也没有显示图像。 我在ViewDidLoa
我需要根据带参数的 perl 脚本的输出更改一些环境变量。在 tcsh 中,我可以使用别名命令来评估 perl 脚本的输出。 tcsh: alias setsdk 'eval `/localhome/
我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Ra
这是我的方法 void login(Event event);我想知道 Kotlin 中应该如何 最佳答案 在 Kotlin 中通配符运算符是 * 。它指示编译器它是未知的,但一旦知道,就不会有其他类
看下面的代码 for story in book if story.title.length < 140 - var story
我正在尝试用 C 语言学习字符串处理。我写了一个程序,它存储了一些音乐轨道,并帮助用户检查他/她想到的歌曲是否存在于存储的轨道中。这是通过要求用户输入一串字符来完成的。然后程序使用 strstr()
我正在学习 sscanf 并遇到如下格式字符串: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); 我理解 %[^:] 部分意味着扫描直到遇到 ':' 并将其分配给 a。:
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
我有一种情况,我想将文本文件中的现有行包含到一个新 block 中。 line 1 line 2 line in block line 3 line 4 应该变成 line 1 line 2 line
我有一个新项目,我正在尝试设置 Django 调试工具栏。首先,我尝试了快速设置,它只涉及将 'debug_toolbar' 添加到我的已安装应用程序列表中。有了这个,当我转到我的根 URL 时,调试
在 Matlab 中,如果我有一个函数 f,例如签名是 f(a,b,c),我可以创建一个只有一个变量 b 的函数,它将使用固定的 a=a1 和 c=c1 调用 f: g = @(b) f(a1, b,
我不明白为什么 ForEach 中的元素之间有多余的垂直间距在 VStack 里面在 ScrollView 里面使用 GeometryReader 时渲染自定义水平分隔线。 Scrol
我想知道,是否有关于何时使用 session 和 cookie 的指南或最佳实践? 什么应该和什么不应该存储在其中?谢谢! 最佳答案 这些文档很好地了解了 session cookie 的安全问题以及
我在 scipy/numpy 中有一个 Nx3 矩阵,我想用它制作一个 3 维条形图,其中 X 轴和 Y 轴由矩阵的第一列和第二列的值、高度确定每个条形的 是矩阵中的第三列,条形的数量由 N 确定。
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我怀疑该值如何存储在“WORD”中,因为 PStr 包含实际输出。? 既然Pstr中存储的是小写到大写的字母,那么在printf中如何将其给出为“WORD”。有人可以吗?解释一下? #include
我有一个 3x3 数组: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; 并想获得它的第一个 2
我意识到您可以使用如下方式轻松检查焦点: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(win
我是一名优秀的程序员,十分优秀!