有没有人获得DPAPI和漫游资料来工作?

发布于 2025-01-30 17:25:08 字数 1999 浏览 2 评论 0 原文

根据Microsoft的说法,DPAPI应该能够在一台计算机上加密数据,然后在另一台计算机上进行解密:

请参阅:https://support.microsoft.com/en-us/topic/bf374083-626f-3446-2a9d-3f6077723a60#bkmk_6

When I am logged into a域控制器和加密文件,我希望能够在同一用户上登录的另一台计算机上注销,传输和解密。

但是,我得到了这个错误:

error: (-2146893813, 'CryptProtectData', 'Key not valid for use in specified state.')

这意味着“漫游”不起作用。我假设我需要设置一些小组政策来使这些信誉正确漫游。

另外,如果有一种更好的方法来执行此操作(使用已登录的用户现有信用的其他一些API),我对此表示满意。

这是我用来测试的脚本:

import argparse
import os
import sys

from win32crypt import CryptProtectData, CryptUnprotectData


def dpapi_encrypt(fin, fout):
    dat = fin.read()
    fout.write(CryptProtectData(dat))


def dpapi_decrypt(fin, fout):
    (_descr, dat) = CryptUnprotectData(fin.read())
    if dat and dat[-1] == 0:
        dat = dat[:-1]
    fout.write(dat)


def do_fileop(file, op):
    if file == "-":
        fin = sys.stdin.buffer
        fout = sys.stdout.buffer
        op(fin, fout)
    else:
        with open(file, "rb") as fin:
            tmp = file + ".dpapi-enc"
            with open(tmp, "wb") as fout:
                op(fin, fout)
        os.replace(tmp, file)


def encrypt_file(file):
    do_fileop(file, dpapi_encrypt)


def decrypt_file(file):
    do_fileop(file, dpapi_decrypt)


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("file")
    parser.add_argument("--encrypt", "-e", action="store_true")
    parser.add_argument("--decrypt", "-d", action="store_true")
    args = parser.parse_args()

    if args.encrypt:
        encrypt_file(args.file)
    elif args.decrypt:
        decrypt_file(args.file)
    else:
        print("error: specify --encrypt or --decrypt", file=sys.stdout)


if __name__ == "__main__":
    main()

According to Microsoft, DPAPI should be able to encrypt data on one machine, and decrypt it on another:

See: https://support.microsoft.com/en-us/topic/bf374083-626f-3446-2a9d-3f6077723a60#bkmk_6

When I am logged into a domain controller, and encrypt a file, I expect to be able to log out, transfer and decrypt it on another machine logged in on the same user.

However, I get this error:

error: (-2146893813, 'CryptProtectData', 'Key not valid for use in specified state.')

Which implies that the "roaming" didn't work. I'm assuming there are some group policy things I need to set to get those creds to roam properly.

Also, if there's a better way to do this (some other api to use the logged-in user's existing creds), I'm ok with that.

Here's the script I use to test:

import argparse
import os
import sys

from win32crypt import CryptProtectData, CryptUnprotectData


def dpapi_encrypt(fin, fout):
    dat = fin.read()
    fout.write(CryptProtectData(dat))


def dpapi_decrypt(fin, fout):
    (_descr, dat) = CryptUnprotectData(fin.read())
    if dat and dat[-1] == 0:
        dat = dat[:-1]
    fout.write(dat)


def do_fileop(file, op):
    if file == "-":
        fin = sys.stdin.buffer
        fout = sys.stdout.buffer
        op(fin, fout)
    else:
        with open(file, "rb") as fin:
            tmp = file + ".dpapi-enc"
            with open(tmp, "wb") as fout:
                op(fin, fout)
        os.replace(tmp, file)


def encrypt_file(file):
    do_fileop(file, dpapi_encrypt)


def decrypt_file(file):
    do_fileop(file, dpapi_decrypt)


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("file")
    parser.add_argument("--encrypt", "-e", action="store_true")
    parser.add_argument("--decrypt", "-d", action="store_true")
    args = parser.parse_args()

    if args.encrypt:
        encrypt_file(args.file)
    elif args.decrypt:
        decrypt_file(args.file)
    else:
        print("error: specify --encrypt or --decrypt", file=sys.stdout)


if __name__ == "__main__":
    main()

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文