V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
find456789
V2EX  ›  问与答

什么算法适合加密注册码?最好是比较通用的算法,支持的编程语言多一些,位数短一些

  •  
  •   find456789 · 2021-10-22 13:10:00 +08:00 · 1497 次点击
    这是一个创建于 1121 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我现在有一个注册码明文:

    endTime:2021-12-12 12:12:12@username:qq1234567@startTime:2021-11-11 11:11:11
    

    这个注册码很简单, 包含了开始时间、过期时间、用户名 3 个字段,

    在注册机上,我想用某个算法把它加密,发给客户

    客户再把机密后的注册码输入软件,软件根据某个算法解密,然后判断是否 还能使用


    我研究了一下:

    md5 摘要算法, 破解门槛太低

    其他的一些加密算法,似乎算出来的结果,位数太长了, 动辄位数上百,甚至更长

    我希望加密后的信息,长度尽可能控制在 100 位以内

    不知道大家有啥建议吗?

    这个算法不需要太高级 , 不是什么大软件, 只要能防住一般小白即可

    谢谢

    13 条回复    2021-10-22 16:57:40 +08:00
    horizon
        1
    horizon  
       2021-10-22 13:12:56 +08:00
    MD5 破解门槛低吗。。
    shawnsh
        2
    shawnsh  
       2021-10-22 13:17:50 +08:00 via Android
    MD 5 不是加密算法,因为不能解密
    aggron
        3
    aggron  
       2021-10-22 13:19:42 +08:00
    pbkdf2 或者 bcrypt
    xiaopc
        4
    xiaopc  
       2021-10-22 13:25:47 +08:00 via iPhone
    首先,你这明文要是能在 client 「解密」,就只能用加密而不是摘要算法
    其次,更简单破解的方式不是直接跳过解密吗,再强的算法也不防逆向
    最后,MD5 哪年被「破解」了,最多是彩虹表和对撞
    dilu
        5
    dilu  
       2021-10-22 13:29:02 +08:00
    重要功能放到服务端来做就行,客户端不管怎么搞都没用的
    find456789
        6
    find456789  
    OP
       2021-10-22 13:50:49 +08:00
    @horizon
    @shawnsh
    @xiaopc

    谢谢指点,

    不好意思,我对这方面不太了解,刚才去深入了解了一下,md5 是摘要算法,且不可逆,所以不适合我的场景

    我目前打算选一个 对称的算法 ,具体选哪个,还需要再研究一下

    也可能会选 加盐的 base64, 似乎更简单
    crab
        7
    crab  
       2021-10-22 14:00:37 +08:00
    @find456789 AES,密钥 对方机器码(cpu 硬盘 等等序列号或者用户名)+你自己随便添加一些
    SingeeKing
        8
    SingeeKing  
       2021-10-22 14:11:22 +08:00
    最简单的 异或 轻松防小白
    sadfQED2
        9
    sadfQED2  
       2021-10-22 15:44:18 +08:00 via Android
    其实吧,你随便 aes 加密下就行了,你要是真遇上逆向大佬,用什么加密算法都白搭。

    随便加密下,防防普通人就行了
    sadfQED2
        10
    sadfQED2  
       2021-10-22 15:45:17 +08:00 via Android
    @find456789 base64 肯定不行啊,base64 md5 这些都不是加密
    MatDK
        11
    MatDK  
       2021-10-22 16:19:45 +08:00   ❤️ 1
    如果要 1 个简单算法:
    1. 把 username 扩展到 128 位 (可以用 kdf,偷懒就填充 1/0,或者自己定义 1 个填充得序列,写到程序里面)
    2. 用 AES/ChaCha20 加密
    优点是长度和注册码长度基本一致
    如果要 1 个高级的算法:
    1. 自己生成一对公私钥
    2. 私钥自己留着存好,公钥可以写到程序里面去
    3. 注册码= BASE64[Sign(私钥,注册码明文)+注册码明文]
    验证得时候 Verify (公钥,注册码签名)
    缺点是长度估计超标了
    arthurire
        12
    arthurire  
       2021-10-22 16:39:22 +08:00
    注册码一般都会有一个类似于识别码的东西, 比如把对方硬盘序列号什么的或者配置信息做个加密,比 QQ 好很多,不然其实涉及到泄露隐私的问题,我有注册码就能找到对方 QQ,我觉得挺蠢的.

    也不要想着"通过加解密算法来提升破解难度",不现实,对方把你的 je 改成 jne 或者改成 jmp 你这验证就白做了.对于普通软件而言这个工作我十一二岁就会了,难度非常低.

    @MatDK 说的很详细了. 长度超标问题,大部分软件是靠一个文本文件解决的(改后缀到 xxx.key),或者给你一个窗口让你贴一大段注册码.
    ysc3839
        13
    ysc3839  
       2021-10-22 16:57:40 +08:00
    要验证有效性的话基本都是用非对称加密算法,生成注册码时用你的私钥签名,校验时用公钥验证。
    可以自己看看 RSA 的原理,然后自己写一个,降低密钥长度即可减少生成后的长度,但是会更容易解出私钥。
    另外加长密钥虽然能在算法层面防止破解,但是还是防不了直接修改程序。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   950 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 21:23 · PVG 05:23 · LAX 13:23 · JFK 16:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.