好的,所以我并没有完全迷失 DKIM。我知道使用公钥等进行编码和设置 DNS 记录的一般规则。我遇到的问题是合并出站电子邮件的“动态”签名并注入到我的标头中,因为我的 MTA 是自定义的,用以下语言编写python是从头开始的,不是开箱即用的。想知道是否有人有一个使用 DKIM 发送一封电子邮件的小 Python 示例,并完成所有操作。就像使用您的私钥生成 256 位加密体一样,该私钥与您的 dns 设置中的姊妹(公钥)密钥相匹配。
我add_custom_command在Util.cmake脚本中使用 CMake 下载几个文件,这些文件稍后将在构建过程中使用。然而,这些文件可能会发生变化,我想添加一种方法来根据提供的值(在 CMake 内)检查本地文件的哈希值,以决定是否需要重新下载文件。
目前,一旦文件被下载,CMake将不会考虑重新下载它,因为该文件已经存在于本地。
将来,我想提供该文件的 MD5 / SHA256 校验和,并确保本地文件是正确的。
这是我想要做的(这只是一个概念示例):
add_custom_command( OUTPUT ./file.dat
COMMAND wget ${FILE_PATH}
)
if (opt_HASH)
add_custom_command(OUTPUT ${local_HASH}
COMMAND local_HASH=$(sha256sum ./file.dat)
DEPENDS ./file.dat
)
if (NOT ${opt_HASH} STREQUAL ${local_HASH})
# throw ERROR
endif()
endif()
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我现在只想检测不匹配,甚至不想自动下载更改的文件。显然是opt_HASH通过 CMake 提供的,但重要的是这个调用需要依赖于已经下载的文件,我似乎能够通过更简单的调用来做到这一点FILE()。
PS:如果更容易的话,我也可以使用MD5over SHA256。
我在 Nodejs 上有这段代码,我需要像 Java 一样编写,但结果不同。我认为问题出在十六进制编码上。但我不明白它是如何工作的。
Nodejs代码:
crypto.createHash('sha256').update(seed, 'hex').digest()
Run Code Online (Sandbox Code Playgroud)
Java代码:
digest = MessageDigest.getInstance("SHA-256");
byte[] encodedhash = digest.digest(seedString);
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 SHA256 实现 HMAC 验证以与 API 交互。我找到了hmac和sha2板条箱,根据他们的示例,它们将非常适合我的目的。
我有这个代码:
extern crate hmac;
extern crate sha2;
use hmac::{Hmac, Mac};
use sha2::{Digest, Sha256};
pub fn verify(message: &[u8], code: &[u8], key: &[u8]) -> bool {
type HmacSha256 = Hmac<Sha256>;
let mut mac = HmacSha256::new_varkey(key).unwrap();
mac.input(message);
let result = mac.result().code();
return result == code;
}
#[cfg(test)]
mod tests {
use verify;
#[test]
fn should_work() {
assert!(verify(
b"code=0907a61c0c8d55e99db179b68161bc00&shop=some-shop.myshopify.com×tamp=1337178173",
b"4712bf92ffc2917d15a2f5a273e39f0116667419aa4b6ac0b3baaf26fa3c4d20",
b"hush"
), "Returned false with correct parameters!");
}
#[test]
fn shouldnt_work() {
assert!( …Run Code Online (Sandbox Code Playgroud) 我正在尝试将加密货币交换 API 从 JavaScript 移植到 Rust。JavaScript 版本进行身份验证并连接。有效负载和密钥使用 Hmac Sha256 进行签名并编码为 Base64。下面是 JavaScript 的工作实现。
var param = "test";
var privateKey = "secret";
var signature = crypto.createHmac('sha256', new Buffer(privateKey, 'utf8'))
.update(param)
.digest('base64');
Run Code Online (Sandbox Code Playgroud)
它返回以下签名:Aymga2LNFrM+tnkr6MYLFY2Jou46h2/Omogeu0iMCRQ=
在 Rust 中,我使用 Hmac SHA256 并将结果编码回 Base64,但我无法接近预期的签名。这是我两天来最好的尝试:
extern crate ring;
extern crate data_encoding;
extern crate hex;
use ring::{digest, hmac};
use data_encoding::BASE64;
use hex::encode as hex_encode;
fn main() {
let secret_key = "secret";
let payload = "test";
let signed_key = hmac::SigningKey::new(&digest::SHA256, secret_key.as_bytes());
let signature = hex_encode(hmac::sign(&signed_key, payload.as_bytes()).as_ref());
let b64_encoded_sig …Run Code Online (Sandbox Code Playgroud) 我有一个 Angular 项目,我必须在其中实现数据传输付款。但我无法生成付款标志。
我正在按照此链接(在此处输入链接描述)给出的流程来生成标志。
但我无法实现它。
我正在使用 Angular 库 crypto-js 生成 HMAC-SHA-256 签名字符串。
这是我的 JavaScript 代码。
const merchantId = 'xxxxxxx';
const refNo = '1234567890';
const amount = 0;
const currency = 'CHF';
const theme = 'DT2015';
const paymentmethod = 'VIS';
const stringSs = merchantId+amount+currency+refNo;
const base = 16;
// My Hmac Key
const s = 'fa3d0ea1772cf21e53158283e4f123ebf1eb1ccfb15619e2fc91ee6860a2e5e48409e902b610ce5dc6f7f77fab8affb60d69b2a7aa9acf56723d868d36ab3f32';
// Step 1: Code to generate hex to byte of hmac key
const a = s.replace(/../g, '$&_').slice (0, -1).split ('_').map ((x) …Run Code Online (Sandbox Code Playgroud) 我想在 Python 3.8.5 上使用 AES 256 为我的明文编写加密,但是当我执行它时,我收到错误ValueError:不正确的 AES 密钥长度(64 字节)我的代码中是否有问题?
plaintext = "ABC123"
secret_key = "6789045129812345"
secret_iv = "4567891122315731"
key = hashlib.sha256(str(secret_key).encode('utf-8')).hexdigest()
iv = hashlib.sha256(str(secret_iv).encode('utf-8')).hexdigest()
substring_iv = iv[:16]
cipher_config = AES.new(key.encode("utf-8"), AES.MODE_CBC, substring_iv.encode("utf-8"))
results = base64.b64encode(cipher_config)
print("results : "+results)
Run Code Online (Sandbox Code Playgroud) 我有以下类,它计算我想要发送到服务器的文件的哈希值。
public class GetHashCode
{
public static string CalculateHash()
{
try
{
var filePath = "\\\\abc\\abc-fs\\_My-Data\\user\\Documents\\test.jpg";
var fileStream = File.Open(filePath, FileMode.Open,
FileAccess.Read, FileShare.ReadWrite);
var hashProvider = SHA256.Create();
var buffer = hashProvider.ComputeHash(fileStream);
return Convert.ToBase64String(buffer);
}
catch (Exception err)
{
Console.WriteLine(err);
return null;
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我通过另一个应用程序将文件发送到服务器时,我可以看到此操作的哈希与我使用上面的代码创建的哈希有点不同:
来自其他应用程序的哈希值(正确的):
R7av4w6Ow3M3z%252bpKPBBpojzvLvyl6aM0Q7q%252bJ%252fDvLPQ%253d
Run Code Online (Sandbox Code Playgroud)
用我的代码生成的哈希:
R7av4w6Ow3M3z+pKPBBpojzvLvyl6aM0Q7q+J/DvLPQ=
Run Code Online (Sandbox Code Playgroud)
所以似乎特殊字符的编码有问题,但我还不知道如何解决这个问题。有人可以帮忙吗?提前致谢!
我必须将文件从一台服务器传输到另一台服务器。自动化脚本将在每晚 12 点进行传输。我想比较传输前文件的 md5 哈希值和传输后文件的 md5 哈希值。md5 哈希值足够用于此目的吗?
或者我应该使用 sha256 ?
我主要担心的是 sha256 比 md5 慢得多。我的文件大小约为每个文件 1 GB。
所以,我正在使用Java验证Facebook的signed_request.不幸的是,我一直在遇到验证过程中的问题.我查看了这个文档,并模拟了他们的算法,但没有成功.我也遵循了本教程,并继续提出我的计算签名与Facebook发送的签名不同.
或者至少,这就是String.equals()告诉我的.
所以我决定再捅一下.
我将其设置为迭代计算签名中的字节和提供的字节.低,看,我的签名的前32个字节完全匹配他们.它只是缺少另外400多字节的数据.
那时,我觉得我应该更好地了解到底发生了什么.我查了一下SHA-256,发现确实只创建了32个字节的信息.那么我留下了超过400字节的数据,Facebook声称是使用HMAC SHA-256算法生成的.我想我应该比较SHA-256的最大长度与我散列数据的长度,但只是表明,有办法,方式,方法有很多剩余空间(邮件大小:575个字节;最大尺寸:2.305843009213694 x 10 ^ 18字节).
Facebook会搞砸吗?或者我错过了什么?
编辑
这是我用来散列数据的函数.我传入我的facebook密码(用于密钥)和base64url编码的JSON对象(用于数据).它始终返回长度为32的字节数组,其数据与facebook提供的签名的前32个字节相匹配.
private byte[] hmacSHA256(String data, String key) throws Exception {
SecretKeySpec secretKey = new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA256");
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(secretKey);
mac.update(data.getBytes("UTF-8"));
byte[] hmacData = mac.doFinal();
return hmacData;
}
Run Code Online (Sandbox Code Playgroud)