相机拍摄的照片的哈希值真的是随机的吗?
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 了解大型系统如何处理熵提取以及它们尝试和防御的攻击。
我目前正在使用网络摄像头拍照,对图像的字节输出进行哈希处理 (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 了解大型系统如何处理熵提取以及它们尝试和防御的攻击。