我需要计算一个大文件(或其中一部分)的SHA-256哈希值.我的实现工作正常,但它比C++的CryptoPP计算慢得多(25分钟与10分钟~30GB文件).我需要的是在C++和Java中类似的执行时间,因此哈希几乎可以在几乎同时准备好.我也尝试了Bouncy Castle实现,但它给了我相同的结果.这是我如何计算哈希:
int buff = 16384;
try {
RandomAccessFile file = new RandomAccessFile("T:\\someLargeFile.m2v", "r");
long startTime = System.nanoTime();
MessageDigest hashSum = MessageDigest.getInstance("SHA-256");
byte[] buffer = new byte[buff];
byte[] partialHash = null;
long read = 0;
// calculate the hash of the hole file for the test
long offset = file.length();
int unitsize;
while (read < offset) {
unitsize = (int) (((offset - read) >= buff) ? buff : (offset - read));
file.read(buffer, 0, unitsize);
hashSum.update(buffer, 0, unitsize);
read += unitsize; …Run Code Online (Sandbox Code Playgroud) MD5和SHA-1哈希具有抵御冲突攻击的弱点.SHA256没有,但它输出256位.我可以安全地获取第一个或最后一个128位并将其用作哈希值吗?我知道它会更弱(因为它的位数较少),但否则会有效吗?
基本上我想用它来唯一地识别文件系统中可能有一天包含万亿个文件的文件.我知道生日问题,128位散列应该会产生大约1万亿的机会,万亿个文件会有两个不同的文件具有相同的散列.我可以忍受这些可能性.
我不能忍受的是,如果有人可以轻易地,故意地插入具有相同散列和文件的相同开头字符的新文件.我相信MD5和SHA1这是可能的.
在新系统上,我们需要单向散列来计算来自二进制输入的数字签名(例如,一千字节的文本或更大的文本和二进制文件).需求类似于Scons(构建系统)散列命令行和源文件,以及Git(版本控制系统)如何散列文件以计算存储/同步签名.
回想一下,Scons使用MD5,Git使用SHA-1.
虽然MD5和SHA-1已被"破坏",但Scons和Git都没有专门用于安全性(例如,它不存储密码),因此一般做法仍然认为这些算法可以接受.(当然,由于传统的采用,这部分是合理化的.)
问题:您是否会在新系统中使用SHA256(不是MD5或SHA-1)进行(非加密/安全)单向散列?
关注的是:
我特别感兴趣的是一个与Scons或Git社区一致的答案,"我们会永远保留我们的!" 或者"我们希望尽快转向新哈希!" (我不确定他们的计划是什么?)
我需要经常散列一个大的值数据库.因此,需要快速实现SHA-2哈希.我目前正在使用SHA256.
我现在使用的sha256_transform算法是这样的:http://bradconte.com/sha256_c (下面的代码)
我已经分析了我的代码,这段代码占用了每个哈希值的96%的计算时间,这使得这个功能对我的目标至关重要.
它在一个64字节长的二进制字符串上运行,data[]并输出结果ctx->state.
我要求更快版本的这个功能.请记住,即使是轻微的修改也会对速度造成负面影响.
#define uchar unsigned char
#define uint unsigned int
#define ROTLEFT(a,b) (((a) << (b)) | ((a) >> (32-(b))))
#define ROTRIGHT(a,b) (((a) >> (b)) | ((a) << (32-(b))))
#define CH(x,y,z) (((x) & (y)) ^ (~(x) & (z)))
#define MAJ(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
#define EP0(x) (ROTRIGHT(x,2) ^ ROTRIGHT(x,13) ^ ROTRIGHT(x,22))
#define EP1(x) (ROTRIGHT(x,6) ^ ROTRIGHT(x,11) ^ ROTRIGHT(x,25))
#define SIG0(x) (ROTRIGHT(x,7) ^ ROTRIGHT(x,18) …Run Code Online (Sandbox Code Playgroud) 我想比较sha256.Sum256()的输出,它是[32]字节和[]字节.
我收到错误"不匹配的类型[32]字节和[]字节".我无法将[]字节转换为[32]字节.
有没有办法做到这一点?
为什么这些不一样?
PHP:
$hash = hash('sha256', $userData['salt'] . hash('sha256', $password) );
Run Code Online (Sandbox Code Playgroud)
C#
public static string ComputeHash(string plainText, string salt)
{
// Convert plain text into a byte array.
byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);
byte[] saltBytes = Encoding.UTF8.GetBytes(salt);
SHA256Managed hash = new SHA256Managed();
// Compute hash value of salt.
byte[] plainHash = hash.ComputeHash(plainTextBytes);
byte[] concat = new byte[plainHash.Length + saltBytes.Length];
System.Buffer.BlockCopy(saltBytes, 0, concat, 0, saltBytes.Length);
System.Buffer.BlockCopy(plainHash, 0, concat, saltBytes.Length, plainHash.Length);
byte[] tHashBytes = hash.ComputeHash(concat);
// Convert result into a base64-encoded string.
string hashValue …Run Code Online (Sandbox Code Playgroud) 我在文件file.pem中有一个像这样的CA:
\n-----BEGIN CERTIFICATE-----\nMIIDczCCAlugAwIBAgIHALRRMXUkMTANBgkqhkiG9w0BAQ0FADBHMRswGQYDVQQD\nDBJIdHRwQ2FuYXJ5IFJvb3QgQ0ExEzARBgNVBAoMCkh0dHBDYW5hcnkxEzARBgNV\nBAsMCkh0dHBDYW5hcnkwHhcNMjAwMTE1MDc1MjUwWhcNMzEwMTEyMDc1MjUwWjBH\nMRswGQYDVQQDDBJIdHRwQ2FuYXJ5IFJvb3QgQ0ExEzARBgNVBAoMCkh0dHBDYW5h\ncnkxEzARBgNVBAsMCkh0dHBDYW5hcnkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw\nggEKAoIBAQDpDLS2xbpRfTgCPn9Xz0PdWNdppo7vUltGQlzJfD0FQZsyiCU3sYAe\noRGaInwgS4knBEt/9hxaLC8ivz9UlXWIhg8Xy4g+J463HfD4kP2fQElHfo+SlFwc\nflkIVKgOB/rMgFMp6LH9YP+bmYMy3ndXYkTkYAGL6Q2EWO90HQLYkt2pm5ij7755\nvp8Dksc7LHnHo0sqzrpB953Sx5dVTSyQ91fU3scxo8xvcJQG/vYfbEJA6rZunlLO\n3NG8i8JhEYpEjWlf7MV0WIjlPk2vMCHKei/Wyd0msrmL12vjOl3IxMSZQn76SZ1k\n+l9E+wuaAw61DnrzD2gkF3yfCNHr8xsrAgMBAAGjZDBiMB0GA1UdDgQWBBQpj7CB\nUKauWN0/B4d2jAQxbmjTpDAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBtjAj\nBgNVHSUEHDAaBggrBgEFBQcDAQYIKwYBBQUHAwIGBFUdJQAwDQYJKoZIhvcNAQEN\nBQADggEBAKjH9gYYRg+BLXqey9FGd7mR5hCC3lB7NfLEyJULlAoLgzdGieXfcwdX\nQe5clq6Wfk35v2VxVBg1j/oxZYZyJxFvWiuJ840FHgOb5kD7qTS7i735PCbAyCVf\nuSTonQw0Ny8gnjoTijjO/Dh0O6j2wr2kIHORdC2H4Kbya7jyriqY/M/tiuolDyBc\n4RWW52pmDdFi+DMvdroRMaE/1fzDiYRB4ongMNLm7fytGTg9Dakhy7o4OC+dmlGm\nmiUEQIACm2cWrfI1/tjwh+BpbXG91i8y8FPA4YZ2iNmF1133dJhjNx66LETOfJA5\n9dZqO1SpbFk4NVpI4UYzfzMdpqw2KgM=\n-----END CERTIFICATE-----\nRun Code Online (Sandbox Code Playgroud)\n我希望具有SHA-256哈希值的哈希值具有如下内容:
\n"certificate_hash": "8eb1ec754c1d04af13efa97da1be05c90f1342e5"\nRun Code Online (Sandbox Code Playgroud)\n但我不知道该怎么做。我知道我的 CA 的十六进制值并尝试检查转换的最终结果,但它 \xe2\x80\x99s 不一样。如何从该 CA 获得 SHA-256 哈希值?
\n签名的 SHA-256 哈希值:
\nB2:62:DC:C4:F2:4A:AA:51:C9:5C:00:6C:0F:27:19:00:DE:42:3D:D3:8C:79:72:89:9A:8D:89:37:84:2E:1E:58\nRun Code Online (Sandbox Code Playgroud)\n签名的 SHA-1 哈希值:
\n84:29:CA:F9:EE:3A:3C:CB:4A:08:42:66:0E:BA:2D:84:FC:B4:E5:51\nRun Code Online (Sandbox Code Playgroud)\n 我正在尝试通过服务器到服务器方法与我的应用程序启用的BigQuery API进行通信.
我已经在这个Google指南上勾选了我在J #中构建我的JWT的所有方框.
我对Base64Url编码了所有必要的东西.
但是,我从谷歌获得的唯一回应是400 Bad Request
"error" : "invalid_request"
Run Code Online (Sandbox Code Playgroud)
我从以下其他SO问题中确认了以下所有问题:
当我使用Fiddler时,我得到了相同的结果.错误消息令人沮丧地缺乏细节!我还能尝试什么?!这是我的代码:
class Program
{
static void Main(string[] args)
{
// certificate
var certificate = new X509Certificate2(@"<Path to my certificate>.p12", "notasecret");
// header
var header = new { typ = "JWT", alg = "RS256" };
// claimset
var times = GetExpiryAndIssueDate();
var claimset = new
{
iss = "<email address of the client id of my app>",
scope = "https://www.googleapis.com/auth/bigquery",
aud = "https://accounts.google.com/o/oauth2/token", …Run Code Online (Sandbox Code Playgroud) 我正在尝试应用HMAC-SHA256来生成Rest API的密钥.
我正在做这样的事情:
def generateTransactionHash(stringToHash)
key = '123'
data = 'stringToHash'
digest = OpenSSL::Digest.new('sha256')
hmac = OpenSSL::HMAC.digest(digest, key, data)
puts hmac
end
Run Code Online (Sandbox Code Playgroud)
输出总是这样:(如果我把'12345'作为参数或'HUSYED815X',我也会得到相同的结果)
?w/{o???p?T????:??a?h??E|q
Run Code Online (Sandbox Code Playgroud)
由于这个原因,API无法正常工作......有人可以帮助我吗?
我试图根据sha256使哈希成为密码值.我已经搜索了这个,但没有关于swift 2的信息.这个解决方案对我没用
func sha256(data:String) -> String {
let data = self.dataUsingEncoding(NSUTF8StringEncoding)!
var digest = [UInt8](count:Int(CC_SHA256_DIGEST_LENGTH), repeatedValue: 0)
CC_SHA256(data.bytes, CC_LONG(data.length), &digest)
let hexBytes = digest.map { String(format: "%02hhx", $0) }
return hexBytes.joinWithSeparator("")
}
Run Code Online (Sandbox Code Playgroud)
它给出错误:使用未解析的标识符CC_SHA256_DIGEST_LENGTH