V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  geelaw  ›  全部回复第 7 页 / 共 172 页
回复总数  3422
1 ... 3  4  5  6  7  8  9  10  11  12 ... 172  
127 天前
回复了 faketemp 创建的主题 Windows 如何修改注册表增加右键菜单项?
可能是 IContextMenu 系列接口
@geelaw #26 Alas 刚发现之前有人说过了。
@hippoboy #18 重音作用在元音上;一个音节可以是 V 、CV 、VC 、CVC ,其中 C 表示辅音(群),V 表示元音;重音符号写在音节开头。

present 有两个音节,第一个是 pre 第二个是 zənt ,因此 e 变重的时候重音符号在 p 前,不代表 p 本身加重。这里 pr 、nt 就是辅音群的例子,由多个辅音组成。
133 天前
回复了 seedscoder 创建的主题 Java 关于一段 Java 代码的疑问,求解答
因为直接写 0 不会导致 nextIndex 增加到 1 ?
是 feature ,如果 A 和 B 是“认识的人”那么会显示通讯录里的名字。不过 AirDrop 有其他不安全的地方,比如当 A 和 B 不认识的时候,B 依然可以知道 A 的手机号码,这是熟知的,见 https://privatedrop.github.io/
137 天前
回复了 acr0ss 创建的主题 算法 [请教] 生活中的算法题:密码尝试次数
@geelaw #30 Ugh, 应该是 ceiling(k^n/(m-n+1)).
137 天前
回复了 acr0ss 创建的主题 算法 [请教] 生活中的算法题:密码尝试次数
@geelaw #13
@acr0ss #29

de Bruijn 序列 B(k, n) 的定义是 { 0, 1, ..., k-1 } 的有限序列 X = X[1]X[2] ... X[L] 使 L >= n 且所有 { 0, 1, ..., k-1 }^n 的元素都在 X' = X[1] X[2] ... X[L] X[1] X[2] ... X[n-1] 恰好作为子串出现一次。已经知道 B(k, n) 的长度是 L = k^n ,注意 X ' 长度为 n 的子串恰好有 L = k^n 个,且 { 0, 1, ..., k-1 }^n 恰好就有 k^n 个元素。

在你的情况里 k=10, n=6 ,但 de Bruijn 序列并不是你直接要的答案,不过已经非常接近了。

你希望寻找一系列长度是 12 的串 Y(1), ..., Y(z) 使得诸 Y(i) 的所有长度为 6 的子串覆盖了 { 0, ..., 9 }^6 ,很明显 z >= ceiling(10^6/7) = 142858 ,而取

Y(i) = X'[7(i-1)+1] ... X[7(i-1)+12]
1 <= i <= 142857
Y(142858) = X'[7(142858-1)+1 = 10^6] ... X'[10^6+(10-1)] 0 0

则诸 Y(i) 的所有长度为 6 的子串当然就包括了 X' 所有长度为 6 的子串,后者就是所有长度为 6 的串。这说明需要的 z 可以是 142858 。

暂且称上面长度为 12 的串是“窗口”。类似地,可以算出密码字符有 k 个,密码长度是 n ,窗口长度是 m 的时候需要的最小的窗口数就是 ceiling(k^n/m)。

计算最小窗口数和计算这一系列窗口是两回事儿,不过后者也不难,de Bruijn 序列有算法可以生成,再练习一下使用搜索引擎的能力就好。
137 天前
回复了 gransh 创建的主题 Edge 大家把 edge 卸了还怎么用网银?
虽然我不卸载 Edge 但你可以打开 Internet Explorer ,比如

(New-Object -ComObject InternetExplorer.Application).Visible = $True

IE 在以 COM 服务器启动时不会强行要求你切换到 Edge 。
138 天前
回复了 acr0ss 创建的主题 算法 [请教] 生活中的算法题:密码尝试次数
你需要搜索的是 de Brujin 序列 (sequence)
另外我对 Windows 下 Office 提示文件不存在存疑,至少跳转列表是可以正确处理文件移动的。
每个软件都可以自己实现最近打开的文件列表,所以这个问题无从回答。我也不太熟悉 macOS ,但可以提供一下 Windows 的视角,两者相通,假设楼主说的是程序不在运行的时候改名。

1. 存文件路径、建立软链接

无法处理文件重命名。

2. 建立硬链接、存标识符(“inode”)

技术上可行,但是实操不可行,原因有两点:一是并不是所有的文件系统都有硬链接,每个文件系统的标识符格式不同;二是很多软件都会采用写新、删旧、重命名三部曲覆盖文件,这会导致以前的硬链接和新文件脱离关系。

3. 建立快捷方式(.lnk )

这是标准解法,因为快捷方式优先考虑原来的路径是否存在,如果不存在则会开始链接追踪,采用文件标识符(“inode”)、文件创建读取修改时间、文件大小、文件路径等一系列匹配方法找到文件的新位置、新名字。

三部曲覆盖文件会转移文件时间信息(不转移标识符),这叫做“文件系统隧穿”。

macOS 里快捷方式对应的概念是“替身”,或许也有追踪的功能。
Windows 可以创建密码重设磁盘(例如 U 盘;重设密码的时候需要插入此 U 盘,不需要旧密码),我忘记使用密码重设 U 盘是否会导致丢失密码学数据了——理论上可以设计成不会丢失的状态,因为可以把密码学数据备份到 U 盘上,但我不记得具体实现。
@geelaw #11

>如果修改密码的时候提供旧密码,那么 Windows (在操作人有合适的权限的情况下)当然可以修改它记住的 H ,允许用新密码通过 Windows 的登录逻辑。但是没有 P 的时候 S 、K 依然无法还原。

应该改成

>如果修改密码的时候 不 提供旧密码……
@dgzting #10 是否有那个问题是数学决定的,不是 API 决定的。Windows 有一些自动加密的内容使用用户的密码导出的密钥,可以简单地理解为这样的模式:

1. 用户建立的时候生成 AES 密钥 K
2. 如果用户密码是 P ,则计算 S = MakeKeyFromPassword(P),其中 S 是另一个 AES 密钥
3. 在硬盘上保存 AutoKey = AES.Enc(key=S, plaintext=K)
4. 如果用户设置文件 F 要加密,则在硬盘上保存 EncF = AES.Enc(key=K, plaintext=F),解密的时候可以用 P 导出 S ,再用 S 解密 AutoKey 得到 K ,最后用 K 解密 EncF 得到 F

注意 K 是没有直接保存在硬盘上的。

5. 如果用户修改密码,那么先用旧密码 P 得到 S ,然后用 S 解密 AutoKey 还原 K ,再用新密码 P' 得到 S',再设置 AutoKey 为 AES.Enc(key=S', plaintext=K),这样每次修改密码的时候只需要重新加密少量数据,不需要把所有文件都解密再重新加密一次。

这个机制和 Windows 验证用户登录的机制是分开的,你可以认为 Windows 另外保存了密码 P 的 hash 值 H ,而 H 本身没有加密,登录时 Windows 只是计算用户尝试登录时输入的密码的 hash 并和 H 比较。可以简单认为登录成功的时候 Windows 重新见到了 P ,因此可以重新算出 S 、K 并在内存里缓存 P 、S 、K 。然而假设用户没有登录,比如操作系统刚启动的时候,此时 Windows 只知道 H ,不知道 P 、S 、K 。

如果修改密码的时候提供旧密码,那么 Windows (在操作人有合适的权限的情况下)当然可以修改它记住的 H ,允许用新密码通过 Windows 的登录逻辑。但是没有 P 的时候 S 、K 依然无法还原。

换言之,是否允许登录纯粹是操作系统想不想的问题,但是否能解密数据,是能不能的问题。

* * *

你在 lusrmgr.msc 和 compmgmt.msc 里面修改用户密码的时候会提示

Resetting this password will might cause irreversible loss of information for this account.

等等一大串,并且告诉你(作为用户而不是开发者时候)正确做法是按 Ctrl+Alt+Delete 打开“Windows 安全”对话框,选择 Change a Password ,然后输入用户名、旧密码、新密码(两次)。

net user 和 Set-LocalUser 都不需要旧密码,因此一定会导致密码学数据不再可用(除非你后来想起来旧密码并且旧的例如 AutoKey 和 EncF 还没有被删除,我不知道 Windows 会不会自动删除失效的 AutoKey )。实际上它们和 lusrmgr.msc / compmgmt.msc 归结为同一个 API 。

而 NetUserChangePassword 需要旧密码,而且实际上 NetUserChangePassword 会类似之前提到的解密、重加密操作,所以不会有这个问题。它和 Ctrl+Alt+Delete 是一样的。

* * *

是否丢失密码学保护的数据和用户在本地还是域控制器上无关。在 Windows 提供的 API 下,丢失数据当且仅当修改密码不需要提供旧密码。
用 net user 修改密码是有多想不开……

凡是不需要旧密码就可以强行修改密码的手段,都会导致被修改密码用户原先保存的密钥失效,使这个用户(密码学意义上)不能再访问加密数据( EFS 、基于用户的 Crypto 系列 Windows API )。

推荐从 https://learn.microsoft.com/en-us/windows/win32/api/lmaccess/nf-lmaccess-netuserchangepassword 开始阅读文档。
@username1919810 #4 https://devblogs.microsoft.com/oldnewthing/20130201-00/?p=5383

> I’m going to pose a puzzle with almost no clues, and you get to propose solutions, and I’ll say whether or not you’re right.

推荐不要放上来这么一大坨代码让网友帮你调试。你有没有试过:复制 C 的代码(绝大多数情况下这也是有效的 C++ 代码),每次修改一点点,然后检查哪个修改令行为不同?你有没有试过制造最小复现情况?
两段代码里 response 不同,C++ 的代码里 response 以 1 开始,C 代码里以 0 开始。我不知道这个库的逻辑,因此在第一个发现的不同处就假设两段代码不等价且可以导致后续的行为不同。
这个问题很容易诊断,但是用文字表达比较麻烦。

简而言之,你应该检查 HKCR\.png\OpenWithProgIDs 里面的东西,删除多余的 value ,并且删除多余的一些 ProgID 。但后面(删除多余的 ProgID )这个操作是要比较小心的,不熟悉的话容易删除正常的文件关联项。
@sdjl #4

>请勿使用“否定式反问句”。
>难道你没有这种感觉?
1 ... 3  4  5  6  7  8  9  10  11  12 ... 172  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2808 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 57ms · UTC 15:03 · PVG 23:03 · LAX 08:03 · JFK 11:03
Developed with CodeLauncher
♥ Do have faith in what you're doing.