我之前一直使用 mkpasswd 在 Linux 上加密密码,并将其传送到 chpasswd 来设置新用户的密码。
我在一台机器上独立运行 mkpasswd:
$ printf "s£cr3t" | mkpasswd --stdin --method=sha-512 --salt "salt"
然后将加密的密码与脚本一起部署以设置密码。
printf "user:-the-encrypted-password-" | sudo chpasswd --encrypted
因此原始的纯文本密码从未被部署。
是否可以在 Windows 10 上做类似的事情?我一直在阅读 Powershell 的 ConvertTo-SecureString 和 ConvertFrom-SecureString,但如果我不使用密钥,它只能在同一台机器上工作。如果我使用密钥,我还必须部署密钥,这就像纯文本密码一样糟糕。
总之 - 我想在 Windows 10 上部署一个加密密码,可以存储而无需解密。
答案1
需要注意的是,密码通常不是加密(这意味着可逆函数)而是哈希(不可逆)。因此,SecureString
其配套 cmdletConvertTo-SecureString
和ConvertFrom-SecureString
都毫无用处 — 它们仅处理可逆加密。
您需要的 SHA-512 哈希值也只是方程式的一部分。由于彩虹表的存在,正确使用密码哈希值需要额外的随机组件,称为盐(您不应手动传递盐,因为弱值可能会损害整体加密强度。)
让我们看一下mkpasswd --method=sha-512
输出(对于密码“banana”),它也可能以/etc/shadow
这样的方式出现:
$6$mcD2hLIMJToO/6p.$BOERIGcczwhLazvF3LWumZCsNPE1LQ4dnPp4vZmevgHCNV/FuPTBb.7whQf5PVGa3S2pRpIP1Tiy1CzzuA/271
有多个组成部分,以美元符号分隔:
6
,该方案(SHA-512);还存在其他各种方案mcD2hLIMJToO/6p.
,盐BOERIGcczwhLazvF3LWumZCsNPE1LQ4dnPp4vZmevgHCNV/FuPTBb.7whQf5PVGa3S2pRpIP1Tiy1CzzuA/271
,实际哈希
该算法是记录在这里。从技术上讲,只要有所需的加密函数,就可以用任何合理的语言(包括 PowerShell)实现这一点。但是,这很复杂,所以不要费心。验证密码的相关问题在 Stack Overflow 上,它链接到C# 实现。你可以用它。
既然我们确定你不会在 PowerShell 中执行此操作,那么是解决方案是什么?使用mkpasswd
!在 Windows 上运行 Linux 工具的方法有很多种。最明显的是 WSL。只需使用真品™。完整的虚拟机也是一种可能。此外,OpenSSL 也可以做到这一点,Windows 版本可用。