在OAuth中,Nonce用于防止重放攻击。除了nonce之外,还使用时间戳(并且可以被认为是第二个nonce,因为,当严格遵守规范时,没有考虑有效请求的时间帧 - 服务器可以,但不一定要限制范围)。
在实施OAuth-Client时,我想到的问题是:Nonces必须在加密方面是否安全?
这里有两点对我很重要:
使用/dev/urandom
而不是/dev/random
是否可以使用/dev/urandom
并且如果在很短的时间内创建了许多随机数时系统的熵不足,则会产生可预测的值?
(对于那些不熟悉random / urandom的人来说:这会有一个性能上的优势,因为{{1}}在安全性成本很小的情况下不会阻止调用,当然,值不是随机的)
由于nonce必须编码才能发送,如果它们包含非ASCII字符,那么最简单的方法就是从那些可以按原样发送的ASCII字符中创建它们([0-9A- Za-z _- +〜] AFAIR)。当然,这再次限制了熵,因此随机数的长度也应该更长。在你的意见中,nonce的合理长度只包含那些字符,是否值得不用编码?
答案 0 :(得分:1)
通常,使用/dev/random
代替/dev/urandom
几乎没用。如果您不希望PRNG依赖/dev/urandom
,您可以使用它来播种其他PRNG。对于nonce来说,使用/dev/urandom
肯定会更好。或者,您可以使用在您的应用程序或库中实现的良好种子,线程本地加密安全PRNG。
如果要通过ASCII发送随机数(或大多数二进制数据),则可以使用hexadecimals或base 64。为了获得值本身的最佳可读性,请使用hex,以提高效率使用base64。现在默认情况下,base 64使用数字,大写和小写字母,加上字符+
,/
和=
但是如果你想使用其他值,你可以随时对base64进行URL编码,替换您不想要的字符,或使用one of the variants。