Nodejs 암호화 형식 스크립트 파일
나는 암호화를 필요로 하고 암호화를 사용하는 두 가지 함수를 내보내는 나만의 hash.js 파일을 만들었습니다.내가 비밀번호를 해시할 때 내 api.js 파일에서 잘 작동합니다.하지만 지금은 암호 자체 대신 해시된 버전의 암호를 쿼리 매개 변수로 보낼 수 있도록 user.service.ts 파일로 이 파일을 가져오려고 합니다.그렇게 하려고 하면 항상 TypeScript 오류가 발생하여 crypto에서 사용하는 함수가 함수가 아니라는 것을 알려줍니다.그러나 가져온 개체를 콘솔 로그로 기록할 수 있으며 합법적으로 보입니다.node_modules 폴더에서 다른 자바 스크립트 파일을 봤는데 파일에 문제가 있을 만한 내용이 보이지 않습니다.
또한 생성해야 할 정의 파일이 있는 것 같지만 이러한 파일을 생성하려고 여러 번 시도했지만 아무 것도 작동하지 않는 것 같습니다.
몇 시간 동안의 구글링과 이 프로젝트에 대한 시간 부족으로 인해 저는 이 게시물을 보게 되었습니다. 이 게시물은 저의 첫 번째 스택 오버플로 게시물입니다. 저는 이 게시물이 너무 명확하지 않기를 바라며 이 문제를 해결하는 데 필요한 정보를 제공하게 되어 기쁩니다.
LoginComponent.html:18 ERROR TypeError: crypto.randomBytes is not a function
at Object.genRandomString (hash.js:12)
at UserService.loginUser (user.service.ts:82)
at LoginComponent.getUser (login.component.ts:54)
at LoginComponent.onSubmit (login.component.ts:44)
at Object.eval [as handleEvent] (LoginComponent.html:18)
at handleEvent (core.es5.js:12014)
at callWithDebugContext (core.es5.js:13475)
at Object.debugHandleEvent [as handleEvent] (core.es5.js:13063)
at dispatchEvent (core.es5.js:8607)
at core.es5.js:10775
LoginComponent.html:18 ERROR CONTEXT DebugContext_ {view: {…}, nodeIndex: 31, nodeDef: {…}, elDef: {…}, elView: {…}}
hash.js 파일
'use strict';
var crypto = require('crypto');
/**
* generates random string of characters i.e salt
* @function
* @param {number} length - Length of the random string.
*/
function genRandomString (length){
return crypto.randomBytes(Math.ceil(length/2))
.toString('hex') /** convert to hexadecimal format */
.slice(0,length); /** return required number of characters */
};
/**
* hash password with sha512.
* @function
* @param {string} password - List of required fields.
* @param {string} salt - Data to be validated.
*/
function sha512(password, salt){
var hash = crypto.createHmac('sha512', salt); /** Hashing algorithm sha512 */
hash.update(password);
var value = hash.digest('hex');
return {
salt:salt,
passwordHash:value
};
};
module.exports = {
genRandomString: genRandomString,
sha512: sha512
};
JavaScript와 TypeScript를 혼합하는 데 약간의 혼란이 있는 것 같습니다만, 제가 직접 이 문제를 접했기 때문에, 제가 어떻게 해결했는지에 대해 말씀드리겠습니다.
먼저 hash.js 파일은 hash.ts여야 합니다.그러면 암호화를 가져와서 정상적으로 사용할 수 있습니다.아래 관련 코드:
import * as crypto from "crypto";
public setEncryptionKeyDES(sKey: string) {
const desIV = Buffer.alloc(8);
this.encLobby.cipher = crypto.createCipheriv(
"des-cbc",
Buffer.from(sKey, "hex"),
desIV,
);
this.encLobby.cipher.setAutoPadding(false);
this.encLobby.decipher = crypto.createDecipheriv(
"des-cbc",
Buffer.from(sKey, "hex"),
desIV,
);
this.encLobby.decipher.setAutoPadding(false);
this.isSetupComplete = true;
}
편집1: 아래에서 @attdona의 답변을 추가하는 중, 반드시 설치하세요.@types/node
그렇지 않으면 노드 모듈을 찾을 수 없는 것과 관련된 오류가 많이 발생합니다.
방금 이 문제를 해결했습니다(노드 v13.12.0, tsc v3.8.3).내 경우 가져오기:
import * as crypto from "crypto";
다음과 같은 오류가 표시됩니다.
error TS2307: Cannot find module 'crypto'
노드에 대한 유형 정의를 설치해야 하기 때문입니다. 암호화 환경 선언이 포함되어 있습니다.
npm install @types/node
참고: 의 글로벌 설치가 있는 경우@types/node
그런 다음 당신은 명시적으로 경로를 선언해야 합니다.@types
위치:--typesRoot
선택.자세한 내용은 여기를 참조하십시오.
그렇게 하려고 하면 항상 TypeScript 오류가 발생하여 crypto에서 사용하는 함수가 함수가 아니라는 것을 알려줍니다.
이는 TypeScript가 정적으로 파일을 분석하고 작업 중인 데이터 유형을 지원하기 때문입니다.만약 당신이 이 함수가 인수로 사용하는 것과 반환 값의 유형에 대해 TypeScript에 아무런 힌트도 없이 JavaScript로 작성된 함수를 사용한다면, 그것은 단순히 그것의 일을 할 수 없기 때문에 당신은 오류가 발생하는 것입니다.
데칼레이션 파일을 만들 수 있지만, 빠른 수정을 원하는 경우 및 다른 파일에서 이러한 원시 JS 함수를 사용하지 않을 경우에는 그럴 필요가 없습니다.파일의 아무 곳에나 선언하면 됩니다.TypeScript에서 키워드 사용에 대한 자세한 내용을 읽을 수 있습니다.
그러나 가져온 개체를 콘솔 로그로 기록할 수 있으며 합법적으로 보입니다.
당신의 스크린샷으로 판단하건대, 그 기능은randomBytes
는 올바르게 호출됩니다(오류 아래에 인쇄된 스택 추적에서 알 수 있음).문제는 그것이crypto
에 개에 이지정메없습라는 .randomBytes
는 는이유 때문입니다.crypto
는 최신 브라우저의 글로벌 개체입니다.
당신의.crypto.js
파일은 아마도 다른 존재를 가정하고 있을 것입니다.crypto
브라우저에 있는 개체보다 전역 개체입니다.함수가 볼 수 있도록 이 개체를 적절한 범위로 제공하거나 롤업과 같은 번들러를 사용하여 해당 함수를 인라인으로 연결합니다.
이것은 꽤 끔찍한 토끼굴로 밝혀졌습니다.저는 많은 권장 제안을 따랐지만, 결국 제게 효과적인 해결책은 (언제나 그랬듯이) 아주 단순한 방법이었습니다.
정답은 브라우저 내장 암호화 기능을 사용하는 것이었습니다.저는 매우 가벼운 앱에 충분할 정도로 암호의 단방향 다이제스트를 확인하고 싶었습니다.그러나 대부분의 가이드는 부분적인 제안일 뿐이거나 Angular 7과 babel을 사용하는 앱의 설정과 함께 작동하지 않았습니다.여기 제가 마지막으로 작성한 코드가 있습니다. 다음과 같은 참고 사항이 있습니다.
- 다이제스트를 수행하려면 어레이 버퍼로 인코딩해야 합니다.
- 다이제스트 함수가 약속을 반환하는 중이므로 .then을 사용하여 값의 포장을 해제해야 했습니다.
- NPM 모듈 또는 가져오기를 추가할 필요가 없습니다.
어쨌든 여기 코드가 있습니다. 다른 스택 오버플로에 도움이 되기를 바랍니다.
또한 Daniel Roesler의 Github 페이지는 다양한 웹 암호화 예제 구현에 매우 유용하다는 것을 알게 되었습니다.
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-user-create',
templateUrl: './user-create.component.html',
styleUrls: ['./user-create.component.css']
})
export class UserCreateComponent implements OnInit {
constructor() { }
ngOnInit() {
sha256("hello").then(digestValue => {
console.log(digestValue);
});
}
}
async function sha256(str) {
const encoder = new TextEncoder();
const encdata = encoder.encode(str);
const buf = await crypto.subtle.digest("SHA-256", encdata);
return Array.prototype.map.call(new Uint8Array(buf), x=>(('00'+x.toString(16)).slice(-2))).join('');
}
언급URL : https://stackoverflow.com/questions/48094647/nodejs-crypto-in-typescript-file
'programing' 카테고리의 다른 글
날짜 시간.구문 분석("2012-09-30")T23:00:00.0000000Z")는 항상 DateTimeKind로 변환됩니다.현지의 (0) | 2023.06.11 |
---|---|
R의 적용 가족은 통사적인 설탕 이상입니까? (0) | 2023.06.11 |
firebase-tools "-firebase: firebase: 명령을 찾을 수 없습니다." (0) | 2023.06.06 |
스파크에서 정보 로깅을 해제하는 방법은 무엇입니까? (0) | 2023.06.06 |
디버그 모드에서 새 Firebase Crashlytics 사용 안 함 (0) | 2023.06.06 |