2011년 8월 29일 월요일

JAVA - PHP 간 AES encryption 데이터 송수신에서 패딩으로 망하기

자바에서 encryption한 데이터를 php로 전달했을 때 패딩에 의해서 문제가 생길 수 있다.

AES 등의 암호화 알고리듬은 데이터를 특정 사이즈의 블록 단위로 암호화한다. 예를 들어서 블록의 사이즈가 32kb인데 암호화하려는 스트링은 50kb라면, 32kb * 2 = 64kb를 맞추도록 뒷부분을 패딩으로 채워넣는다.

이 패딩 방식이 php는 null 패딩이며, 자바의 경우에는 몇 가지 패딩 방식을 지원하지만 php의 null 패딩은 포함되지 않는다. 결론은


1. 자바에서 직접 null padding을 구현하거나
2. php에서 PKCS5 패딩을 제거하거나.


1의 경우에 사용 알고리듬에 따라서 사이즈가 딱 맞는 블록을 어레이로 선언하고 나머지를 null값으로 채워주면 되겠고, 후자의 경우에

<?php
$decrypted = mdecrypt_generic($td, base64_decode($enc_auth_token));
$dec_s = strlen($decrypted);
$padding = ord($decrypted[$dec_s-1]);
$decrypted = substr($decrypted, 0, -$padding);
?>


처럼 처리해 주면 될 것이다.

2011년 8월 18일 목요일

sqlite3에서 vacuum으로 rowid 말아먹기

sqlite3에서는 rowid라는 컬럼이 int형의 primary key로 존재하는 것이 보장되어 있다. 문제는 vacuum시켰을 때 rowid의 값이 sqlite3에 의해서 임의로 재지정될 수 있다는 점이다.

따라서 MySQL로 치면 autoincrement, int형 PK를 안정적으로 쓰기 위해서는 rowid의 이름을 수동으로 직접 지정해줄 필요가 있다. 안드로이드에서 쓸 거면 어차피 _id로 고정일테니 크게 고민할 거리도 안 될 것이다.

2011년 8월 2일 화요일

jqgrid - 데이터 받아오기

자바스크립트가 url로 날리는 리퀘스트를 잘 정리한 페이지가 없음.



name
내용
page돌려받고자 하는 페이지
rows페이지 당 몇 행인지
sidx소팅하는 기준이 되는 인덱스
sord내림차순(desc) or 오름차순(asc) 쿼리문에 직접 삽입 가능함


대신 다음과 같은 php 코드를 예제로 보여주고 있음. 나는 post를 선호하지만 그건 각자 알아서;;
<전략>
// Get the requested page. By default grid sets this to 1.
$page = $_GET['page'];

// get how many rows we want to have into the grid - rowNum parameter in the grid
$limit = $_GET['rows'];

// get index row - i.e. user click to sort. At first time sortname parameter -
// after that the index from colModel
$sidx = $_GET['sidx'];

// sorting order - at first time sortorder
$sord = $_GET['sord'];

// if we not pass at first time index use the first column for the index or what you want
if(!$sidx) $sidx =1;

전체 예제코드는 여기.



데이터 수정시 서버에 날리는 request가 정리된 페이지가 없음



name 내용
name:value pair 이름:값의 짝들. colModel에서 설정한 name
id:rowid id로 설정된 값. 대개의 경우에는 pk일 것이다.
oper:edit(add|del) 데이터 변경 종류. 수정, 추가, 삭제
editData return
onclickSubmit return

구글 앱스 스크립트용 GUI 빌더





자바 스크립트로 이런 짓까지 하는 녀석들은 구글 외에는 없겠지;;


2011년 7월 28일 목요일

Blogger에 +1 버튼 추가하기 howto

이론 없이 블라인드 카피하려는 분들을 위한 문서입니다.
작동을 보장하는 것은 블로거 기본 테마 사용자 분들에 한합니다.

1. 디자인에 삽입할 소스코드를 얻습니다.


에 가서 버튼 사이즈, 언어 등을 선택합니다. 그럼 하단에 소스코드가 그에 맞춰서 생성됩니다.


소스코드는 두 부분으로 나누어집니다. 하나는 어딘가 적당히-_-삽입하면 되는 부분이고, 다른 하나는 버튼을 붙이려는 장소에 맞춰서 삽입해 주어야 하는 부분입니다.


1. 적당히 삽입하면 되는 부분

이하의 코드를 적당히 삽입하면 됩니다.

========
<!-- 아래 태그를 헤더나 </body> 태그 앞에 붙여 넣습니다. -->
<script type="text/javascript" src="https://apis.google.com/js/plusone.js">
{lang: 'ko'}
</script>
========

여기서 적당한 부분으로는 헤더나 바로 앞을 말합니다. 이 글에서는 </body>앞을 택하겠습니다.

블로거 대쉬보드에서

디자인 -> html편집 -> "가젯코드 펼쳐서 보여주기 체크" -> 최하단의 </body>태그 직전에 위의 코드 삽입



2. 버튼을 나타낼 부분에 코드 삽입하기.

여기서는 적당하게 하면 안 됩니다. 위에서 부주의하게 "가젯코드 펼쳐서 보여주기 체크를 하지 않으셨다면, 1로 돌아가서 처음부터 다시 하셔야 합니다.

찾아야 하는 구절은
===========
<data:post.body/>
===========
입니다.

이 바로 아래에
===========
<!-- 아래 태그를 +1 버튼을 렌더링하고자 하는 위치에 붙여 넣습니다. -->
<g:plusone expr:href="data:post.url"></g:plusone>
===========
를 넣읍시다.

그리고 "스킨 저장" 버튼을 눌러 저장하고 나면 이 블로그처럼 포스팅 아래에 +1 버튼이 나타납니다.


문서에 대한 피드백은 답글로 남겨주세요.

2011년 7월 25일 월요일

jqGrid, loadonce 옵션 때문에 망한 경험담

loadonce 옵션을 false로 줄 때

auto-increment int인 PK를 가지는 테이블일 때, loadonce:false 상태에서 새로운 row를 등록하면 PK를 제대로 잡지 못한 상태가 된다.


새로운 row 등록 -> 서버쪽에서 PK 생성 -> loadonce:true라서 서버사이드에서 피드백 오지 않음 -> 클라이언트에서는 새로운 데이터에 지맘대로 PK 설정.


이 상태에서 새로 등록된 데이터를 수정하면 지맘대로 설정한 PK값을 가지고 있는 기존 row를 오염시킨다.





loadonce:true로 줄 때

jqGrid에 채우는 데이터가 DB에서 JOIN을 많이 사용한 쿼리문을 통해서 만들어졌을 경우 검색이 제대로 돌아가게 만들기가 만만치 않다.




이 둘 사이에 끼어서 고생 좀 한 적이 있음.

2011년 7월 20일 수요일

Fedora 15에서 PostgreSQL, phpPgAdmin 설치 및 설정

아주 초심자용 문서는 아니다. 기본적인 페도라 관리가 가능하고 SQL에 대해서 어느 정도의 이해가 있어야 한다.

yum으로 설치해야 하는 패키지 목록 : postgresql, postgresql-libs, postgresql-server

1. 설정
최초 설정의 문제는 다음과 같다.
  1. 사용자 : postgres라는 수퍼유저만 존재.
  2. 인증방식 : 시스템 아이디와 postgresql에서의 role이 동일한지 확인하는 방식으로 인증
  3. phpPgAdmin 설정 : 안 되어 있음.
  4. postgresql 서버 구동 되어있지 않음.

다시 말해서, yum 설치 직후 postgresql에는 postgres라는 사용자만 등록되어 있으며, 이 사용자로 postgresql에 접속하기 위해서는 (psql이라는 명령어를 사용한다.) 시스템에도 postgres로 로긴되어 있어야 한다. 또한 접속하기 위한 서버가 실행되지도 않았다.

각각을 해결하는 방법은 다음과 같다.

1. 계정(role)이 postgres뿐.

su
<암호입력>
su postgres

이제 postgres계정으로 시스템에 로긴한 상태가 될 것이다. 이 상태에서

createuser <새 유저 아이디(role)> -P

-P는 유저등록과 함께 패스워드를 설정하겠다는 옵션이다.
superuser인지, DB생성을 허용할지, Role생성을 허용할지 등을 묻는다.


여기까지 성공했으면 이제 psql에는 사용자(role)가 두 명이다. postgres와 방금전에 생성한 아이디까지 두 명의 사용자가 된다. 만약에 위에서 createuser로 생성한 postgresql role과 같은 아이디가 시스템에도 있다면, 시스템에서 그 아이디로 로긴되어 있는 동안 psql로 접속할 수 있다.


2. 로긴 방식이 시스템 id == postgresql role

phpPgAdmin은 id/password를 통하여 postgresql에 접근하려고 한다. 그런데 기본 설정은 시스템id와 일치하는 postgresql role이 존재하는지 확인하여 이 아이디로 로긴시키는 것이다. 이것을 수정해주기 위해서는 /var/lib/pgsql/data/pg_hba.conf 라는 파일을 수정하면 된다.

local all all ident sameuser에서 ident sameuser를 md5로 바꿔주면 된다.


3. /etc/phpPgAdmin/config.inc.php-dist를 /etc/phpPgAdmin/config.inc.php로 복사.


4. 루트 권한으로 (sudo, su -c 등은 개인 취향) service postgresql initdb, service postgresql restart 등.