2010-03-17 54 views
5

Tôi đang chạy một số thử nghiệm so sánh thuật toán sha1 được triển khai trong javascript - nhận được từ http://pajhome.org.uk/crypt/ - với việc triển khai trong C#.Thuật toán SHA1 base64 trong javascript và C#

Sử dụng C# để có được băm cho { 'phương pháp': 'people.get'} Tôi đang sử dụng tuyên bố này:

Convert.ToBase64String(new System.Security.Cryptography.SHA1CryptoServiceProvider().ComputeHash(Encoding.ASCII.GetBytes("{'method':'people.get'}"))); 

mà mang lại cho tôi Qy95a0ShZqhbNdt6IF8qNf72jX0=

Trong javascript tôi nhận được gần như giống nhau: Qy95a0ShZqhbNdt6IF8qNf72jX0 sử dụng câu lệnh:

b64_sha1("{'method':'people.get'}"); 

Trong trường hợp javascript, băm không kết thúc với một (=) dấu bằng.

Sự khác biệt này có thể khiến tôi gặp khó khăn khi xác thực đối với máy chủ không?

Trong trường hợp của tôi, như nhiều người trong số các bạn có thể biết, câu tôi tính toán giá trị băm nằm bên trong cơ thể http và máy chủ sẽ kiểm tra nó.

Cảm ơn

Trả lời

5

Tùy thuộc vào người nhận nhưng hãy thử giải mã kết quả của bạn từ javascript bằng C# và bạn sẽ nhận được ngoại lệ. Dấu = có ở đó để đưa kết quả đến đúng độ dài.

http://en.wikipedia.org/wiki/Base64

+0

Ok, dựa trên thông tin đó tôi thấy bây giờ dấu =, như bạn đã chỉ ra, được sử dụng để đệm thư. Cảm ơn – Andres

+3

@Andres: Bạn có thể cập nhật dòng 15 của tệp 'sha1.js' từ pajhome.org.uk để sử dụng' = 'làm ký tự đệm. – LukeH

+0

Có, trong khi tôi đang viết câu trả lời của riêng tôi, bạn đã viết nhận xét này. Cảm ơn :) – Andres

4

Các sha1.js từ lib tôi đã đề cập trong câu hỏi của tôi, có một biến toàn cầu gọi b64pad, được sử dụng cho mục đích của padding. Theo mặc định, giá trị của nó là "". Thay đổi thành "=" cho hàm băm chính xác được tính bởi C# API