Character encoding 将字符串转换为ISO8859-1
目的 我有一个需要sha1密码的外部Web服务,但它使用ISO8859-1字符集密码存储它。例如,密码Character encoding 将字符串转换为ISO8859-1,character-encoding,titanium,iso-8859-1,Character Encoding,Titanium,Iso 8859 1,目的 我有一个需要sha1密码的外部Web服务,但它使用ISO8859-1字符集密码存储它。例如,密码é存储为: 1599e9fa41ec68c80230491902786bee889f5bcb(这是iso中的sha1散列) 但是,我的应用程序发送的是以下哈希: bf15be717ac1b080b4f1c456692825891ff5073d (the sha1 hash for 'é' password in utf8) 因此,无法改变这种行为:-( 问题 我要做的是将键入的密码从utf8转
é
存储为:
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
有人知道我做错了什么,或者我怎样才能做对吗?嗨,我遇到了一个类似的问题,发现Ti.Codec.encodeString()函数中的参数“type”解决了我的问题
在我的例子中,我使用了ISO-8859-1(拉丁文_1)和SHA256。通过添加参数“type”,哈希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”中的字节,它将是拉丁字母1(ISO-8859-1)的预期值
但是当它被转换成Blob时,我们遇到了一个问题。如果您使用“myBuffer.toBlob().text”将生成一个UTF-8字符串,并且会发生某种错误,因为输出字符串为空“”
可能与转换为UTF-8的拉丁语_1缓冲区有关
我们需要转换为blob,因为Ti.Utils.sha256()需要一个字符串参数(在UTF8中)或blob参数
我们不能在函数sha256()中直接使用对象“myBuffer”,因为它不接受Tianium.Buffer类型的参数
因此,我的解决方案是找到函数Ti.Utils.sha256()的替代方法
您可以在此处找到CryptoJS代码:
我刚刚在上面的链接中下载了文件“CryptoJS v3.1.2.zip”。将其解压缩,复制并粘贴了文件“rollups/sha256.js”的代码
它在Android设备和iOS模拟器上运行
正如我之前所说,如果您使用sha1()函数(文件'rollups/sha1.js')谢谢,但是这里的算法似乎没有问题。通过一些更精确的测试,我发现您的代码可以在android上运行,而不是在iOS上运行。。。
myBuffer.toBlob()
var hash = CryptoJS.SHA256(CryptoJS.enc.Latin1.parse("é"));
alert(hash.toString(CryptoJS.enc.Hex));