我正在研究一个使用prawn生成PDF的Rails应用程序.简而言之,我们希望能够对生成的PDF进行数字签名.我不知道从哪里开始准确阅读.只是想问一下其他人之前是否能够完成这项工作,如果是的话,我应该用什么样的资源来完成它.
谢谢!
这两个代码提供相同的签名,这是预期的:
代码1:
from M2Crypto import RSA, EVP
import base64, hashlib
text = "some text"
pkey = EVP.load_key("mykey.pem") #"mykey.pem" was generated as: openssl genrsa -des3 -out mykey.pem 2048
pkey.sign_init()
pkey.sign_update(text)
signature = pkey.sign_final()
print base64.b64encode(signature)
Run Code Online (Sandbox Code Playgroud)
代码2:
pkey = RSA.load_key("mykey.pem")
signature = pkey.sign(hashlib.sha1(text).digest())
print base64.b64encode(signature)
Run Code Online (Sandbox Code Playgroud)
但是,如果我想“模仿”签名算法,即用私钥加密摘要,则会得到一个不同的签名,即:
pkey = RSA.load_key("mykey.pem")
signature = pkey.private_encrypt(hashlib.sha1(text).digest(), RSA.pkcs1_padding)
print base64.b64encode(signature) #different from the two above
Run Code Online (Sandbox Code Playgroud)
您能提供一些解释吗?后一种签名方式有什么问题?
我正在编写一个Web应用程序,它对数据进行一些客户端加密,以确保我永远不会看到客户端发送到我的服务器的内容.我真正担心的是,如果第三方可以访问我的JavaScript代码,然后在我的JavaScript文件中添加后门或其他恶意代码.
由于JavaScript通常托管在第三方CDN上,如何在浏览器下载之前确保JavaScript文件未被更改或篡改?我宁愿在我的页面上有一个很大的安全通知,而不是在我的客户端浏览器中加载一些被篡改的JavaScript.
在正常的程序中,我会对文件进行数字签名,以确保它没有被篡改,但我认为浏览器不支持在下载和/或加载JavaScript文件之前检查给定的签名.必须有一些解决方案,否则托管CDN上的任何文件将是一个巨大的安全风险.SSL仅保护传输中的文件,而不是当它位于CDN服务器上时.
我目前正在使用WKHTMLTOPDF在我的应用程序中生成PDF.
现在要求是对pdf进行数字签名(不是放置水印或标志图像),这可以真正验证pdf生成是仅来自应用程序.
我查看了这个插件http://www.setasign.com/products/setapdf-signer/details/, 但付了款.
有人可以帮我签署pdf吗?
其他问题非常受欢迎.
仅供参考 - 我使用PHP作为服务器端语言.提前致谢 :)
我正在尝试在C ++中签名文本,然后在命令行中进行验证。我正在使用OpenSSL库。这是我生成密钥的命令行:
openssl genrsa -out key.pem 1024
Run Code Online (Sandbox Code Playgroud)
现在我有了我的私钥。然后这就是我登录命令行的方式:
echo "hola" | openssl rsautl -pkcs -sign -inkey key.pem > sign.txt
Run Code Online (Sandbox Code Playgroud)
至此,所有工作似乎都正常了,现在我在sign.txt中登录了。现在,我试图在C中做同样的事情。这是我的代码:
RSA * rsaPrivKey;
RSA * createRSAWithFilename (const char * filename, int publicKey)
{
FILE * fp = fopen (filename, "rb");
if (fp == NULL)
{
printf ("Unable to open file %s \n", filename);
return NULL;
}
RSA *rsa = RSA_new ();
if (publicKey)
rsa = PEM_read_RSA_PUBKEY (fp, &rsa, NULL, NULL);
else
rsa = PEM_read_RSAPrivateKey (fp, &rsa, NULL, NULL);
return rsa; …Run Code Online (Sandbox Code Playgroud) 我必须在Android应用程序中实现一个允许我签署PDF的功能,当我说"签名"时,我指的是用户在文档末尾贴上的数字签名(第一和第二名).
我可以访问三星Note 4(带手写笔),然后就不会出现问题,在显示屏上"写".
问题是:有可能使用像itext这样的库来签署文档,或者我必须编写自定义函数吗?
pdf android electronic-signature digital-signature handwriting
我在使用PFX文件进行XML数字签名时遇到了一些麻烦.运行此代码时出现异常:
KeyStore ks = KeyStore.getInstance("PKCS12");
fs = new FileInputStream(file);
ks.load(fs, "password".toCharArray());
// this line!
KeyStore.PrivateKeyEntry keyEntry = (KeyStore.PrivateKeyEntry) ks.getEntry("alias", new KeyStore.PasswordProtection("password".toCharArray()));
Run Code Online (Sandbox Code Playgroud)
这是例外:
java.security.UnrecoverableKeyException: Get Key failed:
java.security.InvalidKeyException: Invalid RSA private key
at sun.security.pkcs12.PKCS12KeyStore.engineGetKey(PKCS12KeyStore.java:435)
at sun.security.pkcs12.PKCS12KeyStore.engineGetEntry(PKCS12KeyStore.java:1306)
at java.security.KeyStore.getEntry(KeyStore.java:1521)
at app.ubl.xml.GenerateSignature.makeSignatureXML(GenerateSignature.java:88)
Caused by: java.io.IOException: DerInputStream.getLength(): Redundant length bytes found
at sun.security.util.DerInputStream.getLength(DerInputStream.java:606)
at sun.security.util.DerInputStream.getLength(DerInputStream.java:569)
at sun.security.util.DerInputStream.getPositiveBigInteger(DerInputStream.java:220)
at sun.security.rsa.RSAPrivateCrtKeyImpl.parseKeyBits(RSAPrivateCrtKeyImpl.java:205)
Run Code Online (Sandbox Code Playgroud)
真正的问题是代码在java中工作1.8.0_111,但错误显示的任何更高版本.
我发现的另一个问题是当我使用以下命令运行此命令keytool:
keytool -list -keystore file.pfx -storepass password -storetype PKCS12 -v
Run Code Online (Sandbox Code Playgroud)
要显示PFX文件的详细信息,那么它只能用于java 1.8.0_111.否则我得到这个例外:
java.util.IllegalFormatConversionException: d != java.lang.String
at …Run Code Online (Sandbox Code Playgroud) 我有兴趣尝试从数字签名中读取字段.我有代码调用CryptQueryObject,然后CryptMsgGetParam来获取一些字段,最后是CertFindCertificateInStore来加载证书.
有关如何使用下一代加密API进行此操作的任何提示?微软告诉我CryptQueryObject已被弃用,但并未指出它的替代品.
我正在尝试验证php中的签名,并且已经筋疲力尽地尝试了我在网上找到的每个例子.我已经绕圈子了,所以我现在可能已经错过了解决方案.
所以我有测试数据
$msg = "test data";
Run Code Online (Sandbox Code Playgroud)
使用我的密钥对中的私钥生成此签名
$signature = "avALtk00btVyV74e5UdXJ/VClVV/fsuoLZpXQjiCrkVijsmMZsYWZujN56+Aa2CEQYkomDsm9CJ/Tue7lNP0tYVZz9Y0RngpcV9VT9V3i+3rbvbBEnuJuS/5e+PR7kQGMh8rVuCtHpAJhSePMyipC3kM90EQJ0jyY3rFaHDNpSzVBpOnRYLzqbsdy45v0bN78A2J/HaIhJy87Sh4X1a+WMg9PLkqSSYZnRYOB8XVDCYfyeeekcvI4rvP51wBQcaLwu7S0xPQA8yHfJqMXCqdmBVUQZrk/X+CujdXUyJItDWA8j2N8AHmcAD5oRaJ6bX3zCQFM1QnKMi1ETLudzIqfA==";
Run Code Online (Sandbox Code Playgroud)
这是签名密钥对的公钥
$key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxv4nCiH4vXvSLsvlceCOk3yfH1EQgNqNaVGdnFxdw9IIjSVZvTVH45NCodCJ0GlHoDwQM7DMV1+QrtF91cn44xg4Ys9zr1xkaT4jWBTe3YKoTqJoLHR4UU03F6Y1jTELhjY2a2Kt0ijyvAOKM4bm3gCItfMx59ETGInz7Oubb1T4IJ8TuWmZsh+X57c6fgv0B2+eTr/5FMK2VxXV5tHkB9UNLBgnbw0IZuC6izF4OFk9hxgh96i5wCf2HhHaNoEryx7ZV2ZG9a0OQnYZ+x1zaOIw6dJkV7rip3H57ksQfoQWM0GKMBB7cWIgWsf/GlbYTVgw26MvzEzGPb9uCfx8rwIDAQAB";
Run Code Online (Sandbox Code Playgroud)
我试过用这个包装钥匙
$pubkey = "-----BEGIN RSA PUBLIC KEY-----" . $key . "-----END RSA PUBLIC KEY-----";
Run Code Online (Sandbox Code Playgroud)
并与此
$pubkey = "-----BEGIN PUBLIC KEY-----" . $key . "-----END PUBLIC KEY-----";
Run Code Online (Sandbox Code Playgroud)
我已经尝试使用两个包装创建一个公钥ID,没有任何包装,就像这样
$pubkeyid = openssl_pkey_get_public($pubkey);
$pubkeyid = openssl_pkey_get_public($key);
Run Code Online (Sandbox Code Playgroud)
我已经尝试使用$ key和$ pubkeyid验证签名,使用各种算法,没有,就像这样
openssl_verify($msg, base64_decode($signature), $pubkeyid);
openssl_verify($msg, base64_decode($signature), $key);
openssl_verify($msg, base64_decode($signature), $pubkeyid, "sha256withRSAEncryption");
openssl_verify($msg, base64_decode($signature), $key, "sha256withRSAEncryption");
openssl_verify($msg, base64_decode($signature), $pubkeyid, OPENSSL_ALGO_SHA256);
openssl_verify($msg, base64_decode($signature), $key, OPENSSL_ALGO_SHA256);
Run Code Online (Sandbox Code Playgroud)
我可能尝试了其他一些排列,但现在不记得了.我头疼.
无论我尝试什么,我都没有设法验证签名.我可以轻松地使用java中的公钥来验证签名.
我讨厌要求一个有效的PHP示例,因为我已经尝试了很多我已经在网上找到的并且无法让它们工作.不幸的是phpseclib对我来说不是一个选择,所以我必须使用openssl.
我哪里错了?
在互联网上搜索了一段时间后,没有成功,我会在这里询问。
互联网上的一些帖子说,不可能在Excel应用程序中将数字签名应用于VBA-Macro。但是我发现的所有文章都很老,所以我希望现在可以通过代码来完成。
我的目标是打开Excel文档,并假设存在宏,将数字签名应用于该文档的vba-macros。
我有以下代码来检测excel文档中是否存在VBMacros:
string filePath = @"E:\OfficeDocuments\Sample1.xlsm";
object isReadonly = true;
object missing = Missing.Value;
_Application application = new Microsoft.Office.Interop.Excel.Application();
workbook = application.Workbooks.Open(
filePath, missing, isReadonly, missing, missing, missing,
missing, missing, missing, missing, missing, missing,
missing, missing, missing);
bool workbookHasVbProject = workbook.HasVBProject;
Run Code Online (Sandbox Code Playgroud)
那很好。
现在,我获取要用于签署宏的证书:
X509Store store = new X509Store(StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
X509Certificate2Collection x509Certificate2Collection = store.Certificates;
X509Certificate2Collection certificate2Collection = x509Certificate2Collection.Find(X509FindType.FindBySubjectName, "MyCertificate 01", true);
if (certificate2Collection.Count > 0)
{
X509Certificate2 certificate = certificate2Collection[0];
}
Run Code Online (Sandbox Code Playgroud)
现在我不知道如何继续...
我试过了:
VBE vbe = application.VBE;
VBProject vbProject …Run Code Online (Sandbox Code Playgroud)