我在 python 中使用 hashlib 库,在 ruby 中使用 Digest::SHA256.hexdigest 库
我试过用python,
import hashlib
hasher = hashlib.sha256()
hasher.update("xyz")
hasher.digest()
hash = hasher.hexdigest()
print hash
Run Code Online (Sandbox Code Playgroud)
输出:3608bca1e44ea6c4d268eb6db02260269892c0b42b86bbf1e77a6fa16c3c9282
我试过用红宝石,
require 'digest'
hasher = Digest::SHA256.digest "xyz"
hash = Digest::SHA256.hexdigest(hasher)
Run Code Online (Sandbox Code Playgroud)
输出:“18cefdae0f25ad7bb5f3934634513e54e5ac56d9891eb13ce456d3eb1f3e72e8”
谁能帮助我理解为什么会有区别?如何获得与 python 相同的值?
我正在尝试在 OAUTH 请求期间验证 Shopify HMAC,但我生成的哈希与作为请求的一部分提供的哈希不匹配。
我发现了一些其他线程,但它们要么已经过时,因为文档现在声明它使用 GET 请求而不是 POST,或者在 java 中没有得到答复。
我的 C# 代码如下:
string key = "mysecretkey";
string message = string.Format("shop={0}×tamp={1}", shop, timestamp);
System.Text.ASCIIEncoding encoding = new ASCIIEncoding();
byte[] keyBytes = encoding.GetBytes(key);
byte[] messageBytes = encoding.GetBytes(message);
System.Security.Cryptography.HMACSHA256 cryptographer = new System.Security.Cryptography.HMACSHA256(keyBytes);
byte[] bytes = cryptographer.ComputeHash(messageBytes);
string digest = BitConverter.ToString(bytes).Replace("-", "");
bool valid = digest == hmac.ToUpper();
Run Code Online (Sandbox Code Playgroud)
我猜消息的构建不正确,但我没有走运就遵循了官方文档。
有人可以帮忙吗?
我正在尝试从公钥证书中读取 sha256。证书如下所示。
我正在运行以下命令来读取 sha256 哈希,但它没有给出正确的结果:
openssl x509 -in test.crt -pubkey -noout | openssl rsa -pubin -outform der | \
openssl dgst -sha256 -binary | openssl enc -base64
Run Code Online (Sandbox Code Playgroud)
我得到了一些错误的值 RTy7aSpufwRDWUudgZCwR5Xc7NETd6Imk4YlzvgKTRU=
正确的值是:
sha256/i1RfARNCYn9+K3xmRNTaXG9sVSK6TMgY9l8SDm3MUZ4=
sha256/7HIpactkIAq2Y49orFOOQKurWxmmSFZhBCoQYcRhJ3Y=
sha256/h6801m+z8v3zbgkRHpq6L29Esgfzhj89C1SyUCOQmqU=
Run Code Online (Sandbox Code Playgroud)
我想知道三个值是如何进来的,是的,只有一个是正确的,但是为了验证这些值,我确实运行了下面给出的示例程序:
public class Main {
public static void main(String[] args) throws IOException {
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
String hostName = "www.google.com";
CertificatePinner certificatePinner = new CertificatePinner.Builder()
.add(hostName, "sha256/pqrmt")
.build();
OkHttpClient client = new OkHttpClient.Builder()
.addNetworkInterceptor(interceptor)
.certificatePinner(certificatePinner)
.build();
Request request = new Request.Builder()
.url("https://" + hostName) …Run Code Online (Sandbox Code Playgroud) 如何在 C# 中正确地对 SHA-256 哈希进行十六进制编码?
private static string ToHex(byte[] bytes, bool upperCase)
{
StringBuilder result = new StringBuilder(bytes.Length * 2);
for (int i = 0; i < bytes.Length; i++)
result.Append(bytes[i].ToString(upperCase ? "X2" : "x2"));
return result.ToString();
}
private string hashRequestBody(string reqBody)
{
string hashString;
using (var sha256 = SHA256Managed.Create())
{
var hash = sha256.ComputeHash(Encoding.Default.GetBytes(reqBody));
hashString = ToHex(hash, false);
}
MessageBox.Show(hashString);
return hashString;
}
Run Code Online (Sandbox Code Playgroud)
我这样做了,但结果与我使用的银行沙箱不同。
测试数据:
{"CorporateID":"BCAAPI2016","SourceAccountNumber":"0201245680","TransactionID":"00000001","TransactionDate":"2017-09-13","ReferenceID":"refID","CurrencyCode":"IDR","Amount":"10000","BeneficiaryAccountNumber":"0201245681","Remark1":"Transfer Test","Remark2":"Online Transfer"}
银行的沙箱结果: e9d06986c1ed6b063bf59aa873030013725c518631deef2b2147e614017c2141
矿: 1c83acc42cf905ca8afba27ef0640c70ad2856a366b57c17cf16f2894327676e
目前,我有一些代码使用本机 OpenSSL 二进制文件使用 SHA256 算法对字节字符串进行签名,该代码调用外部进程,发送参数,并将结果接收回 Python 代码。
当前代码如下:
signed_digest_proc = subprocess.Popen(
['openssl', 'dgst', '-sha256', '-sign', tmp_path],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE
)
signed_digest_proc.stdin.write(original_string)
signed_digest, _ = signed_digest_proc.communicate()
base64.encodestring(signed_digest).decode().replace('\n', '')
Run Code Online (Sandbox Code Playgroud)
当original_string太大时,我可能会遇到结果问题(我认为来自与外部进程的通信),这就是为什么我试图将其更改为仅限 Python 的解决方案:
import hmac, hashlib
h = hmac.new(bytes(key_pem(), 'ASCII'), original_string, hashlib.sha256)
result = base64.encodestring(h).decode().replace('\n', '')
Run Code Online (Sandbox Code Playgroud)
这导致与第一个完全不同的字符串。
在不调用外部进程的情况下实现原始代码的方法是什么?
我正在尝试将同一文件的 SHA-256 哈希值与 Python 和 Java 进行比较。但是,在某些情况下,Python 哈希值具有前导零,而 Java 版本则没有。例如,在两个程序中散列somefile.txt 会产生:
Python: 000c3720cf1066fcde30876f498f060b0b3ad4e21abd473588f1f31f10fdd890
爪哇: c3720cf1066fcde30876f498f060b0b3ad4e21abd473588f1f31f10fdd890
简单地删除前导 0 并进行比较是否安全,或者是否有不产生前导零的实现?
Python代码
def sha256sum(filename):
h = hashlib.sha256()
b = bytearray(128*1024)
mv = memoryview(b)
with open(filename, 'rb', buffering=0) as f:
for n in iter(lambda : f.readinto(mv), 0):
h.update(mv[:n])
return h.hexdigest()
print(sha256sum('/somepath/somefile.txt'))
# 000c3720cf1066fcde30876f498f060b0b3ad4e21abd473588f1f31f10fdd890
Run Code Online (Sandbox Code Playgroud)
Java代码
public static String calculateSHA256(File updateFile) {
MessageDigest digest;
try {
digest = MessageDigest.getInstance("SHA-256");
} catch (NoSuchAlgorithmException e) {
Log.e(TAG, "Exception while getting digest", e);
return null;
}
InputStream …Run Code Online (Sandbox Code Playgroud) 我正在生成以下字符串的 SHA256
{
"billerid": "MAHA00000MUM01",
"authenticators":
[
{
"parameter_name": "CA Number",
"value": "210000336768"
}
],
"customer":
{
"firstname": "ABC",
"lastname": "XYZ",
"mobile": "9344895862",
"mobile_alt": "9859585525",
"email": "abc@billdesk.com",
"email_alt": "abc2@billdesk.com",
"pan": "BZABC1234L",
"aadhaar": "123123123123"
},
"metadata":
{
"agent":
{
"agentid": "DC01DC31MOB528199558"
},
"device":
{
"init_channel": "Mobile",
"ip": "124.124.1.1",
"imei": "490154203237518",
"os": "Android",
"app": "AGENTAPP"
}
},
"risk":
[
{
"score_provider": "DC31",
"score_value": "030",
"score_type": "TXNRISK"
},
{
"score_provider": "BBPS",
"score_value": "030",
"score_type": "TXNRISK"
}
]
}
Run Code Online (Sandbox Code Playgroud)
我从不同来源获得不同的 SHA256 输出。本网站:https ://www.freeformatter.com/sha256-generator.html#ad-output …
我一直在尝试将一些 NodeJS 代码移植到 Java,以便向 API 发出 HMAC 签名的请求。我已经能够将代码简化到编码明显影响输出的程度。
这是我的 JavaScript 代码:
var APIKey = "secret";
var secretByteArray = CryptoJS.enc.Base64.parse(APIKey);
var hash = CryptoJS.HmacSHA256("Message", secretByteArray);
var hashInBase64 = CryptoJS.enc.Base64.stringify(hash);
//alert(hashInBase64);
document.write(hashInBase64);Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/enc-base64.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/hmac-sha256.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/crypto-js.min.js"></script>Run Code Online (Sandbox Code Playgroud)
这是Java代码:
try {
String secret = "secret";
String message = "Message";
byte[] secretByteArray = Base64.getEncoder().encode(secret.getBytes());
//byte[] secretByteArray = Base64.encodeBase64(secret.getBytes("utf-8"), true);
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(secretByteArray, "HmacSHA256");
sha256_HMAC.init(secret_key);
String hash = Base64.getEncoder().encodeToString(sha256_HMAC.doFinal(message.getBytes()));
System.out.println(hash);
}
catch (Exception e){
System.out.println("Error");
}
Run Code Online (Sandbox Code Playgroud)
如果我不将“秘密”编码为 base64,我会得到相同的输出,但我希望使用编码字符串获得相同的结果。我怀疑编码的字节数组有填充或符号差异。
我希望我没有创建重复的问题。我试图寻找已经存在的问题,但我什么也没找到。
我已经成功地设置了一个数据库,其中包含用于登录的用户名、盐和散列密码。为了检查密码,我将生成的散列与数据库之一进行了比较,请参阅下面的代码。
password_hashed_from_user = res[0][0]
salt = res[0][1]
key_generated = hashlib.pbkdf2_hmac('sha256', password.encode('utf-8'), base64.b64decode(salt.encode('utf-8')), 100000, dklen=128)
key_encoded = base64.b64encode(key_generated).decode('utf-8')
if key_encoded != password_hashed_from_user:
logging.debug("Password was wrong:\n{}\n{}".format(key_encoded, password_hashed_from_user))
return "Username and/or password incorrect", False
Run Code Online (Sandbox Code Playgroud)
现在的问题是,我希望用户能够完全匿名地进行操作,这意味着我希望用户能够使用生成的令牌进行识别,而该令牌无法追溯到他的帐户。
因此,我需要将令牌存储在一个单独的表中,而不是与具有凭据的表相关联。为了让用户不能作弊并且每次登录时都向服务器询问新令牌(因此充当新用户),我想根据凭据计算令牌。
所以我想,我可以有一个单独的盐并根据密码创建一个新的哈希(使用与代码示例中相同的方法)。由于密码本身并未存储在服务器上,因此如果没有用户本身的密码,就无法生成此散列。
这样,生成的令牌总是相同的,只要盐不改变。因此,我可以确保始终将特定用户标识为同一用户,而用户可以确保我无法追溯他的操作。
背景
背景是我需要创建一个投票环境,人们必须在这个环境中进行注册和身份验证,以防止重复投票,但投票结果,以及参与等不应追溯到特定用户。由于这是我研究中的一个项目,我不能只使用现有的框架/库。
现在我的问题:
在同一服务器上存储具有不同盐的相同密码的两个单独哈希值是否安全,或者重复是否可以重新创建实际密码?两种盐将与其中一个散列一起存储在一起。另一个散列将在一个单独的、不相关的表中。
在那个级别上,我总是在加密方面遇到一些困难。
当前版本的 git (2.30.0) 是否已经默认使用 SHA256 来计算提交哈希?如果没有,如何为新的 git 存储库启用 SHA-256,以及如何检查某个 git 存储库是否使用 SHA-256 或 SHA-1 作为其提交哈希?