目的
我有一个需要sha1密码的外部Web服务,但它使用ISO8859-1 charset密码存储它。例如,密码é
存储为:
1599e9fa41ec68c80230491902786bee889f5bcb
(这是iso中é
的sha1哈希值。
但是,我的应用发送的是以下哈希:
bf15be717ac1b080b4f1c456692825891ff5073d (the sha1 hash for 'é' password in utf8)
所以没有办法改变这种行为: - (
问题
我想要做的是将输入的密码从utf8转换为iso8859-1 这是我使用的代码:
var buffer = Ti.createBuffer({length: 250});
var length = Ti.Codec.encodeString({
source: 'é',
dest: buffer,
charset: Ti.Codec.CHARSET_ISO_LATIN_1
};
buffer.length = length;
var str = Titanium.Utils.sha1(buffer.toBlob());
alert(str);
这显示以下sha1:“da39a3ee5 ...”,这是空字符串的sha1。 使用'e'作为源的相同代码显示“58e6b3a ...”,这是'e'的sha1
有没有人知道我做错了什么或我怎么能做对吗?
答案 0 :(得分:1)
您好我遇到了类似的问题,发现参数'类型'在Ti.Codec.encodeString()函数中解决了我的问题。
在我的情况下,我使用了ISO-8859-1(LATIN_1)和SHA256。通过添加参数'类型',HASH SHA256是预期的。所以波纹管代码对我有用:
var myString = "é";
var bytesTotal = myString.length;
var myBuffer = Ti.createBuffer({
length : bytesTotal
});
var numLen = Ti.Codec.encodeString({
source : myString,
dest : myBuffer,
type : Ti.Codec.TYPE_BYTE,
charset : Ti.Codec.CHARSET_ISO_LATIN_1
});
var strSHA256 = Ti.Utils.sha256(myBuffer.toBlob());
我认为对于您的代码,您应该使用函数' sha1()'代替。
更新的答案!!!
@Guile警告我,上面的代码适用于Android,但不适用于iOS。
我调查了一点,我发现问题在iOS中运行:
var myString = "é";
var bytesTotal = myString.length;
var numLen = Ti.Codec.encodeString({
source : myString,
dest : myBuffer,
type : Ti.Codec.TYPE_BYTE,
charset : Ti.Codec.CHARSET_ISO_LATIN_1
});
在上面的代码中,如果你检查' myBuffer'中的字节。这将是LATIN_1(ISO-8859-1)的预期。
myBuffer.toBlob()
但是当它转换为Blob时,我们遇到了问题。如果你使用' myBuffer.toBlob()。text'将生成UTF-8字符串并发生某种错误,因为输出字符串为空""。
可能与LATIN_1缓冲区转换为UTF-8有关。
好吧,我们需要转换为blob,因为Ti.Utils.sha256()需要一个字符串参数(以UTF8表示)或一个Blob参数。
我们无法使用对象' myBuffer'直接在函数sha256()中,因为它不接受Titanium.Buffer类型的参数。
所以我的解决方案是找到Ti.Utils.sha256()
函数的替代方法var hash = CryptoJS.SHA256(CryptoJS.enc.Latin1.parse("é"));
alert(hash.toString(CryptoJS.enc.Hex));
您可以在此处找到CryptoJS代码: https://code.google.com/p/crypto-js/
我刚刚下载了文件' CryptoJS v3.1.2.zip'在上面的链接。提取,复制并粘贴文件的代码'汇总/ sha256.js'。
适用于Android设备和iOS模拟器。
正如我之前所说,如果你使用sha1()函数(文件'汇总/ sha1.js'),它可能适合你。