感谢大家的留言,打开了很多思路。 很多人阅读形式是关键词式的, 16位 可逆 加密再加密 密码学。然后就直接回复了。 虽然过年了,对吧。但是这不是娱乐新闻。请不要浮躁对待。不过还是感谢您的留言 增加了热度 :)
这里回应几个关键词:
16位固定长度: 是在 [0,16] 区间内的长度。非 [16,16]
可逆: 我希望以后看到一串乱码我能反推他原来的样子,知道这是哪个网站哪个账号的密码
造轮子: 据我所知目前所有的管理器都是生成随机密码的,并不能自定义根据域名等生成。理由同上
装下整个世界: 10位文本+4位秘钥 = 14位。 16位的容量足够装下14位的世界
加密再加密: 根据规则生成密码只能抵抗脱裤后的批量扫描。
如 域名+用户名+固定字符 的规则--> qquserABC_! 有心人一看就知道规则了。如果你说自己定个规则乱序一下,uAqsBqerC! 或者说错位输入 wwidrtABC_!这样至少一眼瞄过去就不知道了呀。但是这不就已经是 加密再加密了 吗?
我知道自己造密码学的轮子大概率要跪,但我家不是国防部,好比世界上没有撬不开的锁,但你只要比邻居的好就行了。我只想让我的密码 在很长一段时间内 比其他人强那么一些就行了。不用那么极端 需要拿量子计算机来破
最后留下结论。
算法: #12 可以用置换加密;
轮子: #28 已经有了全套轮子。在此感谢 不过他使用的是哈希+随机,是不可逆的。如果想要可逆,只要自己把这部分改成置换加密即可。但是这样改造后不要公开你的代码,因为你的算法已经明文了。
over
1
binux 2019 年 1 月 29 日 via Android 你这 44 位和 16 位,这两个位是同一个量词吗?
|
2
Vegetable 2019 年 1 月 29 日 如果你的用户名是 16 位以上的,比如邮箱
可逆的算法无法稳定的将密文控制在 16 位以内. 可逆没必要吧. btw,很多加密算法要把结果转为 hex,hex 是十六进制,26 个字母都没用全. |
3
flowfire 2019 年 1 月 29 日 via Android 不存在,固定输出长度不可能有可逆
|
5
crab 2019 年 1 月 29 日 取加密后前 16 位
|
8
exch4nge 2019 年 1 月 29 日
想要密文跟明文长度一样的话,用流加密吧,或者用 CTR 分组模式当流加密用也行。具体 node 里什么库,什么函数,我不是特别清楚。
|
9
flowfire 2019 年 1 月 29 日 via Android
@lqzhgood 跟位数是多少没关系,只要长度不可变,就不可能可逆,就好比固定尺寸的盒子不可能装下所有东西,不论这个盒子有多大
|
10
lastpass 2019 年 1 月 29 日
既然已经使用浏览器,不如换个思路?
直接 lastpass 完全随机密码走起。 连我自己都不知道密码,还有比这更安全的吗? 要是在线不放心。可以试试完全本地版 keepass 嘛。 |
11
lqzhgood OP @Vegetable
谢谢提醒~ 我在想是不是自己弄个 密码表 1-0 a-z A-Z 然后乱七八糟的符号加进去~ 弄个 100 进制。 然后想个啥算法把 文本 通过这个 100 进制 映射成 一个密文。 这样应该可以很大程度缩短密文的长度了。 |
12
catror 2019 年 1 月 29 日
没看懂,加密后的密文打算用来干啥?也作为密码用?
如果要长度不变,就用简单的置换加密,规则自己定义。 |
13
ZRS 2019 年 1 月 29 日
密文长度和明文长度一致是可以做到的,流加密就是这样
不过说到底...请使用密码管理软件不要自己造轮子... |
14
lqzhgood OP @flowfire 没搞懂您说的长度不可变啥意思~
我是说 一段 10 个字符长度的文本通过 4~6 个字符的秘钥 生成 0-16 个字符之间密文。 这样的算法。 |
15
reus 2019 年 1 月 29 日
可逆怎么可能限制长度,不要试图挑战香农
|
16
dbw9580 2019 年 1 月 29 日 via Android
|
17
TomVista 2019 年 1 月 29 日
你在密码里固定位置插入固定字符,然后进行一些可逆的骚操作,最后在逆回来,然后去字符串???可以把.
没学过加密. |
18
pabupa 2019 年 1 月 29 日 via Android
原来有好几把钥匙,现在只需要一把! O_o
|
19
ysc3839 2019 年 1 月 29 日
推荐使用 KeePass 密码管理器。比自己实现简单多了。
|
20
sdijeenx 2019 年 1 月 29 日
没必要吧,用随机数代替账号密码不就好了么=3=
我的用户名就是滚键盘按出来的,密码用 keychain 建议密码。 辣鸡箱里随便找的代码片,LZ 拿去玩吧=3= #输出 16 位随机数 import random def getradnstring(a): out = '' for x in range(1,a): out += random.choice('abcdefghijklmnopqrstuvwxyz') return out getradnstring(17) |
21
1010543618 2019 年 1 月 29 日
我都是根据域名生成密码,但改密码新旧密码不能相同就头疼了
|
22
xxgirl2 2019 年 1 月 29 日
ubuntu 自带密码管理器 pass,使用 gpg 加密
|
23
likuku 2019 年 1 月 29 日
想太多,密码学太艰深,即便搞清概念又能怎样?
买个密码管理软件,梳理一遍自己用的密码,每个服务统统换不同的高强度密码。酱紫才能实际解决问题。 |
24
Kagari 2019 年 1 月 29 日 via Android
花密
|
25
2exploring 2019 年 1 月 29 日
想弄出定长的结果,你可以做一次散列(散列的结果够长了吧),然后截取你要的长度就行了。
不过我还是要说,现成的密码管理软件多好,干吗要自己造轮子。。 |
26
ruixingchen 2019 年 1 月 29 日 via iPhone
lastpass 解决问题,或者花蜜也行
|
27
2exploring 2019 年 1 月 29 日
@2exploring 才发现你要可逆的,散列不行,当我没说。。。
|
28
codeklaus 2019 年 1 月 29 日 要是只实现这个想法的话, 异或就行了啊
比如你的密文 0123456789, 随便搞个秘钥 j987, 你就 0123 xor j987, 4567 xor j987, 89 xor j9 这样. 你的文本是多少位密文就是多少位, 然后楼主拿这个密文当密码, 我理解的对不对? 但是还是推荐楼主使用密码管理............ 比如钥匙链这种 |
29
23f0baf3 2019 年 1 月 29 日
https://github.com/emersion/passwordmaker 各种算法都有,还可自行修改结果(替换字符,加前后缀等)
|
30
gam2046 2019 年 1 月 29 日
异或?
密码表? 原文与限定的最终长度太相近,并没有多余的空间来操作了。 |
31
AlphaTr 2019 年 1 月 29 日
好几年前自己有类似的想法,供参考,就是用的哈希算法,不是可逆的; https://blog.alphatr.com/randpsw.html
|
32
shintendo 2019 年 1 月 29 日
楼主,要是有“限制长度+可逆”的加密算法,你首先应该拿来做压缩工具
|
34
kersbal 2019 年 1 月 29 日
为何要可逆。。。另外,一句老话“不要自己写加密函数”
|
37
liberize 2019 年 1 月 29 日
密钥是固定的? RC4 密文长度等于明文长度,由于限制密文是 ASCII 字符,可以 RC4 以后做 BASE64
|
38
liberize 2019 年 1 月 29 日
@flowfire 『就好比固定尺寸的盒子不可能装下所有东西』 信息论大家都学过,就不要卖弄了
楼主说的明文长度也是有限制的,而且比密文还短,他没有要求装下『所有东西』 |
39
Xs0ul 2019 年 1 月 30 日
lz 想把随机生成的密码再次加密,来当做注册用的密码,这其实完全没意义吧?对网站来说还是个随机敲出来的乱码密码
除非你想防的是本地木马破解你的密码数据库 |
41
hearfish 2019 年 1 月 30 日 via iPhone
Aes128, 每个 block 是 128 bit 也就是 16 bytes, 你的密码才 10 位,理论上没问题啊, 只是实际操作上密文可能是诸如 0x10 之类的字符,再转义成可打印的字符就超过 16 位了
|
42
fakeshadow 2019 年 1 月 30 日
我一般是用 bip39,自己的短密码只用来加密产生的私钥
|
43
enjoyCoding 2019 年 1 月 30 日 via iPhone
就不能好好申请嘛 搞这搞着都忘记玩游戏了喂
|
44
dommyet 2019 年 1 月 30 日
openssl rand -base64 16
|
45
weyou 2019 年 1 月 30 日 via Android
如果存在这个算法,那它最大的价值不是加密领域,而是数据压缩领域。
|
46
leavic 2019 年 1 月 30 日 via Android
你这个想法基本等同于靠一个 md5 逆推出一个 iso 镜像
|
47
billwsy 2019 年 1 月 30 日
@codeklaus 我觉得 28#是正解,密钥再扩展一下就能对付任何长度了。。只是,这个算法随随便便就可以被破解,几乎抵挡不住任何 threat model
|
48
lqzhgood OP |
49
strongcoder 2019 年 1 月 30 日 via iPhone
1Password 可以帮你
|
50
yahon 2019 年 1 月 30 日
弄个密码表 再加上一些错位混淆算法 这样就能加密解密了
|
51
bumz 2019 年 1 月 30 日
对抗人眼的话
古典密码学的方法都可以 替换,比如 ROT13,或者和一组只有你知道的固定的随机数做异或 或者置换都能满足你的需求 其实 base64 (编码,非加密)都能骗过人眼(逃 |
52
harde 2019 年 1 月 30 日
用 1Password 等密码管理软件才是正道。
每个站点密码不一样,谁爱撞,谁撞去。 |
53
lcatt 2019 年 1 月 30 日
域名+用户名+固定字符 就很好了,一般忘记密码才是最大的挑战,除了支付及绑定邮箱几个密码外都可以用,防撞库就行,没那么多“有心人”。如果真需要防人眼就再做个异或其他混淆就行。
|
54
hanru 2019 年 1 月 30 日 via Android
与其造一个千疮百孔的破轮子,为什么不使用现成的、漏洞不那么多的密码管理软件?
为什么? |
55
liuzhaowei55 2019 年 1 月 30 日
恩尼格玛密码机,可以符合你的要求,不过他只支持字母,且不区分大小写。
https://zh.wikipedia.org/wiki/%E6%81%A9%E5%B0%BC%E6%A0%BC%E7%8E%9B%E5%AF%86%E7%A0%81%E6%9C%BA 恩尼格玛密码机的一个实现,需要 flash,超级精美,建议大家都看下。 http://enigmaco.de/enigma/enigma.html |
56
woostundy 2019 年 1 月 30 日
学密码学一定要先学信息论呀,单从你这个标题来看,是反信息论基础的
|
57
woostundy 2019 年 1 月 30 日
你这思路是映射,而不是可逆加密。
|
58
Yanni0507 2019 年 1 月 30 日
Abstract:楼主可以用 RC4 或者 RSA 算法来实现。但是它们都对原文有要求,只包含数字和字母的话原文最多 16 个字符,包含扩展 ASCII 表中的特殊字符的话,原文最多 12 个字符。
不管是 AES 还是 RSA 加密出来的直接结果都是 byte[],它们按照通用的规则完全转换成可显示字符的时候都是有 bit 位扩充的。 比如按照十六进制显示,一个 byte 需要两个字符, 按照 Base64 编码,3 个 byte 需要 4 个字符, ASCII 和扩展 ASCII 里面又有太多的不可显示字符。 那么楼主要求密文最多 16 个字符 -> 加密结果最多 12 个字符 -> 原文最多 96bit。 如果能保证原文符合 Base64 要求(大小写字母,数字,‘/’,‘=’),那原文长度最大 16 个字符。 否则最好的情况是按照扩展 ASCII 码表,原文最大长度 12 个字符。 我知道的符合要求的算法还有:RC4,RSA,都不是分组加密算法,原文长度比较随意。具体怎么实现楼主可以放狗搜一下 |
59
yikyo 2019 年 1 月 30 日
不可逆,网上有开源实现,https://github.com/tmthrgd/mpw-js
|
60
yikyo 2019 年 1 月 30 日
补上一句,算法公开,但是加密种子是由用户自定义的。
|
61
zjyl1994 2019 年 1 月 30 日
太复杂了,你这个需求很简单。用不上什么加密算法都,找个哈希就行。
MD5(你的网站名+你的总密码+随便一个什么固定的字符串),然后得到 16 个字符得 HEX 结果,取其中一部分做大小写变换和特殊字符替换即可。 安全性高的狠,给你一个结果,你肯定没法反推总密码。哈希的难度在哪摆着呢 |
62
zjyl1994 2019 年 1 月 30 日
而且我是不明白要可逆的意义在哪里,网站名啥的都是可以公开的,我觉得你亮出来也没问题。
完全可以存起来啊 |
63
libook 2019 年 1 月 30 日
点子不错,不过会不会不同网站对密码格式的限制条件不同呢?
比如有的网站必须包含数字、字母小写、字母大写,但不支持符号; 有的网站要求必须包含数字、字母小写、字母大写、符号; 有的网站要求符号必须多于 3 个; 有的网站要求同一个字符在密码中不能出现超过 4 次…… 这样你的算法要根据不同网站对密码格式的要求切换不同模式。 |
64
imdoge 2019 年 1 月 30 日
https://github.com/ivanakimov/hashids.js
你指的是这种吗? generate YouTube-like ids from numbers |
65
libook 2019 年 1 月 30 日
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/ 这样的,由于这种不可控性使得最终加密出来的密文的长度也是不可控的。 |
66
libook 2019 年 1 月 30 日
接着上面的“碰撞”理论来说,你这个点子虽然新奇,但还是没解决撞库的问题,如果这种算法使用的人多了,那以后撞库的时候也完全可以撞算法,相比之下,不用统一的算法、变量来生成密码既简单又能彻底免疫撞库的情况,何乐不为。
|
67
hujiulong 2019 年 12 月 25 日 偶然看到这个帖,楼主你想要的应该是 Format-preserving encryption(FPE),也就是格式保留加密,例如文本长度是 16,加密后得到的密文长度也是 16
|