我有一个数据库,密码用SHA1加密,我需要将它们转换为SHA1二进制形式,并用base64编码,我如何获得它?
这就是我所拥有的:
# echo -n "password" | openssl sha1
5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8
这就是我需要的:
# echo -n "password" | openssl sha1 -binary | base64
W6ph5Mm5Pz8GgiULbPgzG37mj9g=
require 'digest/sha1'
require 'base64'
Base64.encode64(Digest::SHA1.digest('password'))
# => "W6ph5Mm5Pz8GgiULbPgzG37mj9g=n"
这增加了一个新行,所以你可能需要使用
Base64.encode64(Digest::SHA1.digest('password')).chop
# => "W6ph5Mm5Pz8GgiULbPgzG37mj9g="
或者更简单,正如@FrederickCheung
所建议的:
Digest::SHA1.base64digest('password')
编辑
当您只有SHA-1编码密码的十六进制字符串时,请执行
require 'base64'
pass = "5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8"
Base64.encode64([pass].pack('H*')).chop
# => "W6ph5Mm5Pz8GgiULbPgzG37mj9g="
或者你甚至可以绕过base64
库,只依赖pack
:
[[pass].pack('H*')].pack('m0')
# => "W6ph5Mm5Pz8GgiULbPgzG37mj9g="
Python 3方法:
import sys, base64
def hex_to_b64(word):
number = int(word, base=16)
bytestr = number.to_bytes(20, 'big')
b64 = base64.b64encode(bytestr).decode('ascii')
return b64
if __name__ == '__main__':
for word in sys.argv[1:]:
print(hex_to_b64(word))
它给出
localhost-2:coding $ python3 shaswitch.py 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8
W6ph5Mm5Pz8GgiULbPgzG37mj9g=
为什么要求助于python;OP通缉令:
% openssl sha1 -binary <(echo -n 'password') | base64
W6ph5Mm5Pz8GgiULbPgzG37mj9g=