[加密算法] 有没有可以 ‘限制密文长度’ 且 ‘可逆’ 加密算法?

2019-01-29 16:07:24 +08:00
 lqzhgood
steam 账号丢了~ 我估摸着是撞库。
用 算法 代替 密码 的想法由来已久了,是时候行动了。

大致想法如下:
域名 /用户名等----------算法--------->密码----------- [秘钥 + 加密算法] ---------> 密文

虽然通过算法生成后的密码已经足够好了(至少不会被撞库),但是还是想一步到位。再用一个加密算法加固下。

因为准备再写一个 Chrome 扩展来解决密文生成的问题,所以准备用 js 现实,看了下 node 的库 cryptojs。
但是 AES 4 位秘钥 10 位密码 生成的密文 高达 44 位。。。。
一般密码填写仅允许 16 位。

实在对密码学不了解。。。。

在这里求一个
4~6 位秘钥 + 10 位左右文本 生成的密文长度能在 ‘ 16 位’ 以内的 ‘可逆’ 加密算法。。。
10988 次点击
所在节点    程序员
68 条回复
zjyl1994
2019-01-30 11:34:40 +08:00
太复杂了,你这个需求很简单。用不上什么加密算法都,找个哈希就行。
MD5(你的网站名+你的总密码+随便一个什么固定的字符串),然后得到 16 个字符得 HEX 结果,取其中一部分做大小写变换和特殊字符替换即可。
安全性高的狠,给你一个结果,你肯定没法反推总密码。哈希的难度在哪摆着呢
zjyl1994
2019-01-30 11:37:12 +08:00
而且我是不明白要可逆的意义在哪里,网站名啥的都是可以公开的,我觉得你亮出来也没问题。
完全可以存起来啊
libook
2019-01-30 12:26:10 +08:00
点子不错,不过会不会不同网站对密码格式的限制条件不同呢?
比如有的网站必须包含数字、字母小写、字母大写,但不支持符号;
有的网站要求必须包含数字、字母小写、字母大写、符号;
有的网站要求符号必须多于 3 个;
有的网站要求同一个字符在密码中不能出现超过 4 次……

这样你的算法要根据不同网站对密码格式的要求切换不同模式。
imdoge
2019-01-30 12:35:33 +08:00
https://github.com/ivanakimov/hashids.js
你指的是这种吗? generate YouTube-like ids from numbers
libook
2019-01-30 12:44:03 +08:00
Node.js 官方有 crypto module,基本上就是字符串转 Buffer,然后加密和散列,很方便,可以直接用。

https://nodejs.org/api/crypto.html

密码验证的原理根本上是碰撞,即你输入的密码(最终处理成的数据),和设置的密码(最终处理成的数据)一致,则认为验证通过。所以“可逆”并不是一个必须条件,除非你有其他的用途需要加密后的密文还能直接还原成原文。

因为加密算法是要在原有数据上“加”密,所以加密后的密文的大小一定是大于等于原文的,你也可以使用压缩算法,比如你加密后的密文是 0-9、a-f,36 进制,然后你可以把它映射成 0-9、a-f、A-F、~!@#$%^&*()_+`-={}[]:;"'<,>.?/|\这些,94 进制,这样你的密文可以无损缩短长度,由于无损压缩,所以可以完美还原,但也还是有限的,如果你的原文中有不可控长度的变量,比如网站域名,有 t.cn 这种的,也有 http://www.thisisthelongesteuropeandomainnameallovertheworldandnowitismine.eu/ 这样的,由于这种不可控性使得最终加密出来的密文的长度也是不可控的。
libook
2019-01-30 12:47:43 +08:00
接着上面的“碰撞”理论来说,你这个点子虽然新奇,但还是没解决撞库的问题,如果这种算法使用的人多了,那以后撞库的时候也完全可以撞算法,相比之下,不用统一的算法、变量来生成密码既简单又能彻底免疫撞库的情况,何乐不为。
hujiulong
2019-12-25 15:41:15 +08:00
偶然看到这个帖,楼主你想要的应该是 Format-preserving encryption(FPE),也就是格式保留加密,例如文本长度是 16,加密后得到的密文长度也是 16
sgwk
2022-09-27 19:35:27 +08:00
@hujiulong 他应该找到就是 fpe

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/531620

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX