是否有用于 XML 数字签名的命令行工具?
我在这里找到了一个: http: //www.codeproject.com/KB/security/xmldsiglic.aspx ,但它需要 .NET Framework,我更喜欢它在没有 .NET 的情况下工作
我正在尝试使用 GoDaddy 颁发的 SSL 证书对 PDF 进行签名。
只要您在 WindowsEdit->Preferences...->Security->Advanced Preferences->Windows Integration->Trust ALL root certificates证书存储区中选中“验证签名”复选框以进行以下操作,这些签名就会在 Windows Reader 中显示为有效。
但是,我似乎在 Mac OS X 版本的 Reader 中找不到类似的设置。Mac OS X 似乎在钥匙串中具有与 Windows 证书存储类似的东西(特别是 GoDaddy 的系统根)。
有人知道 Mac 版本上的设置与我提到的 Windows 设置类似吗?如果没有,是否有其他 PDF 阅读器适合这种情况?
我希望对我的图像集进行数字签名,其中包含 JPG 、 TIFF 、 BMP 、 SWf 、 Fla 文件。
我的问题是如何对这些图像进行数字签名?如果我签署 JPG 或 Tiff ,签名是否会附加到这些文件上(就像 PDF 或 MS Word 等文档文件中发生的那样)?如果是这样,它会存储在文件元数据字段中,还是保留在外部?我可以提取签名数据吗?请注意,我希望单独签署这些图像,并且不想将其转换为 PDF 等任何其他格式。我也不想使用电子邮件客户端对其进行签名。
我正在尝试了解有关数字签名的更多信息,并在此过程中想尝试验证签名文件的真实性。我读到 GPO 签署了他们在 gpo.gov 上托管的所有文件,所以这些就是我一直在查看的文件。这是特别的一个:
\n\nhttp://www.gpo.gov/fdsys/search/pagedetails.action?capsuleId=&packageId=BUDGET-2013-BUD
\n\n我在站点链接到的真实性元数据“PREMIS”文件中找到了公钥,但节点是空的\xe2\x80\x94我假设这是我可以找到文件签名的地方。
\n\n我可以使用以下命令创建文件的 sha-1 摘要:
\n\nopenssl dgst -sha1 -out digest.txt BUDGET-2013-BUD.pdf\nRun Code Online (Sandbox Code Playgroud)\n\n我的理解是,要验证文件的真实性,我需要 1)文件摘要,2)签名者的公钥,3)签名,使用这样的命令(我在这里找到) :
\n\nopenssl rsautl -verify -in <signature> -out <digest> \\\n -inkey <key> -pubin\nRun Code Online (Sandbox Code Playgroud)\n\n我知道您可以使用 Adobe Reader 来验证数字签名的 PDF,但是否也可以从命令行执行此操作?除了签名之外,我还应该寻找其他东西来完成此任务吗?
\n通过加载包含 RSA 私钥的预创建 .key 文件,只有我注意到,它包含以下数字:
Modulus (private modulus)
Exponent (private exponent)
P (prime exponent)
Q (prime exponent)
DP
DQ
InverseQ
Run Code Online (Sandbox Code Playgroud)
我将密钥文件保存在存储空间非常小的地方(便携式)。我想只保存模数和指数。我知道 P、Q 和 E 对于创建模数和指数是必要的,但是:
问题:
当 PrivateModulus 和 PrivateExponent 足以签名和解密消息时,将所有这些数据保存到 .key 文件的目的是什么?
我有一个 .NET 程序集,我对其进行了强命名,并将其放入 GAC 中。.pfx但是,稍后还会使用文件对同一程序集进行数字签名,以进行数字签名。
我注意到这个经过双重签名的程序集未通过强名称验证,并且不会安装在目标计算机的 GAC 中。
数字签名过程是否有可能删除 SN 密钥生成的强命名过程?
数字签名是必不可少的,如果两者不兼容,那么文件可以由数字签名吗?.pfx像 SN 命名过程一样简单地由文件对文件进行签名?
另外,程序集位于C++/CLI,而不是C#。
编辑:查看MSDN 文档,它说是否使用链接器选项进行强命名,以及是否使用像这样的后处理工具mt.exe(我不确定是否Signtool.exe属于这些工具),则需要重新签署程序集。
另外,这个声明:
如果在开发环境中生成时使用签名属性,则可以通过在生成后事件中显式调用 sn.exe(Sn.exe(强名称工具))来成功对程序集进行签名。
...有点令人困惑。它指的是哪些属性,CLR属性还是Linker选项?
我一直在努力修改来自 Microsoft 的此代码示例,该示例显示(有些过时)如何从可执行文件中检索代码签名信息。它可以工作,但如果二进制文件是双重签名的,则它不会检索信息。
所以我做了一些研究并尝试重写它以使其识别 Windows 中许多现代可执行文件中存在的双重签名。不幸的是,很少有(模糊的)建议可用(1),(2),例如使用UnauthenticatedAttributes和szOID_NESTED_SIGNATURE(无论这意味着什么)但仅用于检索时间戳的建议。
所以我试图重写那个微软代码,这是我得到的:
(要构建它,只需将其复制到 Visual Studio 控制台项目中并更改 .exe 文件路径。处理双重签名的代码在PrintDualSignatureInfo()函数中。)
#include "stdafx.h"
//SOURCE:
// https://support.microsoft.com/en-us/help/323809/how-to-get-information-from-authenticode-signed-executables
//
#include <windows.h>
#include <wincrypt.h>
#include <wintrust.h>
#include <stdio.h>
#include <tchar.h>
#include <atlconv.h>
#pragma comment(lib, "crypt32.lib")
#define ENCODING (X509_ASN_ENCODING | PKCS_7_ASN_ENCODING)
typedef struct {
LPWSTR lpszProgramName;
LPWSTR lpszPublisherLink;
LPWSTR lpszMoreInfoLink;
} SPROG_PUBLISHERINFO, *PSPROG_PUBLISHERINFO;
BOOL GetProgAndPublisherInfo(PCMSG_SIGNER_INFO pSignerInfo,
PSPROG_PUBLISHERINFO Info);
BOOL GetDateOfTimeStamp(PCMSG_SIGNER_INFO pSignerInfo, SYSTEMTIME *st);
BOOL PrintCertificateInfo(PCCERT_CONTEXT pCertContext);
BOOL GetTimeStampSignerInfo(PCMSG_SIGNER_INFO …Run Code Online (Sandbox Code Playgroud) 我在 Go 中创建一个签名,例如:
//I'm reading a file with -----BEGIN RSA PRIVATE KEY-----
privateKeyPem := strings.Replace(privateKeyString, `\n`, "\n", -1) //file has '/n' instead of break lines for dev purposes
block, _ := pem.Decode([]byte(privateKeyPem))
key, _ := x509.ParsePKCS1PrivateKey(block.Bytes)
hashedString := sha256.Sum256([]byte(stringTosign))
signature, err = rsa.SignPKCS1v15(rand.Reader, key, crypto2.SHA256, hashedString[:])
signatureString := base64.StdEncoding.EncodeToString(signature)
Run Code Online (Sandbox Code Playgroud)
Java 程序接收变量 signatureString 并执行以下操作:
byte[] keyBytes = Files.readAllBytes(Paths.get("./golangSignerPubKey.der"));
X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);
KeyFactory kf = KeyFactory.getInstance("RSA");
PublicKey publicKey = kf.generatePublic(spec);
Signature signature = Signature.getInstance("SHA256withRSA", "BC");
signature.initVerify(publicKey);
signature.update(stringUnsigned.getBytes());
boolean signatureIsValid = …Run Code Online (Sandbox Code Playgroud) 我只是在 Rails 应用程序上试用 JWT 令牌,使用这个 jwt 库:https : //github.com/jwt/ruby-jwt
JWT.encode({sss: "333"}, 'SECRET_KEY')
Run Code Online (Sandbox Code Playgroud)
返回以下令牌:
eyJhbGciOiJIUzI1NiJ9.eyJzc3MiOiIzMzMifQ.CwX_1FztYHVpyx_G27u938SceilsVc5AB5Akwqlo2HA
然后我使用上面的令牌解码
JWT.decode("eyJhbGciOiJIUzI1NiJ9.eyJzc3MiOiIzMzMifQ.CwX_1FztYHVpyx_G27u938SceilsVc5AB5Akwqlo2HA", 'SECRET_KEY')
Run Code Online (Sandbox Code Playgroud)
正确返回以下响应:
[{"sss"=>"333"}, {"alg"=>"HS256"}]
但是,如果我尝试将令牌的最后一个字母更改为B而不是当前的A,它仍然返回相同的响应,这很奇怪。
JWT.decode("eyJhbGciOiJIUzI1NiJ9.eyJzc3MiOiIzMzMifQ.CwX_1FztYHVpyx_G27u938SceilsVc5AB5Akwqlo2HB", 'SECRET_KEY')
Run Code Online (Sandbox Code Playgroud)
即使我提供的令牌是错误的,也会收到此响应:
[{"sss"=>"333"}, {"alg"=>"HS256"}]
实际上,我对所有字符都得到了相同的响应,直到 'D'
如果我使用F上面的和其他人,那么它会按预期显示错误:
JWT.decode("eyJhbGciOiJIUzI1NiJ9.eyJzc3MiOiIzMzMifQ.CwX_1FztYHVpyx_G27u938SceilsVc5AB5Akwqlo2HF", 'SECRET_KEY')
Run Code Online (Sandbox Code Playgroud)
JWT::VerificationError(引发签名验证)来自 (irb):34
这可能是什么原因?这是预期的行为还是我在这里做错了什么?
为了能够使用基于令牌的 DSC 对 PDF 文档进行签名,我的 PDF 中需要一个所谓的签名字段。
这是一个矩形区域,您可以使用例如 Adobe Reader 或 Adobe Acrobat 用数字签名填充。
我想用 Python 创建这个可签名的 PDF。
我从纯文本或 .docx 格式的富文本文档(图像和文本)开始。
如何在 Python 中使用此字段生成 PDF 文件?
authenticode ×2
pdf ×2
.net ×1
acrobat ×1
base64 ×1
c++ ×1
c++-cli ×1
code-signing ×1
command-line ×1
encryption ×1
go ×1
java ×1
jwt ×1
macos ×1
openssl ×1
python ×1
rsa ×1
sha1 ×1
strongname ×1
winapi ×1
x509 ×1
xml ×1