我正在研究将SHA1中的应用程序升级为默认的PKCS#7 SignedData摘要算法,以更强的摘要(如SHA256),以保留不支持SHA1以外的摘要算法的签名验证程序的向后兼容性.我想检查一下我对PKCS#7格式和可用选项的理解.
我想要做的是使用SHA1和SHA256(或更一般地说,一组摘要算法)消化消息内容,以便较旧的应用程序可以继续通过SHA1进行验证,并且升级的应用程序可以通过SHA256开始验证(更一般地说,提供最强的摘要),忽略较弱的算法.[如果有更好的方法,请告诉我.]
看来,在PKCS#7标准中,提供多个摘要的唯一方法是提供多个SignerInfos,每个摘要算法一个.不幸的是,这似乎会导致安全性的净减少,因为攻击者能够使用最弱的摘要算法剥离除SignerInfo之外的所有算法,而单独的摘要算法仍将形成有效的签名.这种理解是否正确?
如果是这样,我的想法是在SignerInfo的authenticatedAttributes字段中使用自定义属性为其他摘要算法提供额外的消息摘要(将SHA1保留为"默认"算法以实现向后兼容).由于此字段被认证为单个块,因此可以防止上述攻击.这似乎是一种可行的方法吗?有没有办法在不超出PKCS标准的情况下完成这个或类似的东西?
有关尝试使用SHA1/SHA256进行双重签名时遇到的故障的问题.
我现在已经过了几年SHA256代码签名证书,但在新的一年(2016)之前,我开始使用/ FD SHA256的哈希算法是符合SHA1微软弃用.
这工作正常,但当然签名哈希不会在旧操作系统上验证.我不关心XP,但我仍然关心Vista.
我首先使用以下代码签署SHA1:
signtool sign /fd SHA1 /f "cert.pfx" /p "password" /t http://timestamp.verisign.com/scripts/timsetamp.dll "file"
Run Code Online (Sandbox Code Playgroud)
然后我尝试我的双重签名:
signtool sign /as /fd SHA256 /f "cert.pfx" /p "password" /tr http://timestamp.globalsign.com/?signature=sha2 "file"
Run Code Online (Sandbox Code Playgroud)
而signtool给了我这个:
Done Adding Additional Store
SignTool Error: An unexpected internal error has occurred.
Error information: "Error: SignerSign() failed." (-2147024846/0x80070032)
现在我可以使用单个算法(SHA1或SHA256)成功签名文件,但我无法添加第二个签名.我唯一的猜测是,因为我使用的是两种算法的SAME证书,所以不喜欢这样.我是否需要为每种算法使用不同的物理证书?
只是想知道,因为在新的一年之前,我使用SHA1算法多年来一直使用SHA256证书,并且它在所有操作系统上都经过验证.
到了2017年,如果安全性很重要,那么任何需要使用哈希的人都应该避免使用诸如MD5之类的“破碎”哈希。是否有人找到或创建了一种无需使用VBA或宏即可在Excel中执行更安全的SHA256或SHA512哈希的方法?
过去35,000年前使用MD5就是一个很好的例子(如本SO:不使用VBA的excel中的MD5哈希函数所示)。
避免使用VBA /宏的原因:与移动设备的兼容性,例如iOS的Excel。
旁注:原始的Stack Overflow帖子具有成功的答案,但链接无效,这是供参考的新链接:https : //tzamtzis.gr/2017/web-analytics/excel-function-md5-hashing-without-vba /
我正在构建一个HMAC API,我在使用Paw测试散列时遇到了问题.
在Paw我有这个有效载荷:
GET:/hello/world:"":9a6e30f2016370b6f2dcfb6880501d7f2305d69bout
Run Code Online (Sandbox Code Playgroud)
和定制HMAC-SHA256变量(实际上起到这样,设置它在X-哈希报头.
X-Hash: 4Cq2yehWumDcUk1dYyfhm6qWjJVBkOCB8o12f5l0WGE=
Run Code Online (Sandbox Code Playgroud)
在我的PHP API中,我有同样的事情:
GET:/hello/world:"":9a6e30f2016370b6f2dcfb6880501d7f2305d69bout
Run Code Online (Sandbox Code Playgroud)
和使用:
hash_hmac('sha256', $this->getPayload(), '9a6e30f2016370b6f2dcfb6880501d7f2305d69bout', false);
Run Code Online (Sandbox Code Playgroud)
所以在比较哈希时:
Paw: 4Cq2yehWumDcUk1dYyfhm6qWjJVBkOCB8o12f5l0WGE=
PHP: 6961b9d1f6e986c49d963cbebd691fa68dfa59b4ce3b7f05320c2d43eae3c7c3
Run Code Online (Sandbox Code Playgroud)
他们是非常不同的.知道为什么会这样吗?
更新
爪子代码:
function evaluate(context){
var loc = getLocation(context.getCurrentRequest().url);
var payload = "";
payload += context.getCurrentRequest().method + ':';
payload += loc.pathname + ':';
payload += JSON.stringify(context.getCurrentRequest().body) + ':';
payload += "9a6e30f2016370b6f2dcfb6880501d7f2305d69bout"; // Private key
return payload;
};
function getLocation(href) {
var match = href.match(/^(https?\:)\/\/(([^:\/?#]*)(?:\:([0-9]+))?)(\/[^?#]*)(\?[^#]*|)(#.*|)$/);
return match && {
protocol: match[1],
host: match[2],
hostname: match[3],
port: match[4],
pathname: match[5], …Run Code Online (Sandbox Code Playgroud) 我正在设计Content-addressable storage,所以我正在寻找一个哈希函数来生成对象标识符。每个对象都应该以这种方式根据其内容获得短 ID:object_id = hash(object_content).
先决条件:
32字节,以便256^32最大程度地寻址对象(但可以放宽此要求)。考虑到这些要求,我选择了SHA256哈希,但不幸的是,它对于我的目的来说还不够快。最快的实现SHA256,我能到基准是openssl和boringssl:我的桌面上,Intel Core I5 6400它大约给了420 MB/s每个核心。其他实现(如crypto/rsaGo)甚至更慢。我想SHA256用其他散列函数替换,它提供与 相同的碰撞保证SHA256,但提供更好的吞吐量(至少600 MB/s每个内核)。
请分享您对解决此问题的可能选项的看法。
另外我想指出的是,硬件更新(例如购买带有AVX512指令集的现代 CPU )是不可能的。重点是找到可以在商品硬件上提供更好性能的哈希函数。
是否有内置方法可以将 SHA256 生成为给定字符串的二进制数据?基本上,我使用下面的 bash 脚本首先将哈希生成为二进制数据,然后进行 base64 编码。我想要的只是 Powershell 中的确切内容,以便两个输出都相同:
clearString="test"
payloadDigest=`echo -n "$clearString" | openssl dgst -binary -sha256 | openssl base64 `
echo ${payloadDigest}
Run Code Online (Sandbox Code Playgroud)
在 powershell 中,我可以使用以下脚本以十六进制形式获取 SHA256,但随后很难将其作为二进制数据获取:
$ClearString= "test"
$hasher = [System.Security.Cryptography.HashAlgorithm]::Create('sha256')
$hash = $hasher.ComputeHash([System.Text.Encoding]::UTF8.GetBytes($ClearString))
$hashString = [System.BitConverter]::ToString($hash)
$256String= $hashString.Replace('-', '').ToLower()
$sha256String="(stdin)= "+$256String
$sha256String
Run Code Online (Sandbox Code Playgroud)
然后,我可以使用 [Convert]::ToBase64String($Bytes) 转换为 base64,但在将其传递给 base64 转换之前,如何获得类似于 bash 输出的二进制数据。
我的 NodeJS 和 Python 脚本没有返回相同的哈希值,是什么导致了这个问题?
节点.js
const { createHmac } = require("crypto");
var message = 'v1:1583197109:'
var key = 'Asjei8578FHasdjF85Hfjkasi875AsjdiAas_CwueKL='
const digest = Buffer.from(key, "base64");
const hash = createHmac("sha256", digest)
.update(message)
.digest("hex");
console.log(hash)
> 7655b4f816dc7725fb4507a20f2b97823979ea00b121c84b76924fea167dcaf7
Run Code Online (Sandbox Code Playgroud)
蟒蛇3
message = 'v1:1583197109:'
key = 'Asjei8578FHasdjF85Hfjkasi875AsjdiAas_CwueKL=' + '=' #add a "=" to avoid incorrect padding
digest = base64.b64decode(key.encode('utf-8'))
hash_ = hmac.new(digest, message.encode('utf-8'), hashlib.sha256)
hash_result = hash_.hexdigest()
print(hash_result)
> c762b612d7c56d3f9c95052181969b42c604c2d41b7ce5fc7f5a06457e312d5b
Run Code Online (Sandbox Code Playgroud)
我想这可能是额外的=以避免不正确的填充,但我的密钥以单个=结尾。
oauth_signature我正在尝试为 API 调用生成一个。使用Postman,我生成了如下代码
import requests
import json
url = "https://xxxxxxxxxxxx"
payload = json.dumps({
"key1": "value",
"Key2": "value2"
})
headers = {
'Authorization': 'OAuth realm="xxxxxxxx",
oauth_consumer_key="xxxxxxxxxxxxxxx",
oauth_token="xxxxxxxxxxxx",
oauth_signature_method="HMAC-SHA256",
oauth_timestamp="1628552790",
oauth_nonce="xxxxxxxx",
oauth_version="1.0",
oauth_signature="xxxxxxxxxxxxxxx"',
'Content-Type': 'application/json',
'Cookie': 'NS_ROUTING_VERSION=LAGGING'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
Run Code Online (Sandbox Code Playgroud)
我想使用 Python 来生成oauth_signaturePostman 自动生成的文件,而无需太多关于如何生成的文档。
我目前正在研究低内存嵌入式系统的固件更新机制。
系统的一部分需要在发送文件之前对二进制文件进行哈希处理(使用 SHA-256)(添加了其他安全功能,但不会影响此问题)。设备必须在验证该哈希值之前对其进行验证,但内存非常低。它将接收小块的数据,我想知道是否可以“即时”计算部分哈希,以避免在完全传输后再次加载整个二进制文件。
举个例子,假设要散列的数据是“part1part2part3”。完整数据的哈希为“hash”,“part1”的哈希为“hash1”,“part2”的哈希为“hash2”,“part3”的哈希为“hash3”。
我可以执行任何数学运算将部分哈希值转换为完整哈希值吗?就像是
hashReceived = hash
tempHash = operation(hash1,hash2)
tempHash = operation(tempHash, hash3)
if(hashReceived == tempHash)
... continue
else
... fail
Run Code Online (Sandbox Code Playgroud)
我正在寻找 SHA-256 的数学属性(类似于分配属性),它可以允许这种行为而不破坏任何 SHA-256 属性。
我想将标头和负载的 SHA256 摘要添加到我的 RPM 包中。
目前,它正在使用 sha1 摘要进行构建。
下面是输出
rpm --checksig --verbose pkg_name.rpm
Header SHA1 digest: OK
MD5 digest: OK
Run Code Online (Sandbox Code Playgroud)
环境-RHEL6
这是我到目前为止所尝试的
%_source_filedigest_algorithm 8
%_binary_filedigest_algorithm 8
Run Code Online (Sandbox Code Playgroud)
%define _source_filedigest_algorithm 8
%define _binary_filedigest_algorithm 8
Run Code Online (Sandbox Code Playgroud)
但上述解决方案都不适合我,重建后我仍然看到我的包正在使用 sha1 和 md5 作为摘要算法进行构建。
请注意上述每个解决方案的命令输出rpm --showrc | grep "digest_algo"如下
-13: _binary_filedigest_algorithm 8
-13: _source_filedigest_algorithm 8
Run Code Online (Sandbox Code Playgroud)