svn encrypt/cache 手动输入用户密码

svn encrypt/cache user password manually

目标:当 运行 从命令提示符发出 svn 命令时避免 svn 身份验证提示。

我知道有一个选项可以将 --username & --password 传递给 svn 命令。但我不想这样做,因为 svn 操作是从批处理脚本完成的,我不想在批处理脚本中存储密码。

如果我们创建需要出现在 %APPDATA%\Subversion\auth\svn.simple\ 下的文件并更新它的内容。它是否逃避身份验证提示。可以这样做吗?

我看到有工具可以从 svn.simple 下的文件中解密密码。但是我如何加密密码并创建一个具有正确哈希名称的文件,以便 svn 使用它?

已找到解决方案。下面是windows.

中加密的颠覆过程
  1. Subversion 使用 Windows 的 CryptProtectData 函数来加密密码。
  2. Subversion 对加密密码进行 base64 编码并将其保存到 %APPDATA%\Subversion\auth\svn.simple\

尝试使用 Powershell:

使用 powershell 自动执行失败,原因是 CryptProtectData 使用 "description" 参数,该参数包含在加密密码中。但是 Powershell ProtectedData 函数不接受 "description" 参数。

因此,如果我使用 Powershell "ProtectedData" 与 Subversion 加密相比,加密数据的大小较小。

解法:

因此,我使用 C++ 代码使用来自 Subversion 源代码的完全相同的 "description" 字符串执行完全相同的操作来加密密码并对加密数据进行 base64 编码并且它有效。

# Below piece is taken from svn source code - file name: subversion/libsvn_subr/win32_crypto.c
CryptProtectData(
     &blobin, // Input Data BLOB
     L"auth_svn.simple.wincrypt",  // Description String
     NULL, NULL, NULL,                       
     CRYPTPROTECT_UI_FORBIDDEN,    // Constant to avoid prompting user
     &blobout                      // Output Data BLOB
 )

注意:我会在不久的将来尝试分享代码。

其他提示

CryptProtectData 函数创建一个会话密钥来执行加密。当要解密数据时,将再次派生会话密钥(我没有进一步讨论确切的密钥及其存储方式等)。因此,我们必须使用计划执行 svn 操作的同一用户帐户执行加密。

如前所述,SVN将详细信息缓存在%APPDATA%\Subversion\auth\svn.simple\下,文件名为"MD5 hash value of svn:realmstring".

# you can find the svn realm string, if you have already cached in the your account
# Up to my observations it is <svn url> <standard text>
<https://testsvn.svn.com:443>  SVN AD-LDAP login (username, lowercase with domain)