-
Notifications
You must be signed in to change notification settings - Fork 9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
VMess协议的IV长度只能为12个字节,是否会导致安全性问题?能否增加选项设置IV长度? #2130
Comments
其实早该更新了 |
查了下,GCM是推荐使用12B的IV的(参考) |
顺带一提,xchacha20-ietf-poly1305还没咕出来(#1884 |
看了一下,你发的这个issue链接里面已经写了xchacha20-ietf-poly1305出来了,最后一条comment。见此
另外,刚翻到这个帖子说 XChaCha20-Poly1305-IETF 是在chacha类算法中当前唯一推荐的算法 |
这个问题不能这么想,就好比AES虽然固定 128 bits block,但key size可以是 128, 192, or 256 bits ,不能说更长的 key size 就没有意义了。 对于GCM推荐使用12B的IV这点,要分情况讨论。正如这里所说,如果采用临时或短期密钥,即使8B的IV也是安全的。但是VMess应该是采用了长期不变的密钥,一旦config配置好了就不变了,这样的话,只要传输64GB以上的内容将会导致碰撞,以致基于计数器模式下的算法完全丧失安全性。 这是目前我的理解,如有不对之处请见谅。 |
@poly-1 是 Golang出了,v2ray还没整( |
@poly-1 这个问题不能这么看。
而IV的作用则是简单地跟加密前的前16B数据异或,防止相同的明文得到相同的结果。更长或者更短的IV不太清楚是怎么处理的,但是估计大同小异?
这个倒是有可能碰撞,不过这样算的话,需要发送2x10^17次数据包才可能出现重复,概率还是蛮低的? |
@kotori2 原来密钥长是为了迭代轮数:thumbsup: 不过计算碰撞的话,一般是看这个概率表 为了避免碰撞,通常希望概率在10^-18到10^-15,
如果采用12B,保证碰撞概率在10^-15以下大概需要1.3*10^7个数据包 这样看来似乎即使当前使用12B,安全性也还不错,不过不知1.3*10^7个控制指令的数据包大概对应实际情况的多长时间或是多少数据流量? 另外,你所说的“数据加密用的key是随机生成以后包含在控制指令里”这个有相应的协议文档吗?还是读源码读到的? |
|
@kotori2 没有吧,我们的最终目的是使IV不重用(因为在计数器模式下重用会基本完全丧失安全性,从这个角度来说CFB反而好一些,不过由于CFB不能抗干扰,所以不能用)。 而要计算IV是否reuse的概率,其计算方法跟 hash collision 的方法我觉得应该是一致的?所以我给出了那张概率表 |
12b=96bits 64g是一次输入的数据的大小 超过了之后不太安全. 不是总共所有人跑个64g就爆表了. 有没有高人去看看go那个源码 内部块计数器限制是不是也是32bit的.? |
@poly-1 我还是觉得,对于数据块的IV不用担心重用碰撞问题。 |
每次握手换一次,取决于客户端的buffer以及你发送/接收的数据大小。
这里的64G是不更换数据加密key的前提的,因为每次握手的数据加密key是不一样的,所以没意义。
跟CTR一样,把IV+Counter变成真IV。只是GCM最后多了个MAC
https://golang.org/src/crypto/cipher/gcm.go L340
应该就是32b
https://github.com/jedisct1/libsodium/blob/master/src/libsodium/crypto_aead/aes256gcm/aesni/aead_aes256gcm_aesni.c#L604 |
如你所说 这指令部分的iv竟然就是时间的MD5. 这真的安全么!!! |
因为重用的几率太小了(除非你设备时间错乱了而且正好跟你上一个包同一毫秒发送的),所以很安全。
不过概率还是很小就对了 |
如果有人搞碰撞 用机器生成呢? 这样会不会有影响. |
首先对于GCM来讲,不能通过修改iv的方法来使明文发生变化,因为GCM TAG有校验(建议自己Google) |
IV 在 vmess里 是 算出来的 不是 直接传输的,作者肯定考虑到了这一点 |
VMess 使用的加密方式(AES-GCM、AES-CFB、CHACHA20)暂时都没有已知的破解方法。这里的不能破解指的是,即使同时拿到了加密前和加密后的文本,也无法得到密钥。再多的文本也没用。 前向安全性 目前只有 TLS(和其它基于 TLS 的协议)实现了前向安全性,VMess 和 Shadowsocks 都不具有这一特性。VMess 不添加这个特性的原因是:
|
@kotori2 仔细看了一下,你分析的很对。数据块的IV和key都是随机生成的话,确实就安全很多了,可以说当前可以无需担心其安全性(不过隔多久更换随机key和IV可能是个问题?) 现在短板在于指令部分的安全性,指令部分现在的实现有利有弊吧,利是用了cfb而不是ctr等计数器模式,抗iv重用要强一些;弊是没有用aead不能防篡改。 |
@poly-1 vmess 的指令部分有 FNV1a 效验,篡改要如何实现? |
This issue is stale because it has been open 120 days with no activity. Remove stale label or comment or this will be closed in 5 days |
如题,VMess协议现在默认的加密方式为AES-128-GCM与ChaCha20-Poly1305,两种方式的IV均为12字节。他们的本质为AES-CTR,即计数器模式,必须保证IV不能重用。因为对于CTR而言,重用IV会导致完全失去安全性,详见维基百科-分组密码工作模式
对于Shadowsocks,现已采用16字节甚至24字节的IV长度(例如SS中的xchacha20-ietf-poly1305)以解决这个问题,讨论的地方在此。
我看了一下VMess协议细节(https://www.v2ray.com/developer/protocols/vmess.html), 现在两种方式——AES-128-GCM与ChaCha20-Poly1305的IV均为12字节,长期采用同一密钥容易发生碰撞。
是否需要更改一下VMess协议的实现?毕竟增加IV长度不难
The text was updated successfully, but these errors were encountered: