- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用一个 Web 服务,它在 soap 请求的 header 中需要 wsse 安全性,并且由创建的、随机数和密码摘要组成。 Web 服务器使用这些值来授权真正的请求。
密码摘要是使用网络服务 API 中所述的以下算法创建的:
Password Digest The OASIS Usertoken profile defines and describes the formula that computes the unique Password_Digest string submitted in the XML For Shipping API the password information used in this formula is the base 64 encoding of the SHA-1 hash of the plain text password.
The formula to use to construct the Password_Digest value is
Password_Digest = Base64(SHA-1(Nonce + Created + Base64(SHA-1(Password))))
请注意,上述算法中的 + 符号表示三个字符串的字符串连接:Nonce from xml request、Created from xml request 和密码的 SHA-1 摘要的 Base64 编码。
我正在处理一个已知已成功获得授权的示例 XML 请求。我遇到的问题是,当我尝试使用示例中提供的值重新创建密码摘要时,我得到了不同的密码摘要值。
示例值和预期的 password_digest:
随机数:4ETItj7Xc6+9sEDT5p2UjA==
创建:2014-08-04T10:22:48.994Z
密码:密码2014!
密码摘要:Ug3FRXgyAaWU8SjYHRabnAkn330=
这是我尝试重新创建 password_digest 时尝试的各种方法的输出
string nonce = "4ETItj7Xc6+9sEDT5p2UjA==";
string created = "2014-08-04T10:22:48.994Z";
string password = "Password2014!";
方法一
string passwordDigest = TestCall.encodeBase64SHA1(nonce + created + TestCall.encodeBase64SHA1(password));
private static string encodeBase64SHA1(string phrase)
{
UTF8Encoding encoder = new UTF8Encoding();
SHA1CryptoServiceProvider sha1Hasher = new SHA1CryptoServiceProvider();
byte[] hashedDataBytes = sha1Hasher.ComputeHash(encoder.GetBytes(phrase));
return Convert.ToBase64String(hashedDataBytes);
}
//passwordDigest = z5nyI25z7CBUL7l7UkTH8E8azlQ=
方法二
string passwordDigest = TestCall.encodeBase64SHA1Managed(nonce + created + TestCall.encodeBase64SHA1Managed(password));
private static string encodeBase64SHA1Managed(string phrase)
{
using (SHA1Managed sha1 = new SHA1Managed())
{
byte[] hash = sha1.ComputeHash(Encoding.UTF8.GetBytes(phrase));
return Convert.ToBase64String(hash);
}
}
//passwordDigest = z5nyI25z7CBUL7l7UkTH8E8azlQ=
方法三
string passwordDigest = TestCall.encodeAsciiToBase64SHA1(nonce + created + TestCall.encodeAsciiToBase64SHA1(password));
private static string encodeAsciiToBase64SHA1(string phrase)
{
ASCIIEncoding encoder = new ASCIIEncoding();
SHA1CryptoServiceProvider sha1Hasher = new SHA1CryptoServiceProvider();
byte[] hashedDataBytes = sha1Hasher.ComputeHash(encoder.GetBytes(phrase));
return Convert.ToBase64String(hashedDataBytes);
}
//passwordDigest = z5nyI25z7CBUL7l7UkTH8E8azlQ=
方法四
string passwordDigest = TestCall.encodeBase64SHA1HexString(nonce + created + TestCall.encodeBase64SHA1HexString(password));
private static string encodeBase64SHA1HexString(string phrase)
{
UTF8Encoding encoder = new UTF8Encoding();
SHA1CryptoServiceProvider sha1Hasher = new SHA1CryptoServiceProvider();
byte[] hashedDataBytes = sha1Hasher.ComputeHash(encoder.GetBytes(phrase));
StringBuilder output = new StringBuilder();
for (int i = 0; i < hashedDataBytes.Length; i++)
{
output.Append(hashedDataBytes[i].ToString("X2"));
}
return Convert.ToBase64String(Encoding.UTF8.GetBytes(output.ToString()));
}
//passwordDigest =RjE4REQyRDg5MjFGMkZCNTM2MTMwOEM1MTkzRDc1RTZCNDgwMjhCNQ==
所有方法均未创建与样本匹配的 password_digest。方法 1 - 3 至少创建了与示例具有相同字符数的 password_digest,所以我假设编码在字符串的末尾字节数匹配的意义上是部分正确的,这是否正确?
我的问题是任何人都可以使用提供的示例值帮助重新创建 password_digest 吗?
我只想提一下,这是我第一次使用 ws-security 并且几乎没有接触过 SHA-1 和字符串编码/解码,因此非常感谢任何帮助。
注意:
示例中的 nonce 字符串以“==”结尾,表明它已被编码,Nonce 元素的 xml 模式如下:
<wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">4ETItj7Xc6+9sEDT5p2UjA==</wsse:Nonce>
这表明 nonce 已编码为 base64,因此我尝试再次重新运行这些方法,但使用以下行将 nonce 转换为纯文本
nonce = Encoding.UTF8.GetString(Convert.FromBase64String(nonce));
//nonce = �Dȶ>�s���@�杔�
从结果来看,我认为 API 公司不会创建这样的随机数,或者我对随机数被加密的假设是错误的,或者我没有正确解码它。
我仍然尝试使用 nonce 的新值并得到以下结果
方法一、二
//passwordDigest = WcuTBY2W06vv2/JemRuorgxMCns=
方法三
//passwordDigest = KPHT7/ojTkvI6kJCaojbp0wKFZ4=
方法四
//passwordDigest = NzRBOTM2NUQ2RjAyMjEzN0E1NEVCN0Q0NEExODU2M0U4Q0FEMDkyQg==
因此再次没有成功,方法 3 的结果与方法 1 和 2 不同,这是出乎意料的,因为之前的 nonce 方法 1、2 和 3 给出了相同的结果。
最佳答案
我玩了例子和公式,然后我发现需要先将 nounce 解码为字节,然后再应用公式
这是具有正确结果的完整示例:
class Program
{
static void Main(string[] args)
{
// Base64(SHA-1(Nonce + Created + Base64(SHA-1(Password))))
string nonce = "4ETItj7Xc6+9sEDT5p2UjA==";
string createdString = "2014-08-04T10:22:48.994Z";
string password = "Password2014!";
string basedPassword = System.Convert.ToBase64String(SHAOneHash(Encoding.UTF8.GetBytes(password)));
byte[] combined = buildBytes(nonce, createdString, basedPassword);
string output = System.Convert.ToBase64String(SHAOneHash(combined));
Console.WriteLine("result is: " + output); // Ug3FRXgyAaWU8SjYHRabnAkn330=
Console.ReadKey();
}
private static byte[] buildBytes(string nonce, string createdString, string basedPassword)
{
byte[] nonceBytes = System.Convert.FromBase64String(nonce);
byte[] time = Encoding.UTF8.GetBytes(createdString);
byte[] pwd = Encoding.UTF8.GetBytes(basedPassword);
byte[] operand = new byte[nonceBytes.Length + time.Length + pwd.Length];
Array.Copy(nonceBytes, operand, nonceBytes.Length);
Array.Copy(time, 0, operand, nonceBytes.Length, time.Length);
Array.Copy(pwd, 0, operand, nonceBytes.Length + time.Length, pwd.Length);
return operand;
}
public static byte[] SHAOneHash(byte[] data)
{
using (SHA1Managed sha1 = new SHA1Managed())
{
var hash = sha1.ComputeHash(data);
return hash;
}
}
}
关于C# 使用 SHA-1 和 Base64 编码 wsse 安全 password_digest 不匹配服务器 password_digest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25262909/
安全服务 API 似乎不允许我直接计算哈希。有很多公共(public)领域和自由许可的版本可用,但如果可能的话,我宁愿使用系统库实现。 可以通过 NSData 或普通指针访问数据。 哈希的加密强度对我
我有一堆大对象,以及它们的结构和它们的向量。有时检查复合对象的完整性很重要;为此,我正在使用对象的 Sha256“签名”。 至少有两种方法可以定义复合对象的签名:通过计算组件串联的sha,或者通过计算
研究了一个 cpu 矿工的源代码,我发现了这段代码: work->data[20] = 0x80000000; 好吧,我问了编码,他的回答是: “这些值是标准 SHA-2 填充的一部分” 谷歌搜索“s
您是否需要许可证才能将 SHA-1 或 SHA-2 用于商业目的? 最佳答案 它最初由 NSA 为安全 DSA 加密创建,然后被 NIST 采用以维护算法的所有方面以及 SHA(2 和 3)。 这是一
谁能解释一下 SHA-256 和 RIPEMD-160,哪种算法通常更快,性能和空间比较是什么(如果有)?我所说的空间比较并不是指 160 位和 256 位,而是指冲突频率、生产环境中空间要求的差异。
我对 SHA-2 和 SHA-256 之间的区别有点困惑,并且经常听到它们互换使用。我认为 SHA-2 是哈希算法的“家族”,而 SHA-256 是该家族中的特定算法。任何人都可以消除困惑。 最佳答案
我正在尝试从 SHA-1 更改为 SHA-512 以获得更好的安全性,但我不完全清楚如何进行更改。 这是我使用 SHA-1 的方法: public static String sha1Convert(
在我的 C# 应用程序中,我使用 RSA 对文件进行签名,然后再由上传者上传到我公司的数据库中,在这里我必须选择 SHA-1 或 SHA-2 来计算哈希值。与编程中的任何其他组件一样,我知道必须有一个
我正在研究 SHA1 、 SHA-256 、 SHA-512 在不同处理器上的速度(计算哈希的时间) 这些散列算法可以分解为跨多个核心/线程运行吗? 最佳答案 如果您想将计算单个哈希的执行并行化(无论
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 9年前关闭。 Improve this que
这个问题在这里已经有了答案: SHA2 password hashing in java (4 个答案) 关闭 9 年前。 我需要计算文件的 SHA-2 或 SHA-3。我没有提交任何代码示例来说明
在我的应用中,之前开发者已经使用openssl version 1.0.1e [#include openssl/sha.h]并且已经使用了函数 unsigned char *SHA(const un
我正在尝试实现 SHA-2加密而不是 SHA-1 . 为此,我知道这两种哈希算法之间的位数不同,这让我很困惑。 如何实现这一目标以及我需要在哪些部分进行必要的更改? 我可以使用来自 Java、Pyth
我目前正在使用 SHA-1。我像下面的代码一样使用它,但我想将它更改为 SHA-256。 public String sha1Encrypt(String str) { if(str == nul
我想将一些 Java 代码转换为 C#。 Java 代码: private static final byte[] SALT = "NJui8*&N823bVvy03^4N".getBytes()
我的程序使用 SHA-1 证书进行 SSL 连接。 SHA-2 证书现在已被一些网络服务(Gmail)广泛使用。这会导致在电子邮件通知设置期间阻止与 SMTP 服务器的传入连接。 为了发送电子邮件,我
我在提交中生成差异/更改,以便我可以将其上传到 ReviewBoard。 我使用了“git show d9f7121e8ebd4d1f789dab9f8214ada2h480b9cf”。它给了我 di
我刚刚从这个 HN-post 了解到 git 正在转向新的散列算法(从 SHA-1 到 SHA-256 ) 我想知道是什么让 SHA-256 最适合 git 的用例。 是否有任何/许多强有力的技术原因
是的,我需要降级到 SHA-1 以增加对项目中旧浏览器的兼容性。 有没有办法做到这一点? 我正在使用 Linux Centos 6.5 和 Apache/2.2.15。 我有 3 个文件: SSLCe
在 TLS1.1 和 TLS1.2 中,Cipher(rsa-with-aes-128-cbc-sha) 将使用哪个 Digest(SHA1 或 SHA256)? 最佳答案 根据官方openssl w
我是一名优秀的程序员,十分优秀!