问题标签 [entropy]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
php - 帮助计算(和有用)密码熵
这是一个两部分的问题:
第1部分
首先,处理在 PHP 中计算密码的熵。我一直找不到任何在经验上合理的代码示例,并且真的希望在找到计算最终数字的“正确”方法方面得到一些帮助。网上很多人都有自己自制的加权算法,但我真的在寻找方程的科学答案。
我将使用密码熵作为更大安全系统的一部分,并作为一种分析我们整体数据安全性的方法,该方法基于用户密码被泄露时可访问的信息以及密码被暴力破解的难易程度。
第2部分
这个问题的第二部分是:这个数字到底有多大用处?我的最终目标是为系统中的每个密码生成一个“分数”,我们可以用它来监控我们作为一个动态实体的整体系统安全性。对于字典攻击、l33t 替换密码等,我可能不得不使用另一种或两种算法——但我确实认为熵将在这样的“整体”系统评级中发挥重要作用。不过,我确实欢迎对其他方法提出建议。
我知道的
我已经看到一些提到对数方程来计算所述熵,但我还没有看到一个实际上不是写成数学方程的好例子。我真的可以使用一个代码示例(即使不是严格使用 PHP)来让我继续前进。
扩大
在发表评论时,我意识到我可以更好地解释这个计算的有用性。当我在用户密码极弱的遗留系统上工作时,我必须有一些具体的证据证明该弱点,然后才能提出强制所有用户将密码更改为新(强制)强密码的理由。通过为系统中的每个用户帐户存储密码强度分数,我可以建立几个不同的指标来显示整个系统的弱点并为更强的密码提供理由。
TIA
random - 熵源的安全混合
让我们假设我们正在生成非常大的(例如 128 或 256 位)数字作为分组密码的密钥。
让我们进一步假设我们戴着锡纸帽子(至少在外面时)。
如此偏执,我们想确定我们可用的熵,但我们并不完全相信任何特定的来源。也许政府正在操纵我们的硬币。也许这些骰子的权重如此微妙。如果输入的硬件中断/dev/random
有点过于一致怎么办?(除了偏执之外,我们很懒惰,不想手动生成它......)
所以,让我们把它们混合起来。
执行此操作的安全方法是什么?大概只是连接来自每个源的几个字节并不完全安全——如果其中一个源有偏差,理论上它可能会导致诸如相关密钥攻击之类的事情。
在连接的字节上运行 SHA-256 是否足够?
(是的,很快我会拿到一份 Cryptography Engineering 的副本。:))
windows - CryptGen随机熵
CryptGenRandom 是 Windows 中 CryptoAPI 中的随机数生成器函数。那个随机数发生器有多少熵?我已经看了很多,但我找不到它。
random - 快速、安全的随机数
/dev/urandom
当我偶然发现这个有趣的花絮时,我正在寻找一种更快的替代方法:
生成非常好的非随机但几乎随机位的一个好技巧是使用 /dev/random 的熵来播种快速对称流密码(我最喜欢的是河豚),并将其输出重定向到需要它的应用程序。
这不是一种初学者技术,但使用两行或三行 shell 脚本和一些创意管道很容易设置。
Schneier 对安全性的进一步研究得出了这样的评论:
如果您要“注入熵”,有很多方法可以做到这一点,但更好的方法之一是将其“传播”到高速流密码中,并将其与非确定性采样系统相结合。
如果我错了,请纠正我,但这种生成随机位的方法似乎比/dev/urandom
速度和安全性要好。
所以,这是我对实际代码的看法:
此速度测试需要 400MB 的零,并使用带有由伪随机可打印字符组成的 448 位密钥的河豚对其进行加密。这是我上网本的输出:
400+0 条记录 400+0 条记录 419430400 字节 (419 MB) 复制,14.0068 秒,29.9 MB/秒
真实 0m14.025s 用户 0m12.909s 系统 0m2.004s
那太棒了!但它有多随机?让我们通过管道将结果发送到ent
:
熵 = 每字节 8.000000 位。
最佳压缩会将此 419430416 字节文件的大小减少 0%。
419430416 个样本的卡方分布为 250.92,随机超过该值的概率为 50.00%。
数据字节的算术平均值为 127.5091(127.5 = 随机)。Pi 的 Monte Carlo 值为 3.141204882(误差 0.01%)。序列相关系数为 -0.000005(完全不相关 = 0.0)。
这看起来不错的样子。但是,我的代码有一些明显的缺陷:
- 它
/dev/urandom
用于初始熵源。 - 密钥强度不等于 448 位,因为只使用可打印字符。
- 密码应定期重新播种以“散布”熵。
所以,我想知道我是否走在正确的轨道上。如果有人知道如何修复这些缺陷中的任何一个,那就太好了。另外,如果不是/dev/urandom
、sfill
、badblocks
或 DBAN,您能否分享您用来安全擦除磁盘的内容?
谢谢!
编辑:更新代码以使用河豚作为流密码。
random - 嵌入式系统上“唯一性”/熵的来源
我有一个嵌入式系统。我希望它在开机或以其他方式重置时执行的操作是生成唯一 ID,以便在不同的重新启动时以高概率生成不同的唯一 ID。
它无法访问实时时钟,但可以访问 ADC 和 UART。我想知道是否有一种不错的方法可以从这些来源收集熵以生成唯一 ID。我对Yarrow依稀熟悉。有没有使用这个的好方法?
不幸的是,我没有任何可预测特征的噪声源;ADC 连接到多个相对低噪声的输入,所以我想我可以只使用 ADC 的最低有效位作为输入。
编辑:物有所值,这是 TI TMS320F28335 处理器。
更新/澄清:我正在寻找一种收集熵的软件方法。我找到了另一种方法来解决我的问题,所以在某种程度上,我的问题是一个有争议的问题,但我仍在寻找有关特定软件解决方案的指导,以从低熵源(如 ADC 和系统的最低有效位)收集熵接收UART字符的时间。
c++ - 图片熵计算
我的录音机遇到了一些令人讨厌的问题。有些人仍在将它与模拟调谐器一起使用,如果没有信号存在,模拟调谐器倾向于吐出“雪”。
问题是,当噪声被输入编码器时,它会变得非常疯狂,首先消耗所有 CPU,然后最终冻结。由于记录器的要点是无论如何都要保持正常运行,因此我必须弄清楚如何进行此操作,因此编码器不会暴露于它无法处理的数据。
因此,想法是创建“熵检测器”——一个简单而小型的例程,它将遍历帧缓冲区数据并计算熵指数,即图片中的数据实际上是如何随机的。
例程的结果将是一个数字,0 表示完全背面的图片,1 表示完全随机的图片 - 雪,即。
例程本身应该只是前向扫描,很少有局部变量可以很好地放入寄存器。
我可以使用 zlib 或 7z api 来完成这样的任务,但我真的很想自己做饭。
有任何想法吗?
algorithm - 随机拍摄之间的用户延迟是否对 PRNG 有很好的改进?
我认为,为了随机选择播放器中的下一首曲目或浏览器中的下一页,可以将时间用作“自然现象”,例如体面的 RPNG 可以在没有程序请求的情况下连续获取下一个随机数(对于例如在一个线程中每隔几毫秒或更频繁地发生事件)并且当时间到来时(基于用户决定),选择自然会受到此用户延迟的影响。
这种方法是否足够好,如何进行测试?手动测试的问题是我不能在现实世界中等待那么长时间来保存足够的随机数来将它们提供给一些测试程序。任何人为的加速这一过程的尝试都会使该方法本身无效。
谢谢
entropy - 互信息计算
假设 M 是一组对象 m,每个对象具有属性 X 和 Y。现在如果 X 和 Y 对于给定的 m 只能有一个值(即 X,Y 是随机变量,P(X=x_i|M=m_i),P( Y=y_i|M=m_i)),可以计算X和Y的互信息。但是如果X可以同时有多个结果呢?即 m_3 X={x1,x2} - 通常 X 的结果是所有可能结果的子集。在这种情况下,是否可以测量互信息或其他某种依赖度量?
是否可以将 X 拆分为二进制随机变量 X_1、X_2 等,其中 X_1=1 iff X 包含 x1,否则 X_1=0,然后为所有组合 i,j 计算 I(X_i,Y_j) 并按顺序汇总信息得到 I(X,Y)?
谢谢。
例子:
ruby - 使用 Ruby 和 imagemagick 获取或计算图像的熵
如何在 Ruby 中使用 imagemagick(最好是 mini_magic)找到“熵”?我需要这个作为一个更大项目的一部分,在图像中找到“有趣”以便裁剪它。
我在 Python/Django 中找到了一个很好的例子,它给出了以下伪代码:
这将转化为公式entropy = -sum(p.*log2(p))
。
我的问题:我对 Django/Python 代码的解释是否正确?如果有的话,我如何在 ruby 的 mini_magick 中获取直方图?
最重要的问题:首先,这个算法有什么好处吗?你会建议一个更好的方法来找到图像(部分)中的“熵”或“变化像素的数量”或“梯度深度”吗?
编辑:使用下面答案提供的资源,我想出了工作代码:
其中 image_data 是一个RMagick::Image
.
这在smartcropper gem中使用,它允许使用例如回形针对图像进行智能切片和裁剪。
windows - Windows 上有哪些熵源?
我想在 Windows 上生成一个随机加密密钥。我在哪里可以获得熵?
我希望我的熵函数在没有网络连接的情况下工作,并且在 Windows 2000 及更高版本上可靠。即使可能提供或不提供少量熵的源也可能有用,因为所有源都将被汇集。
这是我最初的功能列表:
GetCurrentProcessID、 GetCurrentThreadID、 GetTickCount、 GetLocalTime、 QueryPerformanceCounter、 GlobalMemoryStatus、 GetDiskFreeSpace、 GetComputerName、 GetUserName、 GetCursorPos、 GetMessageTime、 GetSystemInfo、 CryptGenRandom、 GetProcessHandleCount、 GetProcessMemoryInfo。