2015-06-05 17 views
5

Tôi đã tạo một Webservice trả về Mã thông báo bảo mật sau khi xác thực thành công.Tại sao hàm băm SHA256 kết thúc bằng "="?

Tuy nhiên khi gỡ lỗi tôi nhận thấy rằng mỗi băm webservice trở kết thúc với "=" như:

"tINH0JxmryvB6pRkEii1iBYP7FRedDqIEs0Ppbw83oc=" 
"INv7q72C1HvIixY1qmt5tNASFBEc0PnXRSb780Y5aeI=" 
"QkM8Kog8TtCczysDmKu6ZOjwwYlcR2biiUzxkb3uBio=" 
"6eNuCU6RBkwKMmVV6Mhm0Q0ehJ8Qo5SqcGm3LIl62uQ=" 
"dAPKN8aHl5tgKpmx9vNoYvXfAdF+76G4S+L+ep+TzU=" 
"O5qQNLEjmmgCIB0TOsNOPCHiquq8ALbHHLcWvWhMuI=" 
"N9ERYp+i7yhEblAjaKaS3qf9uvMja0odC7ERYllHCI=" 
"wsBTpxyNLVLbJEbMttFdSfOwv6W9rXba4GGodVVxgo=" 
"sr+nF83THUjYcjzRVQbnDFUQVTkuZOZYe3D3bmF1D8=" 
"9EosvgyYOG5a136S54HVmmebwiBJJ8a3qGVWD878j5k=" 
"8ORZmAXZ4dlWeaMOsyxAFphwKh9SeimwBzf8eYqTis=" 
"gVepn2Up5rjVplJUvDHtgIeaBL+X6TPzm2j9O2JTDFI=" 

Tại sao một hành vi như vậy?

+2

Khoá SHA là số nguyên, đây có thể là mã hóa [base64] (https://en.wikipedia.org/wiki/Base64) của khóa. Vì khóa là 256 bit, hoặc 32 byte, nó sẽ được mã hóa khoảng 4/3 * 32 ~ = 43 ký tự. –

+0

Tại sao chúng chỉ dài 44 ký tự? Cơ sở nào bạn mã hóa chúng? – pzp

+0

@pzp Câu trả lời ở trên. –

Trả lời

11

Điều này là do bạn không nhìn thấy các byte thô của băm mà mã hóa Base64.

Mã hóa Base64 chuyển đổi khối 3 byte thành khối gồm bốn ký tự. Này hoạt động tốt nếu số lượng byte là chia hết cho 3. Nếu nó không phải là, sau đó bạn sử dụng một padding-nhân vật nên số lượng kết quả nhân vật vẫn còn chia hết cho 4.

Vì vậy:

(no of bytes)%3 = 0 => no padding needed 
(no of bytes)%3 = 1 => pad with == 
(no of bytes)%3 = 2 => pad with = 

Một băm SHA256 là 256 bit, đó là 32 byte. Vì vậy, bạn sẽ nhận được 40 ký tự cho 30 byte đầu tiên, 3 ký tự cho 2 byte cuối cùng và phần đệm sẽ luôn là một =.

+0

Tôi đồng ý với câu trả lời, tất nhiên, nhưng tôi không thể giải thích tại sao các chuỗi trong câu hỏi không phải là tất cả cùng một chiều dài. Có lẽ một sai lầm của OP? –

4

Các chuỗi này được mã hóa bằng cách sử dụng base64, = ký tự được sử dụng làm đệm, để làm cho khối cuối cùng của chuỗi base64 chứa bốn ký tự.


Các mã Ruby sau đây có thể được sử dụng để có được base64 giải mã chuỗi:

require 'base64' 

s = "tINH0JxmryvB6pRkEii1iBYP7FRedDqIEs0Ppbw83oc=" 
puts Base64.decode64(s).bytes.map{|e| '%02x' % e}.join 

Output: b48347d09c66af2bc1ea94641228b588160fec545e743a8812cd0fa5bc3cde87

Các vấn đề liên quan