V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  ysmood  ›  全部回复第 1 页 / 共 15 页
回复总数  296
1  2  3  4  5  6  7  8  9  10 ... 15  
12 小时 51 分钟前
回复了 0o0O0o0O0o 创建的主题 分享创造 vaultwarden 备份思路之再也不改版
@kuanat 可以试试这个,比 gpg 更简单方便 https://github.com/ysmood/whisper
@chaoschick 这种工具之所以存在就是因为现有的很多系统功能不全,且不愿意花时间改进,比如 V2EX 就没法私信,这个时候有这种工具就会方便点,你如果不用类似工具,请问 v 站里两个陌生人在不暴露自己隐私的情况下如何交换邮箱互加好友?你可能可以,但是会很麻烦
@chaoschick 你可以看看 age 这个工具 https://github.com/FiloSottile/age 被非常多的库依赖了,你可能不太能理解它的用途,但事实上用的人非常多。
> 第二个问题,似乎你没有理解第一个攻击例子的场景:A 要和 B 说话,B 选择去听任何人的话,M 达成的效果是 M 不知道 A 想说什么,但是让 B 以为 M 说了 A 本来要说的话。B 是用 M 的公钥验证的。

你都不在乎谁发给信息了如何防止中间人攻击?

> 通行的做法是归约,你的算法可以看作某种安全性的 KEM 和 CPA 安全的私钥加密和签名的复合,无法推出第一个例子下的安全性。

就和你说的一样,这不是 whisper 想要解决的问题,这更像是 ssl 之类的需要考虑的问题。使用 whisper 的人大大概率不会考虑中间人攻击的问题,所以 sign 是可选的否则我就设置成必选的了。
@Senorsen #22

> 谢谢回答,不过我的问题在于,只使用“加密”是不需要私钥的,只需要拉取 GitHub 上目标用户的公钥,因此无条件启动 agent 的行为比较怪。

多谢,这是个很好的建议,我把它改成只有需要的时候才启动好了。
加 sign 或者解密的时候都需要 passphrase ,非常常用。我建议是即使是发送的时候也加个 sign ,更安全。
@geelaw #25

> 但是这会导致没有选择超过 128 位密钥的意义,限制了最大安全性。

openssl 默认用的 128bit ,在 whisper 的使用场景已经够安全了,因为这个 aes key 只会被使用一次就扔了。我加了个选项: https://github.com/ysmood/whisper/blob/86d93ffbb3897d1739664da5597f6b85d1045be4/lib/piper/encodings.go#L74-L75

> 第二个问题,对密文签名只能保证密文“被谁同意”,不能保证明文来自于谁,也不能保证密文在加密结束之后没有被“有意义地修改过”,后者是选择密文安全性的要求。

whisper 没有这个问题,readme 里已经说明了 sign 验证需要显示声明发件人的 github id 用以验证,否则你就不在乎被篡改。你不可能再签名的,验证会失败。

> 除非收信人只收取某个特定的人(以签名所用的公钥识别)的信息(因此 M 重新签名不会被接受),否则上述场景可以成立。

和上一个问题一样。

> 但如果收信人只收取特定的人的信息,则没必要每次通信都用公钥加密。

这也不是安全问题,只是某种大部分人不在乎的性能优化,whisper 的使用场景是单次的无状态通信。
168 天前
回复了 LonnyWong 创建的主题 程序员 我把开源 README 又改成英文了
还是依赖了 ssh-agent 服务吗?也就是如果没装 ssh 就没法用 agent 吗?
@geelaw #24

> 你的第一段回复表明确实弄混了块长度和密钥长度,AES 的块长度永远是 128 位,密钥有三种长度。不存在“选择”块长度这种操作,因为没的可选。

我意思是保证不论使用什么长度的 secret ,最终都是使用 AES-128 ,这是 golang 的标准库规定的用法。抱歉没有很专业的表达我的意思,我这里并不在乎块的长度。所以我这个操作又安全风险吗?


> 第二段回复表明没理解什么是选择密文安全性。把公钥加密和 AES 以 OFB 模式(不是选择密文安全)结合时当然不可能期待选择密文安全性。

抱歉我理解错了你的意思,你意思就是信息可以被篡改吧?这个攻击又不可以破解具体内容。whisper 不是提供了 sign 吗,文档里最后有提到 sign 的用法,如果你觉得你的数据有被中间人篡改的风险,用 whisper 的 -s 参数就行了。
@Senorsen 感谢试用!

> ssh 密钥确实也是个问题

关于选哪个 ssh 密匙一般不存在问题,大部分人机子里都有。而且可以加冒号选择某个 ssh pub key ,比如 "@ysmood:abc"

> 这密文还挺长的

密文已经很短了,你看 gpg 生成的比这可能长几倍。同类工具这个应该是最短的。

> 请教下为啥需要一个 background agent ?

因为 private key 通常是一个文件,任何系统里的 app 都可以读取到这个文件,这很不安全。所以一般都会用一个 passphrase 加密这个 private key ,只有用的时候才解密到内存里使用,这样任何系统里的 app 都没法获取真正的 private key 。但这会引入一个新问题,每次都输入 passphrase 非常麻烦,所以一般加密工具都会提供一个 agent 来缓存 passphrase 到内存,比如 ssh-agent ,这样只有重启电脑的时候才需要再输入一次。

这是一个非常通用的技巧,Apple 的 Touch ID 也是这样的,只不过它用了一个专用 chip 来缓存,掉电了就得重新输入 passcode 。
@lambdaq 不用这么麻烦,这样就够了 https://github.com/ysmood.keys
@equationzhao 我试了下 warp 我也是 mac ,没有任何问题,可以正常输入 passphrase ,你用的是 zsh 吗?

可以通过

echo $0

来看用的什么 shell 。
抱歉订正下:公钥,不是公式
@galenzhao 很容易呀,那你就把第 1 个公式当成通用的公式呗,只需要把它的密钥拷贝到所有的机器上就够了。

就相当于你每台机子都要登微信才能用微信一样的道理,你至少要有一个密钥是所有的电脑上才都有的你才能方便别人给你发私信,不管你用什么工具都是一样的。
@geelaw 要说 whisper 代码里最有争议的地方,应该是 ed25519 转 ecdsa 的安全性问题。目前没有太好的办法,推荐加密还是用 ecdsa 比较好,ed25519 只用于签名。

https://github.com/ysmood/whisper/blob/0e43607cd36c869bdaa9a03f63701eb5603ffec3/lib/secure/key.go#L267

要是能帮忙把这个问题解决了那就厉害了。
@geelaw 我看了下 golang 的 rsa.EncryptOAEP 感觉也足够安全了,不太需要再做额外的优化了。
@galenzhao

> 不过像我这个有一堆公钥在的 ,不太好整

whisper 已经解决这个问题了,它可以自动选择密匙,也支持公钥过滤。原理在于它 embed 了 公钥的 hash 到加密后的内容,你可以试试。

比如这是用你的第三个公钥加密的信息,你直接可以用 whisper 解密,不需要任何配置:

echo 'hi' | whisper -b -e @galenzhao:IfQaAz

AQABAba9zT8BAYAD0JJoTb40bb5vxJshk9cU9p8EzsqDpnGMcEnbAE2ppJjoXsZcLyyiEuhb96G4yDCiU5CCOWPUANLxWK2ZMzWxc+y5Sa0XIy44Z/kEdu+OhZ+sYDuzhHAF1Bptjof5eFRDAx08Tl63en15/SDHB3WeGiQZhCTlgz44wUPZ6qcD5mvJhkgjpDlvAwZuUTuRxlDrEvAGjo03DTlu1xqUk8HhU2TtrzI4Zt86ymNc/JNtd8MQ8qi6FVanGIQATUZ7URJH3i22NmCN6NKek28iXCrOgtva53scJHuDbkfYrkEJBJl7WOdiHeX8jbvR/0Y3oJML6/kFgdYwi6t93zYwwIsKaT9hYHsxh0EvPODn9E9lHyYN142TwhnUllz8vd+dIR53YEXJfYjhoStpbVrpQ5SQHswRlc5F/kV5FiKWMKKTggRRk5FNEPIycuyAQiGyqPT4HVZrCFOOgxPcDxYWbsskHaZAy4zUxHRfpvAVRfgza+m5sQHQUpn6TiE5Q+ucf6d5+AEWbCxMuWSyJ8qwMSQlbs9K/v14
@Masoud2023 你看看 age 库,用的人还是非常多的,证明还是有很多人不太想在某些场景下使用 gpg 的。
@superkkk 当然可以,whisper 其实就是在为你做这个事情,只是更便利了而已。
@geelaw 多谢指教!

> - 弄混了 AES 块长度和密钥长度,并且不知为何要先对随机数取 MD5 再当作 AES 密钥

你可以读读 golang 的文档 https://pkg.go.dev/crypto/aes#NewCipher 这里并没有弄混,是为了选择块长度才做 md5 的,保证不论使用什么长度的 secret ,块长度都是 128bit 。请问这有啥安全问题吗?

> 加密算法看起来没有保证选择密文攻击下的安全性

这个只有非常限定的情况下才能发生,而且只发生在 rsa 上,加个 khdf 就好了。现在都只推荐使用 ecdsa 或者 ed215519 了,rsa 不推荐使用。我有时间修复下。

> 引用 RFC 4880 Sect. 5.13 以论证合理性的部分似乎没有起到密码学安全性(所引用段落的目的)的作用

这个不是为了安全设计的,是为了快速验证密码是否正确。因为 AES 任意密码都可以 decode 内容,即便是密码错误也可以 decode ,不过会 decode 成无意义的数据。
237 天前
回复了 ysmood 创建的主题 Go 编程语言 利用 snapshot 来简化测试代码
不只是用来锁定结果保持不变。比如对于输出复杂的测试,可以先输出一个结果然后再修改 snapshot 文件到希望最终呈现的状态,再调试代码问题让输出跟 snapshot 一致。这样就不用手动写非常复杂的期望值了。
1  2  3  4  5  6  7  8  9  10 ... 15  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1092 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 18ms · UTC 19:07 · PVG 03:07 · LAX 12:07 · JFK 15:07
Developed with CodeLauncher
♥ Do have faith in what you're doing.