我正在尝试在我正在使用的Common Lisp应用程序中散列一些字符串.sd-sha1包似乎不受支持,并且已经有一段时间由CLiki页面判断,这建议使用Ironclad.很公平,
=> (require 'ironclad)
NIL
Run Code Online (Sandbox Code Playgroud)
Ironclad虽然不做字符串摘要; 这是在其项目页面上声明的有意设计选择,我应该做的是将我的字符串转换为字节字符串并哈希.换一种说法
=> (ironclad:digest-sequence
:sha1 (flexi-streams:string-to-octets "Hello there"))
#(114 108 118 85 62 26 63 222 162 145 52 243 110 106 242 234 5 236 92 206)
Run Code Online (Sandbox Code Playgroud)
好吧,现在的问题是,整个练习的要点是找出原始字符串输入的sha1-hashed字符串,这意味着我真的想将上面的字符串转换为字符串格式.但,
=> (flexi-streams:octets-to-string
(ironclad:digest-sequence
:sha1 (flexi-streams:string-to-octets "Hello there"))
:external-format :utf-8)
This sequence can't be decoded using UTF-8 as it is too short.
1 octet missing at then end.
[Condition of type FLEXI-STREAMS:EXTERNAL-FORMAT-ENCODING-ERROR]
Restarts:
0: [ABORT] Exit debugger, returning to top level.
Run Code Online (Sandbox Code Playgroud)
另一种选择是flexi-streams推断正确的编码.
=> (flexi-streams:octets-to-string …Run Code Online (Sandbox Code Playgroud) 我的问题上下文:Linode KVM实例上的Fedora 22 64位,CouchDB v.1.6.1,SBCL 1.2.16
CouchDB:我用密码创建了一个用户"testpass"._users数据库中相应的创建文档包含(以及其他内容):
{ ...
"password_scheme": "pbkdf2",
"iterations": 10,
"name": "test",
"roles": ["reader"],
"type": "user",
"derived_key": "7b0cad0d2762b448b88684332e68988e801195ad",
"salt": "2e4bcf85f39279ab9d1e1336a00dce0e"
...}
Run Code Online (Sandbox Code Playgroud)
所以我在同一台机器上的lisp repl中做了:
REPL>(in-package :ironclad)
REPL>(byte-array-to-hex-string
(pbkdf2-hash-password
(ascii-string-to-byte-array "testpass")
:salt (hex-string-to-byte-array "2e4bcf85f39279ab9d1e1336a00dce0e")
:digest 'sha1
:iterations 10))
"ce55610fe10bc49703f0df95adb6c9c9c71e3f8e"
REPL>
Run Code Online (Sandbox Code Playgroud)
因此"ce55610fe10bc49703f0df95adb6c9c9c71e3f8e"铁甲的输出与"7b0cad0d2762b448b88684332e68988e801195ad"沙发不匹配.
我已经尝试了所有支持的摘要,但没有运气.有没有人对什么可能是错的有任何想法?