--- title: nsICryptoHash slug: nsICryptoHash tags: - Add-ons - Extensions - Interfaces - 'Interfaces:Scriptable' translation_of: Mozilla/Tech/XPCOM/Reference/Interface/nsICryptoHash ---
nsICryptoHash
는 자료의 암호 해쉬 함수를 계산하기 위해 사용합니다. 예를 들어 파일이 담고 있는 데이터가 기대한 것인지 확인하기 위해 MD5 해쉬를 계산할 수 있습니다. 제공되는 해쉬 알고리즘은 MD2, MD5, SHA-1, SHA-256, SHA-384, SHA-512입니다. 이 인터페이스는 파이어폭스 1.5 버전 이상에서만 사용할 수 있습니다.
이 상수들은 인터페이스가 제공하는 해쉬 알고리즘을 나타냅니다. 사용가능한 것은 다음과 같습니다. :
MD2
MD5
SHA1
SHA512
SHA256
SHA384
void init(in unsigned long aAlgorithm);
init()
는 인터페이스에 정의된 상수를 이용하여 해쉬 알고리즘을 결정하여 객체를 초기화합니다. 객체의 자료를 갱신하기 전에 반드시 이 메서드나 initWithString()
를 호출해야 합니다.
aAlgorithm
NS_ERROR_INVALID_ARG
void initWithString(in ACString aAlgorithm);
initWithString()
는 "MD5"
와 같이 문자열로 된 알고리즘의 이름으로 해쉬 알고리즘을 선택하여 객체를 초기화한다. 객체의 자료를 갱신하기 전에 반드시 이 메서드나 init()
를 호출해야 합니다.
aAlgorithm
NS_ERROR_INVALID_ARG
void update([const, array, size_is(aLen)] in octet aData, in unsigned long aLen);
update()
는 해쉬된 자료 배열을 객체에 추가합니다. 이 메서드 사용 예제는 문자열 해쉬 연산하기를 보세요.
aData
aLen
aData
의 길이NS_ERROR_NOT_INITIALIZED
init()
나 initWithString()
가 호출되지 않았다는 것을 알립니다.void updateFromStream(in nsIInputStream aStream, in unsigned long aLen);
updateFromStream()
는 nsIInputStream
로 해쉬될 데이터를 추가합니다. 이 메서드의 사용 예제는 파일 해쉬 연산하기를 보세요.
aStream
aLen
aStream
으로 부터 읽을 양을 결정합니다. 해쉬 갱신할 수 있는 최대 양으로 지정하려면 PR_UINT32_MAX
를 전달하면 됩니다.NS_ERROR_NOT_INITIALIZED
init()
나 initWithString()
가 호출되지 않았다는 것을 알립니다.NS_ERROR_NOT_AVAILABLE
ACString finish(in PRBool aASCII);
finish()
메서드는 해쉬 객체를 완성시켜 실제 해쉬 자료를 생성합니다.
aASCII
이 메서드는 객체가 읽은 자료의 해쉬를 반환합니다. 이 반환 값은 이진 자료일 수 있고 base 64 인코딩된 문자열일 수 있습니다.
NS_ERROR_NOT_INITIALIZED
init()
나 initWithString()
가 호출되지 않았다는 것을 알립니다.init()
가 호출된 후로 수회 실행이 가능합니다. 이 호출은 객체를 초기상태로 만듭니다.nsICryptoHash
를 사용하여 파일 해쉬 연산을 쉽게할 수 있습니다. nsICryptoHash
인스턴스를 생성하고 파일을 입력 스트림으로 열고 파일의 자료로 해쉬를 갱신하길 원할 겁니다. 아래의 예제가 파일 MD5 해쉬 연산을 어떻게 하는지 보여줍니다.
// hardcoded here for convenience var path = "c:\\windows\\notepad.exe"; var f = Components.classes["@mozilla.org/file/local;1"] .createInstance(Components.interfaces.nsILocalFile); f.initWithPath(path); var istream = Components.classes["@mozilla.org/network/file-input-stream;1"] .createInstance(Components.interfaces.nsIFileInputStream); // open for reading istream.init(f, 0x01, 0444, 0); var ch = Components.classes["@mozilla.org/security/hash;1"] .createInstance(Components.interfaces.nsICryptoHash); // we want to use the MD5 algorithm ch.init(ch.MD5); // this tells updateFromStream to read the entire file const PR_UINT32_MAX = 0xffffffff; ch.updateFromStream(istream, PR_UINT32_MAX); // pass false here to get binary data back var hash = ch.finish(false); // return the two-digit hexadecimal code for a byte function toHexString(charCode) { return ("0" + charCode.toString(16)).slice(-2); } // convert the binary hash data to a hex string. var s = Array.from(hash, (c, i) => toHexString(hash.charCodeAt(i))).join(""); // s now contains your hash in hex
내 윈도우즈 XP SP2 시스템에서 해쉬 값으로 5eb63bbbe01eeed093cb22bb8f5acdc3
를 주었지만 여러분의 경우는 수가 다를 수 있습니다. 이 간단한 예제는 인터페이스의 기능을 대부분 보여줍니다.
첫번째로 주목할 부분은 init()
메서드를 호출할 때 해쉬 알고리즘을 결정하는 것입니다. 가능한 모든 올고리즘은 인터페이스의 상수에 규정되어 있습니다.
또 주목할 곳은 updateFromStream()
메서드를 호출할 때 두번째 패러미터가 읽어들일 바이트 수라는 것입니다. 여기에 PR_UINT32_MAX
를 보내면 전체 파일을 읽길 원한다고 지시하는 겁니다.
마지막으로 finish()
메서드 호출이 해쉬 값을 생성하는 것입니다. 예제처럼 첫번째 패러미터가 false
이면 이진 값을 반환합니다. true
를 보내면 해쉬 값은 base 64 인코딩된 문자열로 옵니다. 이 예제에서 해쉬 프로그램에 의해 이진 자료를 입력하고 그 결과로 기본 출력인 16진 문자열을 얻습니다.
또다른 기본 연산은 문자열 해쉬 값을 연산하는 것입니다. 해쉬 함수가 여러 바이트를 연산하기 때문에 먼저 문자열을 nsIScriptableUnicodeConverter
를 사용하여 바이트의 순열로 바꾸고 원하는 유니코드 인코딩으로 바꿔야 합니다.
아래의 예제는 문자열을 UTF-8 인코딩의 바이트로 바꾸고 MD5 해쉬 값을 계산하는 방법을 보여줍니다. 결과 값은 이전 예제 처럼 16진 문자열입니다.
var str = "hello world"; var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]. createInstance(Components.interfaces.nsIScriptableUnicodeConverter); // we use UTF-8 here, you can choose other encodings. converter.charset = "UTF-8"; // result is an out parameter, // result.value will contain the array length var result = {}; // data is an array of bytes var data = converter.convertToByteArray(str, result); var ch = Components.classes["@mozilla.org/security/hash;1"] .createInstance(Components.interfaces.nsICryptoHash); ch.init(ch.MD5); ch.update(data, data.length); var hash = ch.finish(false); // return the two-digit hexadecimal code for a byte function toHexString(charCode) { return ("0" + charCode.toString(16)).slice(-2); } // convert the binary hash data to a hex string. var s = Array.from(hash, (c, i) => toHexString(hash.charCodeAt(i))).join(""); // s now contains your hash in hex: should be // 5eb63bbbe01eeed093cb22bb8f5acdc3
이 예제에서 해쉬 배열을 보내기 위해 update()
메서드를 씁니다. 이전 예제처럼 이진 결과를 16진 문자열로 변경했습니다.