相机拍摄的照片的哈希值真的是随机的吗?

Is a hash from a picture taken from a camera truly random?

我目前正在使用网络摄像头拍照,对图像的字节输出进行哈希处理 (sha-512)。那是一个“真正的”随机数发生器吗?在 ent 测试中,它表现不佳。我怀疑这是因为它没有任何特殊字符,只有字母和数字。哪种哈希算法比 sha-512 更适合此问题?
这是我的代码:

import cv2
import hashlib

webcam = cv2.VideoCapture(0)
check, frame = webcam.read()
framebytes = frame.tobytes()
hash = sha512(str(framebytes).encode('utf-8')).hexdigest()

(这里说的是hash
我目前在网络服务器(烧瓶)中使用它,所以我无法提供字节(尝试随机 api,用作种子)

如果你真的想这样做,那么你的代码基本上是正确的。除了:

  • 从字节到字符串再转换回来是没有意义的
  • 直接请求摘要,而不是它们的十六进制表示

例如:

from cv2 import VideoCapture
from hashlib import sha512

webcam = VideoCapture(0)
check, frame = webcam.read()

if not check:
  raise ValueError("Unable to read a frame")

digest = sha512(frame).digest()

也就是说,使用 os.urandom, or a wrapper like SystemRandom 并让 OS 处理事情会更好。此服务受 OpenSSL 等程序的信任,应该比您尝试执行的操作更可靠。

如果你真的想使用网络摄像头,我建议将熵混合到系统中,同时仍然使用 urandom 来获取随机值。请注意,在 Linux 下,您可以将来自网络摄像头(甚至原始网络摄像头数据)的散列字节写入 /dev/random,以加密方式将其合并。

如果您真的想自己动手,我建议您查看 Fortuna PRNG 了解大型系统如何处理熵提取以及它们尝试和防御的攻击。