我必须以小端形式生成sha256数据哈希.在使用sha 256算法之前,我想知道是否必须先将其转换为big endian.或者,如果算法是"与endian无关"的.
编辑:对不起,我想我不清楚.我想知道的是:sha256算法需要用某些位填充消息的结尾.第一步是在消息的末尾添加1.然后,用零填充它直到结束.最后,您必须以位为单位添加消息的长度.我想知道的是这个填充是否可以用小端进行.例如,对于640位消息,我可以将最后一个字写为0x280(大端)或0x8002000(小端).这个填充可以用小端进行吗?
我在Ruby on Rails中生成上传图像的校验和(sha256).
upload = params[:file]
data1 = upload.read
data2 = File.read(upload.tempfile)
checksum1 = Digest::SHA256.hexdigest(data1)
checksum2 = Digest::SHA256.hexdigest(data2)
puts checksum1
puts checksum2
Run Code Online (Sandbox Code Playgroud)
最后两个语句返回不同的值.checksum1是通过使用UploadedFile对象读取数据生成的.checksum2是通过从文件系统读取临时文件生成的.
ActionDispatch :: Http :: UploadedFile的对象是否返回比上传文件的内容更多的内容?当我生成写入文件系统的上传文件的校验和时,它与checksum2(临时文件校验和)匹配,而不是与checksum1(UploadedFile.read)匹配.
我假设通过从文件系统读取临时文件生成的校验和更可靠,因为对象(UploadedFile)实现可能会更改.如果需要,可以更轻松地生成文件系统上现有文件的校验和.
那么,校验和差异的原因是什么,哪一个更可靠?
谢谢.
更新1:根据@ pablo-castellazzi的建议,我使用Digest :: SHA256.file(upload.path).hexdigest生成哈希.我们称之为校验和3
checksum3等于checksum1但与checksum2不同
更新2:如果我使用二进制模式读取@ Arsen7提到的文件,那么所有校验和都是相同的.
在从Zend Server CE 5.1升级到Zend Server CE 5.5期间,PHP也从5.3.5升级到5.3.8.在此转换之后,我正在处理的zend应用程序的登录功能突然中断.
试图调试它,看起来好像执行crypt()不反映PHP手册,或者我误解了它.如果我冒险猜测,那就是后者.
我使用一个16字符长的盐作为较大盐的一部分使用SHA256,它在PHP手册中用作示例.
$password = //string entered at login
$salt = '$5$rounds=250000$1234abcd5678defg$';
Run Code Online (Sandbox Code Playgroud)
在我输入密码后输入密码
$hash = crypt($password, $salt);
Run Code Online (Sandbox Code Playgroud)
我得到一个像这样的字符串作为返回值:
$5$rounds=250000$1234abcd5678$tI.Oiz.YwWjIwT3K.SLU8SwUZ9J0/odBCkbE6t0igeB
Run Code Online (Sandbox Code Playgroud)
令我感到困惑的是16字符盐,它是较大部分的一部分(上面的1234abcd5678defg),现在被截断为12个字符.
这是按预期的吗?该crypt()函数现在似乎比以前返回不同的结果 - 通常是PHP版本之间的?更改日志中没有任何内容表明加密算法有任何根本性的变化.
我有一张智能卡,我需要用这个来签名.这是我在stackover中看到的一个大问题.
我不能使用RSACryptoServiceProvider,bkz它不支持RSA-SHA256 alogrithm.
在First,我使用CAPICOM.dll,如下面的代码,
SignedData sed = new SignedData();
sed.Content = "a"; // data to sign
Signer ser = new Signer();
ser.Certificate = cc;
string singnn = sed.Sign(ser, false, CAPICOM_ENCODING_TYPE.CAPICOM_ENCODE_BASE64);
Run Code Online (Sandbox Code Playgroud)
但是没有公钥来验证我的签名值,我无法从capicom.dll获取验证密钥.
之后 ,
我使用X509Certificate2和RSACryptoServiceProvider,如下面的代码,
X509Certificate2 certificate = new X509Certificate2();
// Access Personal (MY) certificate store of current user
X509Store my = new X509Store(StoreName.My, StoreLocation.CurrentUser);
my.Open(OpenFlags.ReadOnly);
// Find the certificate we'll use to sign
RSACryptoServiceProvider csp = null;
foreach (X509Certificate2 cert in my.Certificates)
{
if (cert.Subject.Contains(certSubject))
{
// We found it. …Run Code Online (Sandbox Code Playgroud) 我需要用密钥计算字符串的SHA-256哈希值.我找到了这段代码:
public String computeHash(String input)
throws NoSuchAlgorithmException, UnsupportedEncodingException
{
MessageDigest digest = MessageDigest.getInstance("SHA-256");
digest.reset();
byte[] byteData = digest.digest(input.getBytes("UTF-8"));
StringBuffer sb = new StringBuffer();
for (int i = 0; i < byteData.length; i++) {
sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
}
return sb.toString();
}
Run Code Online (Sandbox Code Playgroud)
用于计算没有密钥的散列.如何用密钥计算?我搜索但是我没有在Android中找到任何解决方案.任何的想法 ?
Iam在尝试使用MAGE.exe和SHA256 RFC 3161时间戳签署clickonce(.application)时出错.
mage.exe -s /path/to/our/.application"-cf certfile -ti [RFC 3161 timestamp]
我收到以下错误:
"内部错误,请稍后再试.参数不正确."
如果我尝试在没有时间戳或SHA1时间戳的情况下进行签名,一切正常.
你能否建议使用SHA256 RFC 3161时间戳的一次应用程序签名点击的正确方法
我正在设计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)
我想这可能是额外的=以避免不正确的填充,但我的密钥以单个=结尾。
我想将标头和负载的 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)