我发现我们可以用 CommonCrypto 哈希一些字符串。我看到了一些例子,但他们不使用盐。如何将 SHA256 与盐一起使用?
下面的代码使用 HMAC SHA256 生成签名哈希。此代码在 Debian Jessie 和 Ubuntu 16.04(OpenSSL 1.0.2g 2016 年 3 月 1 日)上编译并运行良好。
\n\n#include <openssl/evp.h>\n#include <openssl/hmac.h>\n#include <iomanip>\n#include <iostream>\n#include <string>\n#include <sstream>\n\nusing namespace std;\n\nstring HMAC256(string data, string key)\n{\n stringstream ss;\n HMAC_CTX ctx;\n unsigned int len;\n unsigned char out[EVP_MAX_MD_SIZE];\n HMAC_Init(&ctx, key.c_str(), key.length(), EVP_sha256());\n HMAC_Update(&ctx, (unsigned char*)data.c_str(), data.length());\n HMAC_Final(&ctx, out, &len);\n HMAC_cleanup(&ctx); \n for (unsigned int i = 0; i < len; i++)\n {\n ss << setw(2) << setfill(\'0\') << hex << static_cast<int> (out[i]);\n }\n return ss.str();\n}\n\nint main()\n{\n cout << …Run Code Online (Sandbox Code Playgroud) 下面的代码hashlib.sha256()与我sha256_test()用原始 python 编写的函数在哈希率性能方面进行了比较。
from time import time_ns as time\nimport hashlib\n\ndef pad512(bytes_):\n L = len(bytes_)*8\n K = 512 - ((L + 1) % 512)\n padding = (1 << K) | L\n return bytes_ + padding.to_bytes((K + 1)//8, \'big\')\n\ndef mpars (M):\n chunks = []\n while M:\n chunks.append(M[:64])\n M = M[64:]\n return chunks\n\ndef sha256_transform(H, Kt, W):\n a, b, c, d, e, f, g, h = H\n # Step 1: Looping\n for t in range(0, 64):\n T1 = h …Run Code Online (Sandbox Code Playgroud) 在 macOS (Mojave) 上,“shasum”命令不是有一个选项,它只返回没有文件名的哈希值吗?
$ shasum -a 256 archive.tar.gz
35fe34e225a06d......00e72ee61a437b7226f9f archive.tar.gz
Run Code Online (Sandbox Code Playgroud)
我当前在 macOS 的默认状态下工作的解决方法(无需额外安装):
$ shasum -a 256 archive.tar.gz | awk '{ print $1 }'
35fe34e225a06d......00e72ee61a437b7226f9f
Run Code Online (Sandbox Code Playgroud)
$ php -r "echo hash_file('sha256', 'archive.tar.gz'), PHP_EOL;"
35fe34e225a06d......00e72ee61a437b7226f9f
Run Code Online (Sandbox Code Playgroud)
但是,如果有一个命令选项,我想让它更简单。
是否有任何命令选项或者我是否必须为变通方法创建别名?
我正在使用 SHA256 来获取散列的十六进制字符串。使用常规字符时它工作得很好,但是当要散列的字符串包含重音符号/变音符号时,我在 C# 和 T-SQL 中会得到不同的结果。我更愿意在 SQL Server 端进行更改。
\n\nC#
\n\nusing (SHA256 sha2 = SHA256.Create()) \n{\n var hash = sha2.ComputeHash(Encoding.UTF8.GetBytes(fullAddress));\n string hexString = string.Empty;\n\n for (int i = 0; i < hash.Length; i++)\n {\n hexString += hash[i].ToString("X2"); //Convert the byte to Hexadecimal representation, Notice that we use "X2" instead of "X"\n }\n\n sha2.Dispose();\n return hexString;\n}\nRun Code Online (Sandbox Code Playgroud)\n\nSQL
\n\ndeclare @fullAddress nvarchar(500)\nset @fullAddress = \'MU\xc3\x91OZ\'\nselect CONVERT([varchar](256), HASHBYTES(\'SHA2_256\', @fullAddress), 2) \nRun Code Online (Sandbox Code Playgroud)\n 我想使用 JavaScript为某些key和message前端计算基于 SHA256 的 HMAC 。在 Python 中很容易完成,如下所示:
import hmac
h = hmac.new(b'key', b'message', 'sha256')
print(h.hexdigest())
Run Code Online (Sandbox Code Playgroud)
我在 NodeJS 中搜索并找到了一些东西,但不能在前端做同样的事情(我的意思是在用户的浏览器中),我想我需要捆绑所需的库并做这些事情,但不知道如何做。
我遇到过 Java 程序使用 RSA/ECB/OAEPWithSHA-256AndMGF1Padding 加密文本的情况。
我需要在 C# 中解密它。
Java 中的加密和解密工作正常。
使用 RSA/ECB/OAEPWithSHA-1AndMGF1Padding 在 Java 中加密并在 C# 中解密工作得非常好。
但是,使用 Java 中的 RSA/ECB/OAEPWithSHA-256AndMGF1Padding 加密和 C# 中的 OaepSHA256 解密会出现错误:参数不正确。
用于加密的Java代码:
public static String encrypt(KeyPair keypair, String data) throws NoSuchAlgorithmException, NoSuchPaddingException,
InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {
Cipher c = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
//Cipher c = Cipher.getInstance("RSA/ECB/OAEPWithSHA-1AndMGF1Padding");
c.init(Cipher.ENCRYPT_MODE, keypair.getPublic());
return Base64.getEncoder().encodeToString(c.doFinal(data.getBytes()));
}
Run Code Online (Sandbox Code Playgroud)
解密的C#代码:
public string DecryptRsa(byte[] encryptedBytes, X509Certificate2 x509Certificate2, RSAEncryptionPadding rSAEncryptionPadding)
{
var text = string.Empty;
using (RSACng csp = (RSACng)x509Certificate2.GetRSAPrivateKey())
{
byte[] bytesDecrypted = csp.Decrypt(encryptedBytes, rSAEncryptionPadding); …Run Code Online (Sandbox Code Playgroud) 我想记录脚本哈希值以实施内容安全策略。我已经能够使用以下代码在 python 中生成哈希值:
import hashlib
import base64
string='''
//<![CDATA[
var theForm = document.forms['ctl00'];
if (!theForm) {
theForm = document.ctl00;
}
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
//]]>
'''
# encode as UTF-8
string_UTF8 = string.encode('utf-8')
# hash the message
hash_string = hashlib.sha256(string_UTF8).digest()
# base64 encode
result = base64.b64encode(hash_string)
print('sha256-' + result.decode('utf-8'))
Run Code Online (Sandbox Code Playgroud)
我怎样才能用 JavaScript 做到这一点?
我试图在Windows上生成数字签名(来自XP SP3,但目前正在使用Windows 7进行测试),其中CryptoAPI将与以下openssl命令兼容:
openssl dgst -sha256 -sign <parameters> (for signing)
openssl dgst -sha256 -verify <parameters> (for validation)
Run Code Online (Sandbox Code Playgroud)
我想使用Windows"MY"密钥库中的私钥进行签名.
我设法使用SHA1摘要算法使用以下CryptoAPI函数签署文件(为简洁省略参数):
CertOpenStore
CertFindCertificateInStore
CryptAcquireCertificatePrivateKey
CryptCreateHash (with CALG_SHA1)
CryptHashData
CryptSignHash
Run Code Online (Sandbox Code Playgroud)
生成的签名与"openssl dgst -sha1 -verify"兼容(一旦字节顺序颠倒).
我的问题是:当我尝试将CALG_SHA_256与CryptCreateHash一起使用时,它会因错误80090008(NTE_BAD_ALGID)而失败.通过谷歌搜索左右,我发现,我需要使用特定的提供者(PROV_RSA_AES),而不是默认的一个.由于我有一个提供者句柄,我还需要用CryptGetUserKey替换CryptAcquireCertificatePrivateKey.所以我修改了我的程序,看起来像:
CryptAcquireContext (with PROV_RSA_AES)
CertOpenStore
CertFindCertificateInStore
CryptGetUserKey
CryptCreateHash (with CALG_SHA256)
CryptHashData
CryptSignHash
Run Code Online (Sandbox Code Playgroud)
不幸的是,这没有按预期工作:CryptGetUserKey失败,错误8009000D(NTE_NO_KEY).如果我删除了CryptGetUserKey调用,程序将一直运行,直到CryptSignHash失败,错误80090016(NTE_BAD_KEYSET).我知道密钥集确实存在并且工作正常,因为我能够使用它来签署SHA1摘要.
我尝试使用从CertFindCertificateInStore获得的证书上下文中的信息再次获取上下文:我能做的最好的是成功的CryptGetUserKey调用,但CryptSignHash总是会失败并出现相同的错误.
我试图使用的私钥是2048位长,但我不认为它是一个问题,因为它与SHA1摘要一起使用.我很茫然,所以任何建议都会非常受欢迎!
sha256 ×10
hash ×3
python ×3
base64 ×2
c# ×2
hmac ×2
javascript ×2
bash ×1
c++ ×1
commoncrypto ×1
cryptoapi ×1
cryptography ×1
debian ×1
encode ×1
encryption ×1
frontend ×1
hashbytes ×1
hashlib ×1
macos ×1
openssl ×1
python-3.x ×1
rsa ×1
sql-server ×1
swift ×1