我有一个系统,我应该为用户生成一个秘密令牌。令牌的存在足以授予对某些与用户相关的数据的访问权限。
我正在从加密安全的随机数生成器中生成一个4096位令牌。在内部,我将令牌处理为字符串,编码为十六进制。令牌使用SHA-256进行散列,并且存储在数据库中,表示令牌的十六进制字符串被发送给用户,并且从不存储。
当用户显示令牌的十六进制字符串时,我计算它的SHA-256散列并查找它。
问题是:我是通过计算十六进制编码字符串的SHA-256与计算原始字节有效负载的散列来牺牲某些东西吗?我是用Go编写的,所以我真的在计算[]byte(str)的SHA-256散列,它将字符串转换为字节数组。
我有一种感觉,也许我把苹果和橘子比作西瓜。
我是否应该从用户那里获得十六进制编码的字符串,将其转换为字节数组,使用SHA-256进行散列,然后使用它呢?
问题1-a:如果是base64url而不是十六进制,事情会改变吗?
发布于 2021-02-12 16:05:50
编码不会改变熵源的输出。它们是可逆的操作。您可以使用适合您的编码,更改为base64进行传输,并在数据库上进行强传输,而更改为字节是一个很好的选择,因为密码散列函数通常接受字节来处理,所以在应用SHA-256之前最好将它们转换成字节,这样您就可以从SHA-256的速度中获益。Base64或Hex可能需要更多的时间来散列相同的数据,这是因为长度的增加,即Base64中的~3n/4和n字节的2n。
如果CSPRNG有很好的熵,那么你甚至不需要SHA-256,或者至少4096位令牌,散列源的输出是个好主意,但是,如果源需要4096位才能产生良好的256位随机性,那么可能会出现问题。然而,这确实取决于您的CSPRNG。
https://crypto.stackexchange.com/questions/88203
复制相似问题