• 请不要在回答技术问题时复制粘贴 AI 生成的内容
fyyz
V2EX  ›  程序员

SSL 加密通讯与手动调用 AES 库对数据加密通讯有什么区别?

  •  
  •   fyyz · Feb 14, 2017 · 4095 views
    This topic created in 3456 days ago, the information mentioned may be changed or developed.
    有加密传输数据的需求,看了下很多都是使用 SSL 库来实现的,如果我不用 SSL ,而是通过调用诸如 Crypto 这些库加密通讯,有什么区别啊?
    PS :我这里是 TCP 通讯,有自己设计数据包格式,而不是 HTTP 通讯。
    24 replies    2017-02-14 17:11:25 +08:00
    mnzlichunyu
        1
    mnzlichunyu  
       Feb 14, 2017
    如果手动调用 AES 库加密通讯的话, 那你应该还要实现秘钥交换协议,数字签名等等。 实现秘钥交换协议的时候,比如 DH 秘钥交换协议,你还需要实现一些算法,比如生成大素数(64bit 以上)的算法,快速求幂算法等等。我对密码学也不是特别了解,不过感觉自己写的话工作量不小, 安全性也不一定好。
    fyyz
        2
    fyyz  
    OP
       Feb 14, 2017
    @mnzlichunyu 如果我直接把密钥给另一个人,使用客户端前需要提前设置才能通信呢?比如说像 s h a d o w s o c k s 这样的。
    noli
        3
    noli  
       Feb 14, 2017
    SSL 通讯加密,可以在发起链接时通讯双方协商密钥,且保证未获许可的第三方试图攻破密钥是计算上不可能的。

    你说的 AES 自行对通讯保文加密通讯,如果没有理解错的话,应该是指通讯双方事先已经知道共享的通讯密钥。在多次通讯中,这个密钥除非同时改变,否则双方无法通讯。
    一般来说,这样的通讯方式会有以下问题:
    1. 无法知道中间是否有第三者已经攻破密钥并截获通讯双方的内容,发起中间人攻击。
    2. 更换密钥代价大,必须借助其他安全的信道更新密钥(例如通讯双方同时更新软件)
    3. 多次使用同一密钥会使该密钥被攻破的可能性大大增加,尤其是通讯协议是有模式的,可以通过字典攻击倒推出密钥原文。
    firefox12
        4
    firefox12  
       Feb 14, 2017
    @noli 错了 使用 aes 传输同样的数据多次 也不会增加被破解的风险,这是又有初始向量决定的。
    jimzhong
        5
    jimzhong  
       Feb 14, 2017
    AES 是一种对称块加密算法。 TLS 是一个协议。 TLS 的上层协议不需要是 HTTP ,只要 TCP 能承载的 TLS 一般都可以。 shadows 不使用 TLS 的原因是 TLS 握手时证书是明文传输的,容易被识别且开销较大。
    ipoh
        6
    ipoh  
       Feb 14, 2017
    手动调用的方法一般是
    先用 RSA 交换 AES 密钥,之后用 AES 加密通信。
    Ahri
        7
    Ahri  
       Feb 14, 2017
    总结一下就是从 cipher 到 cryptographic protocol 中间还有很多很多步。
    enenaaa
        8
    enenaaa  
       Feb 14, 2017
    没问题, 就像 @ipoh 说的那样先用 RSA 传输对称密钥。 至于防范中间人攻击, 参考 ssl 的校验方法。
    事实上私有协议好多也是自行加密的。
    CRVV
        9
    CRVV  
       Feb 14, 2017
    1. 楼主没说数据包格式要设计成什么样的,如果你把所有东西都设计得和 TLS 一样,那就没有区别
    2. SSL 加上 TLS 有 6 个版本,修了不少漏洞,自己设计一个又有很多漏洞要修
    3. 事先共享密钥的方法不能提供前向安全性, 用 RSA 交换密钥也不行
    4. 这些东西看看维基百科就都知道了

    简单来说,如果对安全性要求高,肯定不会自己手写加密的过程,这玩意太复杂了
    noli
        10
    noli  
       Feb 14, 2017
    @firefox12 如果你说的是 AES 针对选择文本攻击的抵抗能力,这个我是理解的。

    现在我们假设 LZ 的软件只采用一种特定模式的 AES 加密,并且已经分发到了足够多的网络节点上,然后我们在通讯旁路截取数据。

    我们分析这些截取数据可以找到什么规律?
    如果 LZ 仅仅做了 AES 加密的话,基本上我们可以分析出节点通讯的模式。
    譬如是否有类似 Hello 报文,如何响应,
    然后我们可以用重放这些报文,试图更改其中一些内容来验证一下对报文内容的猜测。

    你还觉得这种方式不会泄密么?
    damean
        11
    damean  
       Feb 14, 2017
    @firefox12 不仅有初始向量,切片填充的时候还会填充随机串,使得每次加密的结果都不一样。字典倒推是不大现实了。
    damean
        12
    damean  
       Feb 14, 2017
    @noli 不行的,你相同的文本用 AES 加密每次都出不一样的密文。
    noli
        13
    noli  
       Feb 14, 2017
    @damean

    给定密钥, IV ,和同一种模式, AES 怎么可能加密出不一样的密文?
    你让解密方怎么解?
    firefox12
        14
    firefox12  
       Feb 14, 2017
    @noli iv 不是固定的,你实践一下就懂了。
    noli
        15
    noli  
       Feb 14, 2017
    @damean 来个实例验证吧。

    AES256 CFB

    明文:
    Veni, vidi, vici
    密钥:
    ThePhantomOfTheOperaIsThere
    IV :
    8c 8a 88 6c 24 e7 18 a1 91 7c 20 c4 f8 3e d2 5c
    结果:
    07 22 ff c3 .....

    其他不变,明文换成:
    Very good
    结果
    07 22 e3 cb ....

    注意到重复的 07 22 了吗?

    开头的这一部分,是绝对可以分析的。
    如果恰巧知道报文的前面几字节是例如报文长度这样的信息,是有可能逐步攻破的。
    noli
        16
    noli  
       Feb 14, 2017
    @firefox12

    IV 在实践中的确是不固定的,但通讯双方也需要明文交换 IV 。
    所以你总是有办法让 IV 变成固定的。
    xvx
        17
    xvx  
       Feb 14, 2017 via iPhone
    @damean 我记得 AES 有三种加密模式,有一种貌似相同的文本每次加密都得出同样的报文,不知是否记错了。
    majinjing3
        18
    majinjing3  
       Feb 14, 2017 via Android
    直接用 ssl 来通讯,是没有问题的啊,并不一定是 http 协议, ssl 只是承载数据而已,
    firefox12
        19
    firefox12  
       Feb 14, 2017
    @noli 你每个消息都可以带不同的 iv , 你直接把 iv 发给对方就可以了,让监听的人根据 iv 去破解啊
    noli
        20
    noli  
       Feb 14, 2017
    @firefox12 但实际情况是,中间人不仅仅是监听人,它也可以主动发起通讯啊。
    所以这种情况下,除非设计协议的时候有考虑 IV 部分,不然中间人可以一直用 同一个 IV 来玩啊
    Technetiumer
        21
    Technetiumer  
       Feb 14, 2017
    AES 是对称加密
    RSA 是非对称加密
    如果我没记错, SSL 会用非对称加密协商获得对称加密的密钥,之后使用对称加密传输

    SSL 是标准,就像 JSON
    你可以自定义格式,也可以用 JSON ,或者使用 XML
    你认为是人人都用的 JSON 好,还是自己定一个格式好?
    noli
        22
    noli  
       Feb 14, 2017
    @firefox12

    更高级的玩法是,既然你用的是固定密钥,那我只需要在 可执行映像中找到你的密钥就可以了。
    除非 LZ 能保证,所有分发的软件都是 code sign 保护过的。
    bp0
        23
    bp0  
       Feb 14, 2017 via Android
    自己用 AES ,需要解决两个问题。第一,密钥交换的问题,通常用 RSA 或者 DH 交换密钥。第二就是中间人攻击,通常是使用证书的。
    firefox12
        24
    firefox12  
       Feb 14, 2017
    @noli 纯 aes 都是预设密码的。还有 iv 你可以重用的,但是协议里都有时间戳,防止重放攻击的。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2657 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 46ms · UTC 15:23 · PVG 23:23 · LAX 08:23 · JFK 11:23
    ♥ Do have faith in what you're doing.